Commit d503053d by Sebastian Renner

GCM which generates super weired TV

parent f68f7f7e
CC=gcc CC=gcc
CFLAGS=-c -Wall NISTGCCFLAGS=-std=c99 -Wall -Wextra -Wshadow -O2
LDFLAGS= LFLAGS=-lm
SOURCES=aes.c cipher.c cipher_wrap.c gcm.c main.c platform.c platform_util.c
OBJECTS=$(SOURCES:.c=.o)
EXECUTABLE=gcm
all: $(SOURCES) $(EXECUTABLE) all: gcm
$(EXECUTABLE): $(OBJECTS) gcm: genkat_aead.c aes.c cipher.c cipher_wrap.c gcm.c platform.c platform_util.c
$(CC) $(LDFLAGS) $(OBJECTS) -o $@ $(CC) $(NISTGCCFLAGS) -o $@ $^ $(LFLAGS)
.cpp.o: .PHONY: clean
$(CC) $(CFLAGS) $< -o $@
clean: clean:
rm -rf *.o out rm -rf gcm
#include "gcm.h"
#include "platform_util.h"
#include "api.h"
#include <stdio.h>
#include "crypto_aead.h"
static void single_encryption(void) {
// 32 bytes.. that's 256 bits
const unsigned char k[32] = { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08 };
unsigned char c[64] = { 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24,
0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c,
0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0,
0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e,
0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c,
0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05,
0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97,
0x3d, 0x58, 0xe0, 0x91, 0x47, 0x3f, 0x59, 0x85};
unsigned char npub[12] = { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad,
0xde, 0xca, 0xf8, 0x88 };
unsigned char ad[1400];
unsigned long long adlen = 0;
unsigned long long mlen = 0;
unsigned long long clen = 64;
unsigned char m[1400];
unsigned char nsec[CRYPTO_NSECBYTES];
//mbedtls_gcm_init( &ctx );
// 128 bits, not bytes!
//ret = mbedtls_gcm_setkey( &ctx, cipher, key, 128 );
// Context, flag (1/0), length, nonce, nonce_len, AD, AD_len, PT, output, tag_len, tag
//ret = mbedtls_gcm_crypt_and_tag(&ctx, MBEDTLS_GCM_ENCRYPT, 64, initial_value, 12, additional, 0, plaintext, buf, 16, tag_buf);
//mbedtls_gcm_free( &ctx );
int res;
res = crypto_aead_decrypt(m, mlen, nsec, c, clen, ad, adlen, npub, k);
if (res == 0) {
printf("Local decryption test workerino!\n");
} else {
printf("Local test failed -.-\n");
}
}
int main(void) {
//mbedtls_gcm_self_test(1);
single_encryption();
return 0;
}
#include "gcm.h"
#include "platform_util.h"
#include "api.h"
#include <stdio.h>
#include "crypto_aead.h"
static void single_encryption(void) {
// 32 bytes.. that's 256 bits
const unsigned char k[32] = { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08 };
unsigned char m[64] = { 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55 };
unsigned char npub[12] = { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad,
0xde, 0xca, 0xf8, 0x88 };
unsigned char ad[1400];
unsigned long long adlen = 0;
unsigned long long mlen = 64;
unsigned long long clen = 0;
unsigned char c[1400];
unsigned char nsec[CRYPTO_NSECBYTES];
//mbedtls_gcm_init( &ctx );
// 128 bits, not bytes!
//ret = mbedtls_gcm_setkey( &ctx, cipher, key, 128 );
// Context, flag (1/0), length, nonce, nonce_len, AD, AD_len, PT, output, tag_len, tag
//ret = mbedtls_gcm_crypt_and_tag(&ctx, MBEDTLS_GCM_ENCRYPT, 64, initial_value, 12, additional, 0, plaintext, buf, 16, tag_buf);
//mbedtls_gcm_free( &ctx );
int res;
res = crypto_aead_encrypt(c, &clen, m, mlen, ad, adlen, nsec, npub, k);
if (res == 0) {
printf("Local encryption test workerino!\n");
} else {
printf("Local test failed -.-\n");
}
}
int main(void) {
//mbedtls_gcm_self_test(1);
single_encryption();
return 0;
}
No preview for this file type
...@@ -87,6 +87,9 @@ ...@@ -87,6 +87,9 @@
} }
#endif #endif
unsigned char tag_buf[16];
/* /*
* Initialize a context * Initialize a context
*/ */
...@@ -109,7 +112,6 @@ int crypto_aead_encrypt( ...@@ -109,7 +112,6 @@ int crypto_aead_encrypt(
) )
{ {
mbedtls_gcm_context ctx; mbedtls_gcm_context ctx;
unsigned char tag_buf[16];
int ret; int ret;
mbedtls_gcm_init( &ctx ); mbedtls_gcm_init( &ctx );
...@@ -130,12 +132,11 @@ int crypto_aead_decrypt( ...@@ -130,12 +132,11 @@ int crypto_aead_decrypt(
) )
{ {
mbedtls_gcm_context ctx; mbedtls_gcm_context ctx;
unsigned char tag_buf[16];
int ret; int ret;
mbedtls_gcm_init( &ctx ); mbedtls_gcm_init( &ctx );
ret = mbedtls_gcm_setkey( &ctx, MBEDTLS_CIPHER_ID_AES, k, 128); ret = mbedtls_gcm_setkey( &ctx, MBEDTLS_CIPHER_ID_AES, k, 128);
ret = mbedtls_gcm_crypt_and_tag( &ctx, 0, mlen, npub, 12, ad, adlen, m, c, 16, tag_buf ); ret = mbedtls_gcm_auth_decrypt( &ctx, clen, npub, 12, ad, adlen, tag_buf, 16, c, m);
mbedtls_gcm_free( &ctx ); mbedtls_gcm_free( &ctx );
return ret; return ret;
...@@ -829,7 +830,7 @@ int mbedtls_gcm_self_test( int verbose ) ...@@ -829,7 +830,7 @@ int mbedtls_gcm_self_test( int verbose )
{ {
mbedtls_gcm_context ctx; mbedtls_gcm_context ctx;
unsigned char buf[64]; unsigned char buf[64];
unsigned char tag_buf[16]; //unsigned char tag_buf[16];
int i, j, ret; int i, j, ret;
mbedtls_cipher_id_t cipher = MBEDTLS_CIPHER_ID_AES; mbedtls_cipher_id_t cipher = MBEDTLS_CIPHER_ID_AES;
......
//
// NIST-developed software is provided by NIST as a public service.
// You may use, copy and distribute copies of the software in any medium,
// provided that you keep intact this entire notice. You may improve,
// modify and create derivative works of the software or any portion of
// the software, and you may copy and distribute such modifications or
// works. Modified works should carry a notice stating that you changed
// the software and should note the date and nature of any such change.
// Please explicitly acknowledge the National Institute of Standards and
// Technology as the source of the software.
//
// NIST-developed software is expressly provided "AS IS." NIST MAKES NO
// WARRANTY OF ANY KIND, EXPRESS, IMPLIED, IN FACT OR ARISING BY OPERATION
// OF LAW, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT AND DATA ACCURACY. NIST
// NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE
// UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST
// DOES NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE
// OR THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY,
// RELIABILITY, OR USEFULNESS OF THE SOFTWARE.
//
// You are solely responsible for determining the appropriateness of using and
// distributing the software and you assume all risks associated with its use,
// including but not limited to the risks and costs of program errors, compliance
// with applicable laws, damage to or loss of data, programs or equipment, and
// the unavailability or interruption of operation. This software is not intended
// to be used in any situation where a failure could cause risk of injury or
// damage to property. The software developed by NIST employees is not subject to
// copyright protection within the United States.
//
// disable deprecation for sprintf and fopen
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <stdio.h>
#include <string.h>
#include "crypto_aead.h"
#include "api.h"
#define KAT_SUCCESS 0
#define KAT_FILE_OPEN_ERROR -1
#define KAT_DATA_ERROR -3
#define KAT_CRYPTO_FAILURE -4
#define MAX_FILE_NAME 256
#define MAX_MESSAGE_LENGTH 32
#define MAX_ASSOCIATED_DATA_LENGTH 32
void init_buffer(unsigned char *buffer, unsigned long long numbytes);
void fprint_bstr(FILE *fp, const char *label, const unsigned char *data, unsigned long long length);
int generate_test_vectors();
int main()
{
int ret = generate_test_vectors();
if (ret != KAT_SUCCESS) {
fprintf(stderr, "test vector generation failed with code %d\n", ret);
}
return ret;
}
int generate_test_vectors()
{
FILE *fp;
char fileName[MAX_FILE_NAME];
unsigned char key[CRYPTO_KEYBYTES];
unsigned char nonce[CRYPTO_NPUBBYTES];
unsigned char msg[MAX_MESSAGE_LENGTH];
unsigned char msg2[MAX_MESSAGE_LENGTH];
unsigned char ad[MAX_ASSOCIATED_DATA_LENGTH];
unsigned char ct[MAX_MESSAGE_LENGTH + CRYPTO_ABYTES];
unsigned long long clen, mlen2;
int count = 1;
int func_ret, ret_val = KAT_SUCCESS;
init_buffer(key, sizeof(key));
init_buffer(nonce, sizeof(nonce));
init_buffer(msg, sizeof(msg));
init_buffer(ad, sizeof(ad));
sprintf(fileName, "testvectors/LWC_AEAD_KAT_%d_%d.txt", (CRYPTO_KEYBYTES * 8), (CRYPTO_NPUBBYTES * 8));
if ((fp = fopen(fileName, "w")) == NULL) {
fprintf(stderr, "Couldn't open <%s> for write\n", fileName);
return KAT_FILE_OPEN_ERROR;
}
for (unsigned long long mlen = 0; (mlen <= MAX_MESSAGE_LENGTH) && (ret_val == KAT_SUCCESS); mlen++) {
for (unsigned long long adlen = 0; adlen <= MAX_ASSOCIATED_DATA_LENGTH; adlen++) {
fprintf(fp, "Count = %d\n", count++);
fprint_bstr(fp, "Key = ", key, CRYPTO_KEYBYTES);
fprint_bstr(fp, "Nonce = ", nonce, CRYPTO_NPUBBYTES);
fprint_bstr(fp, "PT = ", msg, mlen);
fprint_bstr(fp, "AD = ", ad, adlen);
if ((func_ret = crypto_aead_encrypt(ct, &clen, msg, mlen, ad, adlen, NULL, nonce, key)) != 0) {
fprintf(fp, "crypto_aead_encrypt returned <%d>\n", func_ret);
ret_val = KAT_CRYPTO_FAILURE;
break;
}
fprint_bstr(fp, "CT = ", ct, clen);
fprintf(fp, "\n");
if ((func_ret = crypto_aead_decrypt(msg2, &mlen2, NULL, ct, clen, ad, adlen, nonce, key)) != 0) {
fprintf(fp, "crypto_aead_decrypt returned <%d>\n", func_ret);
ret_val = KAT_CRYPTO_FAILURE;
break;
}
if (mlen != mlen2) {
fprintf(fp, "crypto_aead_decrypt returned bad 'mlen': Got <%llu>, expected <%llu>\n", mlen2, mlen);
ret_val = KAT_CRYPTO_FAILURE;
break;
}
if (memcmp(msg, msg2, mlen)) {
fprintf(fp, "crypto_aead_decrypt did not recover the plaintext\n");
ret_val = KAT_CRYPTO_FAILURE;
break;
}
}
}
fclose(fp);
return ret_val;
}
void fprint_bstr(FILE *fp, const char *label, const unsigned char *data, unsigned long long length)
{
fprintf(fp, "%s", label);
for (unsigned long long i = 0; i < length; i++)
fprintf(fp, "%02X", data[i]);
fprintf(fp, "\n");
}
void init_buffer(unsigned char *buffer, unsigned long long numbytes)
{
for (unsigned long long i = 0; i < numbytes; i++)
buffer[i] = (unsigned char)i;
}
#include "gcm.h"
#include "platform_util.h"
#include "api.h"
#include <stdio.h>
#include "crypto_aead.h"
static void single_encryption(void) {
// 32 bytes.. that's 256 bits
const unsigned char k[32] = { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08 };
unsigned char c[64] = { 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24,
0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c,
0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0,
0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e,
0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c,
0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05,
0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97,
0x3d, 0x58, 0xe0, 0x91, 0x47, 0x3f, 0x59, 0x85};
unsigned char npub[12] = { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad,
0xde, 0xca, 0xf8, 0x88 };
unsigned char ad[1400];
unsigned long long adlen = 0;
unsigned long long mlen = 0;
unsigned long long clen = 64;
unsigned char m[1400];
unsigned char nsec[CRYPTO_NSECBYTES];
//mbedtls_gcm_init( &ctx );
// 128 bits, not bytes!
//ret = mbedtls_gcm_setkey( &ctx, cipher, key, 128 );
// Context, flag (1/0), length, nonce, nonce_len, AD, AD_len, PT, output, tag_len, tag
//ret = mbedtls_gcm_crypt_and_tag(&ctx, MBEDTLS_GCM_ENCRYPT, 64, initial_value, 12, additional, 0, plaintext, buf, 16, tag_buf);
//mbedtls_gcm_free( &ctx );
int res;
res = crypto_aead_decrypt(m, mlen, nsec, c, clen, ad, adlen, npub, k);
if (res == 0) {
printf("Local decryption test workerino!\n");
} else {
printf("Local test failed -.-\n");
}
}
int main(void) {
//mbedtls_gcm_self_test(1);
single_encryption();
return 0;
}
#include "gcm.h"
#include "platform_util.h"
#include "api.h"
#include <stdio.h>
#include "crypto_aead.h"
static void single_encryption(void) {
// 32 bytes.. that's 256 bits
const unsigned char k[32] = { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08 };
unsigned char c[64] = { 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24,
0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c,
0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0,
0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e,
0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c,
0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05,
0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97,
0x3d, 0x58, 0xe0, 0x91, 0x47, 0x3f, 0x59, 0x85};
unsigned char npub[12] = { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad,
0xde, 0xca, 0xf8, 0x88 };
unsigned char ad[1400];
unsigned long long adlen = 0;
unsigned long long mlen = 0;
unsigned long long clen = 64;
unsigned char m[1400];
unsigned char nsec[CRYPTO_NSECBYTES];
//mbedtls_gcm_init( &ctx );
// 128 bits, not bytes!
//ret = mbedtls_gcm_setkey( &ctx, cipher, key, 128 );
// Context, flag (1/0), length, nonce, nonce_len, AD, AD_len, PT, output, tag_len, tag
//ret = mbedtls_gcm_crypt_and_tag(&ctx, MBEDTLS_GCM_ENCRYPT, 64, initial_value, 12, additional, 0, plaintext, buf, 16, tag_buf);
//mbedtls_gcm_free( &ctx );
int res;
res = crypto_aead_decrypt(m, mlen, nsec, c, clen, ad, adlen, npub, k);
if (res == 0) {
printf("Local decryption test workerino!\n");
} else {
printf("Local test failed -.-\n");
}
}
int main(void) {
//mbedtls_gcm_self_test(1);
single_encryption();
return 0;
}
Count = 1
Key = 000102030405060708090A0B0C0D0E0F
Nonce = 000102030405060708090A0B
PT =
AD =
CT = 00000000000000000000000000000000000000000000000026B06265000000000000000000000000C7F59532667F000074657374766563746F72732F4C57435F414541445F4B41545F3132385F39362E7478740000000000D08A7FEDFE7F0000000000000000000000000000000000000000000000000000C056B432667F0000988A7FEDFE7F0000D08A7FEDFE7F0000C056B432667F00008003000000000000505AB432667F0000000000000000000000000000000000000001000040000000FFFFFFFF00000000000000000000000068E27FEDFE7F0000C056B432667F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004090C16B34560000FFB5F00000000000C200000000000000878A7FEDFE7F0000868A7FEDFE7F000000D74CBA9228F2190000000000000000000000000000000090D3C16B3456000060A1C16B34560000908B7FEDFE7F00000000000000000000000000000000000039A1C16B3456000060A1C16B34560000E3FE7F32667F00000000000000000000988B7FEDFE7F0000000004000100000030A1C16B345600000000000000000000156B98AF70FA3D0C60A1C16B34560000908B7FEDFE7F000000000000000000000000000000000000156B381D0CF7A85F156B96F50C49995E000000000000000000000000000000000000000000000000A88B7FEDFE7F00002051B432667F0000A198B232667F00000000000000000000000000000000000060A1C16B34560000908B7FEDFE7F000000000000000000008EA1C16B34560000888B7FEDFE7F00001C000000000000000100000000000000A5A37FEDFE7F00000000000000000000ABA37FEDFE7F0000BBA37FEDFE7F000019A47FEDFE7F00002BA47FEDFE7F00003FA47FEDFE7F000058A47FEDFE7F000092A47FEDFE7F0000A8A47FEDFE7F0000BFA47FEDFE7F0000D3A47FEDFE7F000006A57FEDFE7F00001BA57FEDFE7F000033A57FEDFE7F000046A57FEDFE7F00005BA57FEDFE7F00008FA57FEDFE7F00009EA57FEDFE7F0000D5A57FEDFE7F0000E0A57FEDFE7F0000F9A57FEDFE7F000014A67FEDFE7F000029A67FEDFE7F000049A67FEDFE7F000077A67FEDFE7F000099A67FEDFE7F0000A7A67FEDFE7F0000BCA67FEDFE7F0000CCA67FEDFE7F0000AEAC7FEDFE7F0000C7AC7FEDFE7F0000D8AC7FEDFE7F00000CAD7FEDFE7F000021AD7FEDFE7F000038AD7FEDFE7F000056AD7FEDFE7F00006AAD7FEDFE7F000072AD7FEDFE7F00007FAD7FEDFE7F000087AD7FEDFE7F0000A0AD7FEDFE7F0000BBAD7FEDFE7F0000C6AD7FEDFE7F0000D8AD7FEDFE7F000001AE7FEDFE7F000015AE7FEDFE7F000034AE7FEDFE7F000048AE7FEDFE7F00005CAE7FEDFE7F000086AE7FEDFE7F000015AF7FEDFE7F000025AF7FEDFE7F00005BAF7FEDFE7F000073AF7FEDFE7F00008AAF7FEDFE7F0000EAAF7FEDFE7F00000000000000000000210000000000000000E07FEDFE7F00001000000000000000FFFBEBBF00000000060000000000000000100000000000001100000000000000640000000000000003000000000000004090C16B345600000400000000000000380000000000000005000000000000000B0000000000000007000000000000000090B132667F000008000000000000000000000000000000090000000000000060A1C16B345600000B00000000000000E8030000000000000C00000000000000E8030000000000000D00000000000000E8030000000000000E00000000000000E803000000000000170000000000000000000000000000001900000000000000A98E7FEDFE7F00001A0000000000000000000000000000001F00000000000000F2AF7FEDFE7F00000F00000000000000B98E7FEDFE7F0000000000000000000000000000000000000057D74CBA9228F2195C84F9962AD08A357838365F3634000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002E2F67636D005348454C4C3D2F62696E2F626173680053455353494F4E5F4D414E414745523D6C6F63616C2F73746F726D6272696E6765723A402F746D702F2E4943452D756E69782F313034322C756E69782F73746F726D6272696E6765723A2F746D702F2E4943452D756E69782F313034320057494E444F5749443D363038313734313100434F4C4F525445524D3D74727565636F6C6F72005844475F434F4E4649475F444952533D2F6574632F786467005844475F53455353494F4E5F504154483D2F6F72672F667265656465736B746F702F446973706C61794D616E616765722F53657373696F6E30005844475F4D454E555F5052454649583D786663652D004C435F414444524553533D64655F44452E5554462D38004C435F4E414D453D64655F44452E5554462D38005353485F415554485F534F434B3D2F72756E2F757365722F313030302F676E7570672F532E6770672D6167656E742E737368004445534B544F505F53455353494F4E3D78666365004C435F4D4F4E45544152593D64655F44452E5554462D38005353485F4147454E545F5049443D3130343900454449544F523D2F7573722F62696E2F6E616E6F0047544B5F4D4F44554C45533D63616E62657272612D67746B2D6D6F64756C653A63616E62657272612D67746B2D6D6F64756C65005844475F534541543D7365617430005057443D2F686F6D652F73722F5068442F72657365617263682F6C77632F6C77632D636F6D706172652F6D6265645F6165735F67636D004C4F474E414D453D7372005844475F53455353494F4E5F4445534B544F503D786663650051545F5150415F504C4154464F524D5448454D453D7174356374005844475F53455353494F4E5F545950453D7831310058415554484F524954593D2F686F6D652F73722F2E58617574686F72697479005844475F475245455445525F444154415F4449523D2F7661722F6C69622F6C69676874646D2D646174612F73720047544B325F52435F46494C45533D2F686F6D652F73722F2E67746B72632D322E3000484F4D453D2F686F6D652F7372004C435F50415045523D64655F44452E5554462D38004C414E473D656E5F55532E75746638004C535F434F4C4F52533D72733D303A64693D30313B33343A6C6E3D30313B33363A6D683D30303A70693D34303B33333A736F3D30313B33353A646F3D30313B33353A62643D34303B33333B30313A63643D34303B33333B30313A6F723D34303B33313B30313A6D693D30303A73753D33373B34313A73673D33303B34333A63613D33303B34313A74773D33303B34323A6F773D33343B34323A73743D33373B34343A65783D30313B33323A2A2E7461723D30313B33313A2A2E74677A3D30313B33313A2A2E6172633D30313B33313A2A2E61726A3D30313B33313A2A2E74617A3D30313B33313A2A2E6C68613D30313B33313A2A2E6C7A343D30313B33313A2A2E6C7A683D30313B33313A2A2E6C7A6D613D30313B33313A2A2E746C7A3D30313B33313A2A2E74787A3D30313B33313A2A2E747A6F3D30313B33313A2A2E74377A3D30313B33313A2A2E7A69703D30313B33313A2A2E7A3D30313B33313A2A2E647A3D30313B33313A2A2E677A3D30313B33313A2A2E6C727A3D30313B33313A2A2E6C7A3D30313B33313A2A2E6C7A6F3D30313B33313A2A2E787A3D30313B33313A2A2E7A73743D30313B33313A2A2E747A73743D30313B33313A2A2E627A323D30313B33313A2A2E627A3D30313B33313A2A2E74627A3D30313B33313A2A2E74627A323D30313B33313A2A2E747A3D30313B33313A2A2E6465623D30313B33313A2A2E72706D3D30313B33313A2A2E6A61723D30313B33313A2A2E7761723D30313B33313A2A2E6561723D30313B33313A2A2E7361723D30313B33313A2A2E7261723D30313B33313A2A2E616C7A3D30313B33313A2A2E6163653D30313B33313A2A2E7A6F6F3D30313B33313A2A2E6370696F3D30313B33313A2A2E377A3D30313B33313A2A2E727A3D30313B33313A2A2E6361623D30313B33313A2A2E77696D3D30313B33313A2A2E73776D3D30313B33313A2A2E64776D3D30313B33313A2A2E6573643D30313B33313A2A2E6A70673D30313B33353A2A2E6A7065673D30313B33353A2A2E6D6A70673D30313B33353A2A2E6D6A7065673D30313B33353A2A2E6769663D30313B33353A2A2E626D703D30313B33353A2A2E70626D3D30313B33353A2A2E70676D3D30313B33353A2A2E70706D3D30313B33353A2A2E7467613D30313B33353A2A2E78626D3D30313B33353A2A2E78706D3D30313B33353A2A2E7469663D30313B33353A2A2E746966663D30313B33353A2A2E706E673D30313B33353A2A2E7376673D30313B33353A2A2E7376677A3D30313B33353A2A2E6D6E673D30313B33353A2A2E7063783D30313B33353A2A2E6D6F763D30313B33353A2A2E6D70673D30313B33353A2A2E6D7065673D30313B33353A2A2E6D32763D30313B33353A2A2E6D6B763D30313B33353A2A2E7765626D3D30313B33353A2A2E6F676D3D30313B33353A2A2E6D70343D30313B33353A2A2E6D34763D30313B33353A2A2E6D7034763D30313B33353A2A2E766F623D30313B33353A2A2E71743D30313B33353A2A2E6E75763D30313B33353A2A2E776D763D30313B33353A2A2E6173663D30313B33353A2A2E726D3D30313B33353A2A2E726D76623D30313B33353A2A2E666C633D30313B33353A2A2E6176693D30313B33353A2A2E666C693D30313B33353A2A2E666C763D30313B33353A2A2E676C3D30313B33353A2A2E646C3D30313B33353A2A2E7863663D30313B33353A2A2E7877643D30313B33353A2A2E7975763D30313B33353A2A2E63676D3D30313B33353A2A2E656D663D30313B33353A2A2E6F67763D30313B33353A2A2E6F67783D30313B33353A2A2E6161633D30303B33363A2A2E61753D30303B33363A2A2E666C61633D30303B33363A2A2E6D34613D30303B33363A2A2E6D69643D30303B33363A2A2E6D6964693D30303B33363A2A2E6D6B613D30303B33363A2A2E6D70333D30303B33363A2A2E6D70633D30303B33363A2A2E6F67673D30303B33363A2A2E72613D30303B33363A2A2E7761763D30303B33363A2A2E6F67613D30303B33363A2A2E6F7075733D30303B33363A2A2E7370783D30303B33363A2A2E787370663D30303B33363A005844475F43555252454E545F4445534B544F503D58464345005654455F56455253494F4E3D35363033005844475F534541545F504154483D2F6F72672F667265656465736B746F702F446973706C61794D616E616765722F536561743000474C4144455F434154414C4F475F504154483D3A005844475F53455353494F4E5F434C4153533D75736572004C435F4944454E54494649434154494F4E3D64655F44452E5554462D38005445524D3D787465726D2D323536636F6C6F7200555345523D737200444953504C41593D3A302E300053484C564C3D32004C435F54454C4550484F4E453D64655F44452E5554462D38004C435F4D4541535552454D454E543D64655F44452E5554462D38005844475F56544E523D37005844475F53455353494F4E5F49443D6332004D4F5A5F504C5547494E5F504154483D2F7573722F6C69622F6D6F7A696C6C612F706C7567696E7300474C4144455F4D4F44554C455F504154483D3A005844475F52554E54494D455F4449523D2F72756E2F757365722F3130303000474C4144455F5049584D41505F504154483D3A004C435F54494D453D64655F44452E5554462D38005844475F444154415F444952533D2F7573722F6C6F63616C2F73686172653A2F7573722F736861726500504154483D2F7573722F6C6F63616C2F62696E3A2F7573722F62696E3A2F62696E3A2F7573722F6C6F63616C2F7362696E3A2F7573722F6C69623A2F7573722F6C69622F6A766D2F64656661756C742F62696E3A2F7573722F62696E2F736974655F7065726C3A2F7573722F62696E2F76656E646F725F7065726C3A2F7573722F62696E2F636F72655F7065726C0047444D53455353494F4E3D7866636500444255535F53455353494F4E5F4255535F414444524553533D756E69783A706174683D2F72756E2F757365722F313030302F627573004D41494C3D2F7661722F73706F6F6C2F6D61696C2F7372004C435F4E554D455249433D64655F44452E5554462D38004F4C445057443D2F686F6D652F73722F5068442F72657365617263682F6C77632F6E6973745F63616E646964617465732F6163652F496D706C656D656E746174696F6E732F63727970746F5F616561642F616365616531323876312F726566005F3D2E2F67636D002E2F67636D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002820BA0001000000123243CAB83A0000FFFFFFFFFFFFFFFFC241400017000000381AAC103BD917004EDC2D5D00000000717E000000000000381AAC7C11A806004EDC2D5D000000002176B22F00000000717E000000000000F922500D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment