From d503053dbb2f7dbdcde1eaaeebe8f1743900a743 Mon Sep 17 00:00:00 2001 From: Sebastian Renner Date: Tue, 16 Jul 2019 16:21:03 +0200 Subject: [PATCH] GCM which generates super weired TV --- mbed_aes_gcm/Makefile | 18 +++++++----------- mbed_aes_gcm/example_decryption.c | 54 ------------------------------------------------------ mbed_aes_gcm/example_encryption.c | 53 ----------------------------------------------------- mbed_aes_gcm/gcm | Bin 45824 -> 0 bytes mbed_aes_gcm/gcm.c | 9 +++++---- mbed_aes_gcm/genkat_aead.c | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mbed_aes_gcm/main. | 54 ------------------------------------------------------ mbed_aes_gcm/main.c | 54 ------------------------------------------------------ mbed_aes_gcm/testvectors/LWC_AEAD_KAT_128_96.txt | 6 ++++++ 9 files changed, 177 insertions(+), 230 deletions(-) delete mode 100644 mbed_aes_gcm/example_decryption.c delete mode 100644 mbed_aes_gcm/example_encryption.c create mode 100644 mbed_aes_gcm/genkat_aead.c delete mode 100644 mbed_aes_gcm/main. delete mode 100644 mbed_aes_gcm/main.c create mode 100644 mbed_aes_gcm/testvectors/LWC_AEAD_KAT_128_96.txt diff --git a/mbed_aes_gcm/Makefile b/mbed_aes_gcm/Makefile index 87853fe..9d99db1 100644 --- a/mbed_aes_gcm/Makefile +++ b/mbed_aes_gcm/Makefile @@ -1,18 +1,14 @@ CC=gcc -CFLAGS=-c -Wall -LDFLAGS= -SOURCES=aes.c cipher.c cipher_wrap.c gcm.c main.c platform.c platform_util.c -OBJECTS=$(SOURCES:.c=.o) -EXECUTABLE=gcm +NISTGCCFLAGS=-std=c99 -Wall -Wextra -Wshadow -O2 +LFLAGS=-lm -all: $(SOURCES) $(EXECUTABLE) +all: gcm -$(EXECUTABLE): $(OBJECTS) - $(CC) $(LDFLAGS) $(OBJECTS) -o $@ +gcm: genkat_aead.c aes.c cipher.c cipher_wrap.c gcm.c platform.c platform_util.c + $(CC) $(NISTGCCFLAGS) -o $@ $^ $(LFLAGS) -.cpp.o: - $(CC) $(CFLAGS) $< -o $@ +.PHONY: clean clean: - rm -rf *.o out + rm -rf gcm diff --git a/mbed_aes_gcm/example_decryption.c b/mbed_aes_gcm/example_decryption.c deleted file mode 100644 index fdb53a3..0000000 --- a/mbed_aes_gcm/example_decryption.c +++ /dev/null @@ -1,54 +0,0 @@ -#include "gcm.h" -#include "platform_util.h" -#include "api.h" -#include -#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; -} diff --git a/mbed_aes_gcm/example_encryption.c b/mbed_aes_gcm/example_encryption.c deleted file mode 100644 index 1d53362..0000000 --- a/mbed_aes_gcm/example_encryption.c +++ /dev/null @@ -1,53 +0,0 @@ -#include "gcm.h" -#include "platform_util.h" -#include "api.h" -#include -#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; -} diff --git a/mbed_aes_gcm/gcm b/mbed_aes_gcm/gcm index 7155828..98f72ac 100755 Binary files a/mbed_aes_gcm/gcm and b/mbed_aes_gcm/gcm differ diff --git a/mbed_aes_gcm/gcm.c b/mbed_aes_gcm/gcm.c index 089240d..0b1e4e5 100644 --- a/mbed_aes_gcm/gcm.c +++ b/mbed_aes_gcm/gcm.c @@ -87,6 +87,9 @@ } #endif +unsigned char tag_buf[16]; + + /* * Initialize a context */ @@ -109,7 +112,6 @@ int crypto_aead_encrypt( ) { mbedtls_gcm_context ctx; - unsigned char tag_buf[16]; int ret; mbedtls_gcm_init( &ctx ); @@ -130,12 +132,11 @@ int crypto_aead_decrypt( ) { mbedtls_gcm_context ctx; - unsigned char tag_buf[16]; int ret; mbedtls_gcm_init( &ctx ); 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 ); return ret; @@ -829,7 +830,7 @@ int mbedtls_gcm_self_test( int verbose ) { mbedtls_gcm_context ctx; unsigned char buf[64]; - unsigned char tag_buf[16]; + //unsigned char tag_buf[16]; int i, j, ret; mbedtls_cipher_id_t cipher = MBEDTLS_CIPHER_ID_AES; diff --git a/mbed_aes_gcm/genkat_aead.c b/mbed_aes_gcm/genkat_aead.c new file mode 100644 index 0000000..c3c3388 --- /dev/null +++ b/mbed_aes_gcm/genkat_aead.c @@ -0,0 +1,159 @@ +// +// 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 +#include + +#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; +} diff --git a/mbed_aes_gcm/main. b/mbed_aes_gcm/main. deleted file mode 100644 index fdb53a3..0000000 --- a/mbed_aes_gcm/main. +++ /dev/null @@ -1,54 +0,0 @@ -#include "gcm.h" -#include "platform_util.h" -#include "api.h" -#include -#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; -} diff --git a/mbed_aes_gcm/main.c b/mbed_aes_gcm/main.c deleted file mode 100644 index fdb53a3..0000000 --- a/mbed_aes_gcm/main.c +++ /dev/null @@ -1,54 +0,0 @@ -#include "gcm.h" -#include "platform_util.h" -#include "api.h" -#include -#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; -} diff --git a/mbed_aes_gcm/testvectors/LWC_AEAD_KAT_128_96.txt b/mbed_aes_gcm/testvectors/LWC_AEAD_KAT_128_96.txt new file mode 100644 index 0000000..6e073ec --- /dev/null +++ b/mbed_aes_gcm/testvectors/LWC_AEAD_KAT_128_96.txt @@ -0,0 +1,6 @@ +Count = 1 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = +CT = 00000000000000000000000000000000000000000000000026B06265000000000000000000000000C7F59532667F000074657374766563746F72732F4C57435F414541445F4B41545F3132385F39362E7478740000000000D08A7FEDFE7F0000000000000000000000000000000000000000000000000000C056B432667F0000988A7FEDFE7F0000D08A7FEDFE7F0000C056B432667F00008003000000000000505AB432667F0000000000000000000000000000000000000001000040000000FFFFFFFF00000000000000000000000068E27FEDFE7F0000C056B432667F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004090C16B34560000FFB5F00000000000C200000000000000878A7FEDFE7F0000868A7FEDFE7F000000D74CBA9228F2190000000000000000000000000000000090D3C16B3456000060A1C16B34560000908B7FEDFE7F00000000000000000000000000000000000039A1C16B3456000060A1C16B34560000E3FE7F32667F00000000000000000000988B7FEDFE7F0000000004000100000030A1C16B345600000000000000000000156B98AF70FA3D0C60A1C16B34560000908B7FEDFE7F000000000000000000000000000000000000156B381D0CF7A85F156B96F50C49995E000000000000000000000000000000000000000000000000A88B7FEDFE7F00002051B432667F0000A198B232667F00000000000000000000000000000000000060A1C16B34560000908B7FEDFE7F000000000000000000008EA1C16B34560000888B7FEDFE7F00001C000000000000000100000000000000A5A37FEDFE7F00000000000000000000ABA37FEDFE7F0000BBA37FEDFE7F000019A47FEDFE7F00002BA47FEDFE7F00003FA47FEDFE7F000058A47FEDFE7F000092A47FEDFE7F0000A8A47FEDFE7F0000BFA47FEDFE7F0000D3A47FEDFE7F000006A57FEDFE7F00001BA57FEDFE7F000033A57FEDFE7F000046A57FEDFE7F00005BA57FEDFE7F00008FA57FEDFE7F00009EA57FEDFE7F0000D5A57FEDFE7F0000E0A57FEDFE7F0000F9A57FEDFE7F000014A67FEDFE7F000029A67FEDFE7F000049A67FEDFE7F000077A67FEDFE7F000099A67FEDFE7F0000A7A67FEDFE7F0000BCA67FEDFE7F0000CCA67FEDFE7F0000AEAC7FEDFE7F0000C7AC7FEDFE7F0000D8AC7FEDFE7F00000CAD7FEDFE7F000021AD7FEDFE7F000038AD7FEDFE7F000056AD7FEDFE7F00006AAD7FEDFE7F000072AD7FEDFE7F00007FAD7FEDFE7F000087AD7FEDFE7F0000A0AD7FEDFE7F0000BBAD7FEDFE7F0000C6AD7FEDFE7F0000D8AD7FEDFE7F000001AE7FEDFE7F000015AE7FEDFE7F000034AE7FEDFE7F000048AE7FEDFE7F00005CAE7FEDFE7F000086AE7FEDFE7F000015AF7FEDFE7F000025AF7FEDFE7F00005BAF7FEDFE7F000073AF7FEDFE7F00008AAF7FEDFE7F0000EAAF7FEDFE7F00000000000000000000210000000000000000E07FEDFE7F00001000000000000000FFFBEBBF00000000060000000000000000100000000000001100000000000000640000000000000003000000000000004090C16B345600000400000000000000380000000000000005000000000000000B0000000000000007000000000000000090B132667F000008000000000000000000000000000000090000000000000060A1C16B345600000B00000000000000E8030000000000000C00000000000000E8030000000000000D00000000000000E8030000000000000E00000000000000E803000000000000170000000000000000000000000000001900000000000000A98E7FEDFE7F00001A0000000000000000000000000000001F00000000000000F2AF7FEDFE7F00000F00000000000000B98E7FEDFE7F0000000000000000000000000000000000000057D74CBA9228F2195C84F9962AD08A357838365F3634000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002E2F67636D005348454C4C3D2F62696E2F626173680053455353494F4E5F4D414E414745523D6C6F63616C2F73746F726D6272696E6765723A402F746D702F2E4943452D756E69782F313034322C756E69782F73746F726D6272696E6765723A2F746D702F2E4943452D756E69782F313034320057494E444F5749443D363038313734313100434F4C4F525445524D3D74727565636F6C6F72005844475F434F4E4649475F444952533D2F6574632F786467005844475F53455353494F4E5F504154483D2F6F72672F667265656465736B746F702F446973706C61794D616E616765722F53657373696F6E30005844475F4D454E555F5052454649583D786663652D004C435F414444524553533D64655F44452E5554462D38004C435F4E414D453D64655F44452E5554462D38005353485F415554485F534F434B3D2F72756E2F757365722F313030302F676E7570672F532E6770672D6167656E742E737368004445534B544F505F53455353494F4E3D78666365004C435F4D4F4E45544152593D64655F44452E5554462D38005353485F4147454E545F5049443D3130343900454449544F523D2F7573722F62696E2F6E616E6F0047544B5F4D4F44554C45533D63616E62657272612D67746B2D6D6F64756C653A63616E62657272612D67746B2D6D6F64756C65005844475F534541543D7365617430005057443D2F686F6D652F73722F5068442F72657365617263682F6C77632F6C77632D636F6D706172652F6D6265645F6165735F67636D004C4F474E414D453D7372005844475F53455353494F4E5F4445534B544F503D786663650051545F5150415F504C4154464F524D5448454D453D7174356374005844475F53455353494F4E5F545950453D7831310058415554484F524954593D2F686F6D652F73722F2E58617574686F72697479005844475F475245455445525F444154415F4449523D2F7661722F6C69622F6C69676874646D2D646174612F73720047544B325F52435F46494C45533D2F686F6D652F73722F2E67746B72632D322E3000484F4D453D2F686F6D652F7372004C435F50415045523D64655F44452E5554462D38004C414E473D656E5F55532E75746638004C535F434F4C4F52533D72733D303A64693D30313B33343A6C6E3D30313B33363A6D683D30303A70693D34303B33333A736F3D30313B33353A646F3D30313B33353A62643D34303B33333B30313A63643D34303B33333B30313A6F723D34303B33313B30313A6D693D30303A73753D33373B34313A73673D33303B34333A63613D33303B34313A74773D33303B34323A6F773D33343B34323A73743D33373B34343A65783D30313B33323A2A2E7461723D30313B33313A2A2E74677A3D30313B33313A2A2E6172633D30313B33313A2A2E61726A3D30313B33313A2A2E74617A3D30313B33313A2A2E6C68613D30313B33313A2A2E6C7A343D30313B33313A2A2E6C7A683D30313B33313A2A2E6C7A6D613D30313B33313A2A2E746C7A3D30313B33313A2A2E74787A3D30313B33313A2A2E747A6F3D30313B33313A2A2E74377A3D30313B33313A2A2E7A69703D30313B33313A2A2E7A3D30313B33313A2A2E647A3D30313B33313A2A2E677A3D30313B33313A2A2E6C727A3D30313B33313A2A2E6C7A3D30313B33313A2A2E6C7A6F3D30313B33313A2A2E787A3D30313B33313A2A2E7A73743D30313B33313A2A2E747A73743D30313B33313A2A2E627A323D30313B33313A2A2E627A3D30313B33313A2A2E74627A3D30313B33313A2A2E74627A323D30313B33313A2A2E747A3D30313B33313A2A2E6465623D30313B33313A2A2E72706D3D30313B33313A2A2E6A61723D30313B33313A2A2E7761723D30313B33313A2A2E6561723D30313B33313A2A2E7361723D30313B33313A2A2E7261723D30313B33313A2A2E616C7A3D30313B33313A2A2E6163653D30313B33313A2A2E7A6F6F3D30313B33313A2A2E6370696F3D30313B33313A2A2E377A3D30313B33313A2A2E727A3D30313B33313A2A2E6361623D30313B33313A2A2E77696D3D30313B33313A2A2E73776D3D30313B33313A2A2E64776D3D30313B33313A2A2E6573643D30313B33313A2A2E6A70673D30313B33353A2A2E6A7065673D30313B33353A2A2E6D6A70673D30313B33353A2A2E6D6A7065673D30313B33353A2A2E6769663D30313B33353A2A2E626D703D30313B33353A2A2E70626D3D30313B33353A2A2E70676D3D30313B33353A2A2E70706D3D30313B33353A2A2E7467613D30313B33353A2A2E78626D3D30313B33353A2A2E78706D3D30313B33353A2A2E7469663D30313B33353A2A2E746966663D30313B33353A2A2E706E673D30313B33353A2A2E7376673D30313B33353A2A2E7376677A3D30313B33353A2A2E6D6E673D30313B33353A2A2E7063783D30313B33353A2A2E6D6F763D30313B33353A2A2E6D70673D30313B33353A2A2E6D7065673D30313B33353A2A2E6D32763D30313B33353A2A2E6D6B763D30313B33353A2A2E7765626D3D30313B33353A2A2E6F676D3D30313B33353A2A2E6D70343D30313B33353A2A2E6D34763D30313B33353A2A2E6D7034763D30313B33353A2A2E766F623D30313B33353A2A2E71743D30313B33353A2A2E6E75763D30313B33353A2A2E776D763D30313B33353A2A2E6173663D30313B33353A2A2E726D3D30313B33353A2A2E726D76623D30313B33353A2A2E666C633D30313B33353A2A2E6176693D30313B33353A2A2E666C693D30313B33353A2A2E666C763D30313B33353A2A2E676C3D30313B33353A2A2E646C3D30313B33353A2A2E7863663D30313B33353A2A2E7877643D30313B33353A2A2E7975763D30313B33353A2A2E63676D3D30313B33353A2A2E656D663D30313B33353A2A2E6F67763D30313B33353A2A2E6F67783D30313B33353A2A2E6161633D30303B33363A2A2E61753D30303B33363A2A2E666C61633D30303B33363A2A2E6D34613D30303B33363A2A2E6D69643D30303B33363A2A2E6D6964693D30303B33363A2A2E6D6B613D30303B33363A2A2E6D70333D30303B33363A2A2E6D70633D30303B33363A2A2E6F67673D30303B33363A2A2E72613D30303B33363A2A2E7761763D30303B33363A2A2E6F67613D30303B33363A2A2E6F7075733D30303B33363A2A2E7370783D30303B33363A2A2E787370663D30303B33363A005844475F43555252454E545F4445534B544F503D58464345005654455F56455253494F4E3D35363033005844475F534541545F504154483D2F6F72672F667265656465736B746F702F446973706C61794D616E616765722F536561743000474C4144455F434154414C4F475F504154483D3A005844475F53455353494F4E5F434C4153533D75736572004C435F4944454E54494649434154494F4E3D64655F44452E5554462D38005445524D3D787465726D2D323536636F6C6F7200555345523D737200444953504C41593D3A302E300053484C564C3D32004C435F54454C4550484F4E453D64655F44452E5554462D38004C435F4D4541535552454D454E543D64655F44452E5554462D38005844475F56544E523D37005844475F53455353494F4E5F49443D6332004D4F5A5F504C5547494E5F504154483D2F7573722F6C69622F6D6F7A696C6C612F706C7567696E7300474C4144455F4D4F44554C455F504154483D3A005844475F52554E54494D455F4449523D2F72756E2F757365722F3130303000474C4144455F5049584D41505F504154483D3A004C435F54494D453D64655F44452E5554462D38005844475F444154415F444952533D2F7573722F6C6F63616C2F73686172653A2F7573722F736861726500504154483D2F7573722F6C6F63616C2F62696E3A2F7573722F62696E3A2F62696E3A2F7573722F6C6F63616C2F7362696E3A2F7573722F6C69623A2F7573722F6C69622F6A766D2F64656661756C742F62696E3A2F7573722F62696E2F736974655F7065726C3A2F7573722F62696E2F76656E646F725F7065726C3A2F7573722F62696E2F636F72655F7065726C0047444D53455353494F4E3D7866636500444255535F53455353494F4E5F4255535F414444524553533D756E69783A706174683D2F72756E2F757365722F313030302F627573004D41494C3D2F7661722F73706F6F6C2F6D61696C2F7372004C435F4E554D455249433D64655F44452E5554462D38004F4C445057443D2F686F6D652F73722F5068442F72657365617263682F6C77632F6E6973745F63616E646964617465732F6163652F496D706C656D656E746174696F6E732F63727970746F5F616561642F616365616531323876312F726566005F3D2E2F67636D002E2F67636D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002820BA0001000000123243CAB83A0000FFFFFFFFFFFFFFFFC241400017000000381AAC103BD917004EDC2D5D00000000717E000000000000381AAC7C11A806004EDC2D5D000000002176B22F00000000717E000000000000F922500D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file -- libgit2 0.26.0