From a21f63bbd870761f8faaaac16176b3d53ff38a54 Mon Sep 17 00:00:00 2001 From: Tom St Denis Date: Fri, 23 Jul 2004 15:40:22 +0000 Subject: [PATCH] added libtomcrypt-0.97b --- aes.c | 4 +- changes | 23 +++ crypt.c | 3 - crypt.tex | 2 +- crypt_cipher_descriptor.c | 34 +---- crypt_hash_descriptor.c | 35 +---- crypt_prng_descriptor.c | 35 +---- demos/test/rsa_test.c | 31 +++- demos/tv_gen.c | 53 +++++-- demos/x86_prof.c | 104 +++++++++++++- doc/crypt.pdf | Bin 382547 -> 382399 bytes examples/ch1-01.c | 18 --- examples/ch1-02.c | 25 ---- examples/ch1-03.c | 29 ---- examples/ch2-01.c | 35 ----- fortuna.c | 256 +++++++++++++++++++++++++++++++++ hmac_done.c | 1 + hmac_init.c | 9 +- hmac_test.c | 2 +- ltc_tommath.h | 5 +- makefile | 5 +- makefile.cygwin_dll | 3 +- makefile.icc | 5 +- makefile.msvc | 3 +- mpi.c | 292 +++++++++++++++++++++++++++++++++----- mycrypt.h | 4 +- mycrypt_cfg.h | 8 +- mycrypt_custom.h | 22 +-- mycrypt_hash.h | 2 +- mycrypt_pk.h | 25 ++++ mycrypt_prng.h | 41 +++++- pkcs_5_2.c | 4 +- rc2.c | 52 +++---- rc4.c | 26 +++- rsa_decrypt_key.c | 5 +- rsa_v15_decrypt_key.c | 63 ++++++++ rsa_v15_encrypt_key.c | 54 +++++++ rsa_v15_sign_hash.c | 57 ++++++++ rsa_v15_verify_hash.c | 69 +++++++++ sprng.c | 24 +++- yarrow.c | 50 ++++++- 41 files changed, 1192 insertions(+), 326 deletions(-) delete mode 100644 examples/ch1-01.c delete mode 100644 examples/ch1-02.c delete mode 100644 examples/ch1-03.c delete mode 100644 examples/ch2-01.c create mode 100644 fortuna.c create mode 100644 rsa_v15_decrypt_key.c create mode 100644 rsa_v15_encrypt_key.c create mode 100644 rsa_v15_sign_hash.c create mode 100644 rsa_v15_verify_hash.c diff --git a/aes.c b/aes.c index e0e4c96..949c22b 100644 --- a/aes.c +++ b/aes.c @@ -89,7 +89,7 @@ static ulong32 setup_mix(ulong32 temp) } #ifndef ENCRYPT_ONLY - +#ifdef SMALL_CODE static ulong32 setup_mix2(ulong32 temp) { return Td0(255 & Te4[byte(temp, 3)]) ^ @@ -97,7 +97,7 @@ static ulong32 setup_mix2(ulong32 temp) Td2(255 & Te4[byte(temp, 1)]) ^ Td3(255 & Te4[byte(temp, 0)]); } - +#endif #endif int SETUP(const unsigned char *key, int keylen, int rounds, symmetric_key *skey) diff --git a/changes b/changes index d29871b..e74b1d8 100644 --- a/changes +++ b/changes @@ -1,3 +1,26 @@ +July 23rd, 2004 +v0.97b -- Added PKCS #1 v1.5 RSA encrypt/sign helpers (like rsa_sign_hash, etc...) + -- Added missing prng check to rsa_decrypt_key() [not critical as I don't use + descriptors directly in that function] + -- Merged in LTM-SSE, define LTMSSE before you build and you will get SSE2 optimized math ;-) + (roughly 3x faster on a P4 Northwood). By default it will compile as ISO C portable + code (when LTMSSE is undefined). + -- Fixed bug in ltc_tommath.h where I had the kara/toom cutoffs not marked as ``extern'' + Thanks to "Stefan Arentz" + -- Steven Dake and Richard Amacker submitted patches to + fix pkcs_5_2(). It now matches the output of another crypto library. Whoops... hehehe + -- Updated PRNG api. Added Fortuna PRNG to the list of supported PRNGs + -- Fixed up the descriptor tables since globals are automatically zero'ed on startup. + -- Changed RC4 to store it's output. If you want to encrypt with RC4 + you'll have to do the XOR yourself. + -- Fixed buffer overflows/overruns in the HMAC code. + + ++ API change for the PRNGs there now is a done() function per PRNG. You + should call it when you are done with a prng state. So far it's + not absolutely required (won't cause problems) but is a good idea to + start. + + June 23rd, 2004 v0.97a ++ Fixed several potentially crippling bugs... [read on] -- Fixed bug in OAEP decoder that would incorrectly report diff --git a/crypt.c b/crypt.c index e6800fd..d71066c 100644 --- a/crypt.c +++ b/crypt.c @@ -229,9 +229,6 @@ const char *crypt_build_settings = #endif #if defined(NO_FILE) " NO_FILE " -#endif -#if defined(LTC_TEST) - " LTC_TEST " #endif "\n" "\n\n\n" diff --git a/crypt.tex b/crypt.tex index e3b40af..4b3d103 100644 --- a/crypt.tex +++ b/crypt.tex @@ -47,7 +47,7 @@ \def\gap{\vspace{0.5ex}} \makeindex \begin{document} -\title{LibTomCrypt \\ Version 0.97a} +\title{LibTomCrypt \\ Version 0.97b} \author{Tom St Denis \\ \\ tomstdenis@iahu.ca \\ diff --git a/crypt_cipher_descriptor.c b/crypt_cipher_descriptor.c index fd69d5b..4a8a943 100644 --- a/crypt_cipher_descriptor.c +++ b/crypt_cipher_descriptor.c @@ -10,37 +10,5 @@ */ #include "mycrypt.h" -struct _cipher_descriptor cipher_descriptor[TAB_SIZE] = { -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL } }; +struct _cipher_descriptor cipher_descriptor[TAB_SIZE]; diff --git a/crypt_hash_descriptor.c b/crypt_hash_descriptor.c index 1048be8..5c02255 100644 --- a/crypt_hash_descriptor.c +++ b/crypt_hash_descriptor.c @@ -10,36 +10,5 @@ */ #include "mycrypt.h" -struct _hash_descriptor hash_descriptor[TAB_SIZE] = { -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL }, -{ NULL, 0, 0, 0, { 0x00 }, 0, NULL, NULL, NULL, NULL } }; +struct _hash_descriptor hash_descriptor[TAB_SIZE]; + diff --git a/crypt_prng_descriptor.c b/crypt_prng_descriptor.c index 593516d..129118f 100644 --- a/crypt_prng_descriptor.c +++ b/crypt_prng_descriptor.c @@ -10,37 +10,4 @@ */ #include "mycrypt.h" -struct _prng_descriptor prng_descriptor[TAB_SIZE] = { -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL }, -{ NULL, NULL, NULL, NULL, NULL } }; - +struct _prng_descriptor prng_descriptor[TAB_SIZE]; diff --git a/demos/test/rsa_test.c b/demos/test/rsa_test.c index 3e72e44..777fc87 100644 --- a/demos/test/rsa_test.c +++ b/demos/test/rsa_test.c @@ -21,6 +21,35 @@ int rsa_test(void) /* make a random key */ DO(rsa_make_key(&test_yarrow, prng_idx, 1024/8, 65537, &key)); + /* test PKCS #1 v1.5 */ + for (rsa_msgsize = 1; rsa_msgsize <= 117; rsa_msgsize++) { + /* make a random key/msg */ + yarrow_read(in, rsa_msgsize, &test_yarrow); + + len = sizeof(out); + len2 = rsa_msgsize; + + /* encrypt */ + DO(rsa_v15_encrypt_key(in, rsa_msgsize, out, &len, &test_yarrow, prng_idx, &key)); + DO(rsa_v15_decrypt_key(out, len, tmp, rsa_msgsize, &test_yarrow, prng_idx, &stat, &key)); + if (stat != 1 || memcmp(tmp, in, rsa_msgsize)) { + printf("PKCS #1 v1.5 encrypt/decrypt failure (rsa_msgsize: %lu, stat: %d)\n", rsa_msgsize, stat); + return 1; + } + } + + /* signature */ + len = sizeof(out); + DO(rsa_v15_sign_hash(in, 20, out, &len, &test_yarrow, prng_idx, hash_idx, &key)); + in[1] ^= 1; + DO(rsa_v15_verify_hash(out, len, in, 20, &test_yarrow, prng_idx, hash_idx, &stat, &key)); + in[1] ^= 1; + DO(rsa_v15_verify_hash(out, len, in, 20, &test_yarrow, prng_idx, hash_idx, &stat2, &key)); + if (!(stat == 0 && stat2 == 1)) { + printf("PKCS #1 v1.5 sign/verify failure (stat %d, stat2 %d)\n", stat, stat2); + return 1; + } + /* encrypt the key (without lparam) */ for (rsa_msgsize = 1; rsa_msgsize <= 86; rsa_msgsize++) { /* make a random key/msg */ @@ -47,7 +76,7 @@ int rsa_test(void) return 1; } if (len2 != rsa_msgsize || memcmp(tmp, in, rsa_msgsize)) { - int x; + unsigned long x; printf("\nrsa_decrypt_key mismatch, len %lu (second decrypt)\n", len2); printf("Original contents: \n"); for (x = 0; x < rsa_msgsize; ) { diff --git a/demos/tv_gen.c b/demos/tv_gen.c index cf75d3b..17f7ad2 100644 --- a/demos/tv_gen.c +++ b/demos/tv_gen.c @@ -86,22 +86,33 @@ void reg_algs(void) void hash_gen(void) { - unsigned char md[MAXBLOCKSIZE], buf[MAXBLOCKSIZE*2+2]; + unsigned char md[MAXBLOCKSIZE], *buf; unsigned long outlen, x, y, z; FILE *out; + int err; out = fopen("hash_tv.txt", "w"); + if (out == NULL) { + perror("can't open hash_tv"); + } fprintf(out, "Hash Test Vectors:\n\nThese are the hashes of nn bytes '00 01 02 03 .. (nn-1)'\n\n"); for (x = 0; hash_descriptor[x].name != NULL; x++) { + buf = XMALLOC(2 * hash_descriptor[x].blocksize); + if (buf == NULL) { + perror("can't alloc mem"); + exit(EXIT_FAILURE); + } fprintf(out, "Hash: %s\n", hash_descriptor[x].name); - for (y = 0; y <= (hash_descriptor[x].blocksize * 2); y++) { for (z = 0; z < y; z++) { buf[z] = (unsigned char)(z & 255); } outlen = sizeof(md); - hash_memory(x, buf, y, md, &outlen); + if ((err = hash_memory(x, buf, y, md, &outlen)) != CRYPT_OK) { + printf("hash_memory error: %s\n", error_to_string(err)); + exit(EXIT_FAILURE); + } fprintf(out, "%3lu: ", y); for (z = 0; z < outlen; z++) { fprintf(out, "%02X", md[z]); @@ -109,15 +120,16 @@ void hash_gen(void) fprintf(out, "\n"); } fprintf(out, "\n"); + XFREE(buf); } fclose(out); } void cipher_gen(void) { - unsigned char key[MAXBLOCKSIZE], pt[MAXBLOCKSIZE]; + unsigned char *key, pt[MAXBLOCKSIZE]; unsigned long x, y, z, w; - int kl, lastkl; + int err, kl, lastkl; FILE *out; symmetric_key skey; @@ -138,15 +150,27 @@ void cipher_gen(void) case 1: kl = (cipher_descriptor[x].min_key_length + cipher_descriptor[x].max_key_length)/2; break; case 2: kl = cipher_descriptor[x].max_key_length; break; } - cipher_descriptor[x].keysize(&kl); + if ((err = cipher_descriptor[x].keysize(&kl)) != CRYPT_OK) { + printf("keysize error: %s\n", error_to_string(err)); + exit(EXIT_FAILURE); + } if (kl == lastkl) break; lastkl = kl; fprintf(out, "Key Size: %d bytes\n", kl); + key = XMALLOC(kl); + if (key == NULL) { + perror("can't malloc memory"); + exit(EXIT_FAILURE); + } + for (z = 0; (int)z < kl; z++) { key[z] = (unsigned char)z; } - cipher_descriptor[x].setup(key, kl, 0, &skey); + if ((err = cipher_descriptor[x].setup(key, kl, 0, &skey)) != CRYPT_OK) { + printf("setup error: %s\n", error_to_string(err)); + exit(EXIT_FAILURE); + } for (z = 0; (int)z < cipher_descriptor[x].block_length; z++) { pt[z] = (unsigned char)z; @@ -163,9 +187,13 @@ void cipher_gen(void) for (z = 0; z < (unsigned long)kl; z++) { key[z] = pt[z % cipher_descriptor[x].block_length]; } - cipher_descriptor[x].setup(key, kl, 0, &skey); + if ((err = cipher_descriptor[x].setup(key, kl, 0, &skey)) != CRYPT_OK) { + printf("cipher setup2 error: %s\n", error_to_string(err)); + exit(EXIT_FAILURE); + } } fprintf(out, "\n"); + XFREE(key); } fprintf(out, "\n"); } @@ -174,7 +202,7 @@ void cipher_gen(void) void hmac_gen(void) { - unsigned char key[MAXBLOCKSIZE], output[MAXBLOCKSIZE], input[MAXBLOCKSIZE*2+2]; + unsigned char key[MAXBLOCKSIZE], output[MAXBLOCKSIZE], *input; int x, y, z, kl, err; FILE *out; unsigned long len; @@ -193,6 +221,12 @@ void hmac_gen(void) for (y = 0; y < (int)hash_descriptor[x].hashsize; y++) { key[y] = (y&255); } + + input = XMALLOC(hash_descriptor[x].blocksize * 2); + if (input == NULL) { + perror("Can't malloc memory"); + exit(EXIT_FAILURE); + } for (y = 0; y <= (int)(hash_descriptor[x].blocksize * 2); y++) { for (z = 0; z < y; z++) { @@ -212,6 +246,7 @@ void hmac_gen(void) /* forward the key */ memcpy(key, output, hash_descriptor[x].hashsize); } + XFREE(input); fprintf(out, "\n"); } fclose(out); diff --git a/demos/x86_prof.c b/demos/x86_prof.c index e968554..a478614 100644 --- a/demos/x86_prof.c +++ b/demos/x86_prof.c @@ -45,9 +45,6 @@ void tally_results(int type) } } - - - /* RDTSC from Scott Duplichan */ static ulong64 rdtsc (void) { @@ -195,6 +192,9 @@ void reg_algs(void) #endif register_prng(&yarrow_desc); +register_prng(&fortuna_desc); +register_prng(&rc4_desc); + rng_make_prng(128, find_prng("yarrow"), &prng, NULL); } @@ -342,6 +342,101 @@ int time_hash(void) return 0; } +void time_mult(void) +{ + ulong64 t1, t2; + unsigned long x, y; + mp_int a, b, c; + + printf("Timing Multiplying:\n"); + mp_init_multi(&a,&b,&c,NULL); + for (x = 128/DIGIT_BIT; x <= 1024/DIGIT_BIT; x += 128/DIGIT_BIT) { + mp_rand(&a, x); + mp_rand(&b, x); + +#define DO1 mp_mul(&a, &b, &c); +#define DO2 DO1; DO1; + + t2 = -1; + for (y = 0; y < TIMES; y++) { + t_start(); + t1 = t_read(); + DO2; + t1 = (t_read() - t1)>>1; + if (t1 < t2) t2 = t1; + } + printf("%3d digits: %9llu cycles\n", x, t2); + } + mp_clear_multi(&a,&b,&c,NULL); + +#undef DO1 +#undef DO2 +} + +void time_sqr(void) +{ + ulong64 t1, t2; + unsigned long x, y; + mp_int a, b; + + printf("Timing Squaring:\n"); + mp_init_multi(&a,&b,NULL); + for (x = 128/DIGIT_BIT; x <= 1024/DIGIT_BIT; x += 128/DIGIT_BIT) { + mp_rand(&a, x); + +#define DO1 mp_sqr(&a, &b); +#define DO2 DO1; DO1; + + t2 = -1; + for (y = 0; y < TIMES; y++) { + t_start(); + t1 = t_read(); + DO2; + t1 = (t_read() - t1)>>1; + if (t1 < t2) t2 = t1; + } + printf("%3d digits: %9llu cycles\n", x, t2); + } + mp_clear_multi(&a,&b,NULL); + +#undef DO1 +#undef DO2 +} + +void time_prng(void) +{ + ulong64 t1, t2; + unsigned char buf[4096]; + prng_state prng; + unsigned long x, y; + + printf("Timing PRNGs:\n"); + for (x = 0; prng_descriptor[x].name != NULL; x++) { + prng_descriptor[x].start(&prng); + zeromem(buf, 256); + prng_descriptor[x].add_entropy(buf, 256, &prng); + prng_descriptor[x].ready(&prng); + t2 = -1; + +#define DO1 prng_descriptor[x].read(buf, 4096, &prng); +#define DO2 DO1 DO1 + + for (y = 0; y < 10000; y++) { + t_start(); + t1 = t_read(); + DO2; + t1 = (t_read() - t1)>>1; + if (t1 < t2) t2 = t1; + } + printf("%20s: %llu\n", prng_descriptor[x].name, t2>>12); + } +#undef DO2 +#undef DO1 + +} + + + int main(void) { reg_algs(); @@ -349,6 +444,9 @@ int main(void) printf("Timings for ciphers and hashes. Times are listed as cycles per byte processed.\n\n"); // init_timer(); + time_mult(); + time_sqr(); + time_prng(); time_cipher(); time_keysched(); time_hash(); diff --git a/doc/crypt.pdf b/doc/crypt.pdf index c8f5a9583bc45801efbc699d2dcac92f6506f6c0..b7555f50948b3d384ed15bac7c0435eb4719830b 100644 GIT binary patch delta 95857 zcmV)9K*hh)tQWtl7m!DPQMq!%AQ0{O3QA`tTC=cRsWLg5OqwK2dP_c{jAhxDT=?&^ zU@1cZyldaUNh(08@|yOh6DP6!B)J>JNn)Yqt?A@bVv?`uL8B#^w&LbPsWkyQX;p+6 zWa`A?y{*$-`W40iMi*I?)?(3j&*$rL%tU1nVrDAM2UqCtOrQdPYlE8{oAc22hm4a2 z(*H>cqOUW|m5fA=uvX_v6%hn&t*ppEDB4oQ0~yVdxkwom!BVsn_EmZzaV?t1zibZe zQ0iI_Dmuq?Jp?M`*muLY&Wgu&^;3p$pi*<-1)5dy1`j5~6^E;vx5ynJMn9>?@%XS@ z?%SGUoBT@9pLeAwQQ)Bgj4rab%l?{CZNdA1lUbYln-l`_4@{s^l+o8DKSW-C@KtlQ zlW+kU12Q=`gNy-(i~#|Mi~$0-i~$2#r3OVtOio8am+Phjs0m^(WiM$jZ7*(@Ukn8q zm$#<_S$`Dg6~Jd0*cn0NqfRTv%x-$9FBG)J@`x!~6r!l0Xtjt4EL+~}gI#2Ux;&J9 z++E(UW!+^LSVav%2`VN+Nf6Xnt5%7o(Wce3wc1lPZSu|bqqVbQdUASldQSi7nZI_< z-tXS~`|kY>N%;B@BuP$N8@pjs+>e7}Hf~uS?tgtD;a?{Cc|QCrR4%Um`&v)A-`n%1 zyfF*q%|vUaqtF=yMUt`c$uV+;R+W>Lt(Gi|StMB=85u5FT_98CNYe`?8`IUim4k7H>q6WQ(jwrYe?YK2I7WFHmUIGL>YbJX5ABBnaYL8?=S; z7=MLKRiw_@`jdi;@W_y51hJGzCK8B5B8b>b#1cuwR$?2mo>)PI6Pt(_Vh%Bvm`=rG_iwtK&FvnK2biyR1jtG4fa*}UhoU^J1*KSxX-Sil<_8GbK{*0HN`9yzt z4cwjpH~GmGitj^ptX5RHa6g`nqk#z#Nq>#CJ!1Ye-D_#O#kt&~4C7A7fP6@TLJOm$ zuQfxec;Y0TS_ZM4lFy=FdPaVB?g`#)Z)4v(0`%{ zYECNlSH^CDGEh}(?H!gTD;#1D>Du;a%Jyod{e=Ugy(5F|oKVj{??}MSOKjxTVU#&c z@jpQ4*`e~^VE>gFo1}X=(-RT)FY{BGArS zJ~7%#|8eBn_3?&vJ2_nW-~K7&{eRG2R%z$MY$RMp-Ipmo2IaD7cF1F)Q!-?M0C?7e zU_>JF!6P(_!>KrpO#$fb3pHy{bA4`FC0{Kj1f?}t9 zS6Yb-7~%SCEvri1o?tf#xA>xV%0qfyW9=sMLA}YOJHYJ@Prj7U`y&X%(SJA;2jdK! zi9+#WviVCN-`z!6>=0XYU~B}Y z87y}3BvHKGjaJzBWp*!B>tzZl@aya(qXfD;{gh%Dn8#1;Osk5TYuAYbP$-E7nWfW7R86G%*s6UZh?5e3+liobWS$!R#e)N zrVXumj`)CZwKI{9t*HSEG%-)NeTGG^hR?^-@wXoae}R0@eBrD=2*v{@qfXCh;V5gWYN9f==j%4llbzV_mP9 z7txaoAoz>vCXxFJXWGBW&Z(^mNUDS%AtlcOC>;m)#lfwWyP%{&Kbe5qkf|Dyn z@0kb9=inR+nt$FiF>W~>VQ3ak?W4g3E%urQbGHzQmO@)$D~@99A|ctSM55H`kqF!7 z38VOX{C&33Wjp;#vrv-Ss1!_9B-l~yHPxWOk_`u;%y7U^iGMoLGzVw!y@q;YEz|}c zeg~X_+wzPlf(ez70!7}4QE1k;&xhZVY*!a8?+=G3Y;X#_DwUj0%PM170UxllSTp@r#wYOTt|W zMfI~?du+vfic3|h_EKlN)7HhksL$pJe6GNH;VTn?##y*%`fK_pKf9jTwHzBgWN;E5XX8Qk!M}o;s1`$qcq}~3*0i3_DRz7u# zt!e7i;nu0s2;yHOzk9F>Wo~41baG{3ZI_B01PT@~ATS_rVrmL9Ffup_Wo~3|VrmL9 zHkSb<1SbYgOI1!%S-0J=1A+m6h^QdT1IU1=j6$sl0xfIV?7q@AO-uKXrOloahbU@dIe!bWGrG@KypK+EaPycAz^PTs+@9+IB zhszl`g2Ux<1J}Q~W&OtObAr}wUcGRE|C{N)sa)T*5x(E>60zx9-$3DiDDSiz;LSp9hSwXX>FI={4>GTz;aT!T5QNro#qB0ZXQlm1- zFDcVErNt!0W#-MFz9J=M`bPg1d!}!U+Y^_O9Tz)%*PygiQC4PL#`JY*v2htf4oCjn ziacS=x|M0ML87>j_>6>qJ&7ALlQv~#C+DO@y_p*Q+a=@XEt|h!;i6fKXLDOPsT|G> z&JIop=QYlJ&QqLFPB3RCX9MST&H~OV&L++qoXwoooaZ@PIBPhIIa@hloVA>7oOPU) zoVlF!oFL95&SY{#Am<6rqnz=a37mk$mJuy z9+knL#V_LjH9$vERNZKH^ao=Ok6k$S@;LV+YaclkSpI1AqcOs(xEXk!jQi*`RymJ+CRDnJ~jwbkj^$N|3Iqc@2`AO?+6C8ts_ zkFLhIM&USq;CI~nMh=cD>$}zC@y&F}Jrm0B3eT0DoILS=8#GWy$KhowBDMpyQ_^NO z7z|be>ou3uLpkLZJMv_)s!d@XNpFAk>EHgVmie=fF<6XdFbN!rvYb?QnX)u-+F*a}g7pH-8IJD_| z3Ph4vHa$3heFcP3i%$zr^muEWPKI=I(b6k&k8hrbi~3Ghp5vi>6hxan7Pr~sJO+k} z#?qSZ>o&r@O zi|cGPtgEjBjfB(G?aiJY%XWt3N*U$Rq^3wnfSgR1*|h@?0a};owF4zg+3n%NRTOoX z=Ue4_gx;=#XmXa=A+D~k@w6R{Y<&|yhG{$lKQrsh>ffWsKmJRZS>aG<^!fq?vtr&N zO+HXtGP+Oq)qh=ggl)Ohms++1AQxQ#%55J4Lq3Zi=VyTyfdkI`4SULGJ{g>klcvpFHt1 zAMG2Y?JZW=2NW8^zf-&_Wy$ZJ#(Wk};iKe28h-`WzyAq*KwS&Hh`9{D_)CvBb+CQZ z#J?sfNI6r7{%nVG7JbY|Gf)5u`0C>~dV=gMo{n$Q_%VJ8n5-64vBAP#Mf*pgSNWe= zew+T>OHbhuq(ts_(?r8~B*QJa%JW%}m;NI3%HoI9oOxm0$LKLclcS$yum!v5*m&=? z-hVp8Yd*oYo;%WX5U8UK5uuS;Gm}GD;pT1OJAnGZxhVb+7y5a=69WrrgUM(EBV|{a z6xss4Udzl<$n0Ym>K8j42hsWT#_?aa=!Pi^5+(+A4 z$Bx$Q1JDZY+A?otTghp1o_`@^dVQ9Pk$-H;U7G|{I@Fh1q0CalhSt!El=Uxd25Oh$ zOjEBHjjlYz)}HI>?Eo88>nqcW#l=F%1+8AAQ<1VqTr~7$c?aeZAl~B*92;0p8;T4T zD58vdTY*ju@P)U7ZYC*1wGolcA!B8EzWh>P2&h2I5~wfZ#(%FM0~LssY3!Ly+P44v&9{N-F5Z|NCBkEcZ?dwC z$lz^2Z78^FGx^8K4%36kgI*#Kx`NbgJfuKkx(P0uj#S-jhD%_jdg2ehIRiiS3=Up+ zWXTu5%nfVg?;dO`?zYym77yKtUih1-7^wDYQPPum8SM5i)BkwgS#<+1)PHi}zAx@B zZ=lf^N~0H^{u7>nqi_r^zNf>EF-FMofPCi9b}if5&a36p#fZyM7cH@)RfeoTYp#SEj@UAjbr!g z3EQ*8jJz+lYWKfL|4r6Lo6%4Iq$wpIeD3iDdUT!%a7WZXdE(dT(>^+TscgF{J1t2N zvnvMnf)r9fo;7$+uhSQTP9V4Mt#Ugn944ly ztQk$RHVhjAdyBzX+3afWym0kDVF=zxOiWGjTaXV$ky#$1OMM=6oaoYvh`ay(b|FrGx& z7Bq0t_t~WUtFdB>m_>MwQ$#nil4a0FdrCv+uL}k`ktOjGT zjd7IJH5WTuw_MzNoYCJ40S7w^qkZVq{tBpxz`OVNl-TvSYcRz1f zwSOXAuhe8Qdda9Cs^y3&58BPWMl3(iSL~Zg8!ZOn;i(^b_-=I`=nAER+%#co1W^C3 zk?-5z)KtS%Zs}B2{VEqS1P#AN`U`#UT_0h}@q@&&s&inkU~5bKkv3O-t&^!ZPXvXf4FDF%WHv9lr1%t5t^y4zle(S1XIH*<8sU zKr<0bk``{Z>;)ZRxa2s!lz%8gp4_Ulwvb%d$}~ZINN1_L1{BNS_^l+`*HQK=EX|G3PmGHSINy-v-B=Y%U_Ap&BHh2<)f#;76e zr&DR=ui#Tt^jf{b-+vuqRjfvn)yf<@`?j5cpu?58WwUTbb_^TwVrW)8>E(Kt{!b=7 zSv#QiS2b3ovS}Vj}uLtiss&oxUu-H=zL*3`>Rct;V6K^x4_tL|z(+)k3>|;GO*Z)atJFmNEaBF>at!LvP`X z0*4av8LZ&j+JB8sTf6H^=LHlVd*FT-dImk+;P>@$XBME4lUzU+9y*0W z=qfTKQ;E@H@errv_m2z?Po$JqCHmGDC4u7fj)|VdN%v$cbYpCcF&$kwx zq0^tt2#MH~oxU?{9i%~$RoZx@$ka|Kw^UJ?o|Gp{*xDmH|K**JE+1z8f}Siz!O%t3 z1Db;;;mLR+o`GkD*W!^V;A~g>VK0NHtf60n_e$HE(A0)rw#3uf|1MC+%6CQvMUoW! zn+Hx5zJDQ)z~!Ng3$#b@{Jp)t7q9@+@yaPRbiRt*P4K0F?D13ZSNhe3TKD>P$9XW7~ZM}ZN zv!CF+CH2h}!MG)IE}OM$`?j!$%LZOwnip|hTz_Bq0R3?7ZK@)bO0VB5V}3U?SSi%1 z{i~l($x5K8?5O3yVFr&G6e^Mx1SZ1 zWSLY3CCRN_GgJ=~9)&^Qlz>Rle1`##z6 z3;5~9OJ{{L;i9NLQDMPL<-r7pG;u;&?|sWPyxeUw^7c z)yQ-j-2lUoaS*C9MM`Ej9v^|ny@sim@#BkvHCm-MIUmH7#wxX0%1Uew#%{A)&p;)( z;DFqzt|{;+;_>V$8o!2WsO$=Lah20iZDCr`GZwuKEFfsOk5h@URr4?Iw-Bc0EKF43XwaB;ikwP#DtRs0Re~01`r4rNy1=JaS_3aZW%_p7I#3| z?Yi3z3ry{5?fK~IjvHo5XLjDd&L8i4e&;;z^9U#hAtew9oa6`n4@3mLEe{O#S*&IJ zS^>X*PRPGTtBLWKpBD;6mUZHpRT#b!_pHFpE)*>g_yrPAMVh@xl7*Pq`{t zot~!D$O2U{N=*tyQOo_d@9^2_>*=+1+eYtyO%(My^$N9`a;Mf%uTm?iRg^2`MmbU} zwTyDMPe4hiQo%cdKMCIyUZ(fcy$%8gwa7sfCbEe|F9rE?H=SS7hu(JqD~4G4_e}ym zbitoJQ>U#s2`52YeC9Mc{bJg^K$8{a1x&1@+i1~uLoZC6EeFObiBg%&m3l*2mGnA) zt`MP3e4DH{lo*SlWQ{5m)Lg7&z%XjCKtDXtR+lo?OvynguF5wvWQeb3(Tz-s$a%5z zOQG+Ho0(nzd4eC9(e<(5mK7^!Y23mOvo~@(pbi*xpZu=2y4YBv(}DJ^G_^1+(+^Y- zW(a60IH!YBU~(bc(!_q2 z8VLb#(5e~h(f+Xo+L*rMmASf4Ak=Hx3!Tsn9cFPAinc!^E>Yq6$|!D$kY~*gXD#gl z_yHT{XnYGFvM^mS(Q~(ZXvj7S9nf23QfqV>S&+hL>eD+q8cglC6@wee@5u&#;!YAt z4La{dAv!;w!PV%x{@=uLcU0J?=^U;j_t*%CY0tQl-BC0EcbNIx4<26YJaxQtl`KWx5J&JrggE zBMG8zv7xqVtgfoE{1MdJH<}`UPE>pxn4u!8$-X?Y4URDRaIF72T)n{cN&v%p|J66N z)TnELwhw&=$8XYz_+NIiXP_U(nfdjDZxNxF{GFps@eP?=Lq^5fk+_i5jiK;5Luix) zq8MGDJwj?M=2lQQms=TU%Bf_C&n$bQR@DYJ=BsaP_b10AKiK-lr#hW~PG45c$^F?| zi3XTD+L}FJSBu%V^XT?1dq$=whQGXj={Fs^W*?dP)pn#gZ1{oZci;_{=*bG@N9kdP zPBnMA%-9X*nU<`klM4~Z$6^&p9?N* zn@+Fd4juL^{e01)7hw#B&CH7mNdn|<;FPiA20gAY+Mp9~mA1+5LZxH_T(~6t^|fzt z{`rhm0MD^#p5_f0z{ZQU=>k)hFJ!edrS~F;^O1I z<>S7Rs*COQ)`nt#OE}m0mwQe9z&sh;yURP!KQUHH&XB@_LePO~4e$Az%fCh%J7&E?BuOb8F7&x4~pJaJ))5I8>%lsBh!`IoTO4^eZKkGhqxT2b2CpS z4^0wbGxt+Z&jYy2OnHtFn$SB!cgHuK?C3N#o7*!RlMI}H<;r-q4VbH6rF$!Kj-5!7 zCMZ?92(88*A0?%Xu1J@ka~|sLD-hgBwh=?)FTo}O+_Qh~g+i7DlUE~19FWaGJiZ_* zj3hFqvIc6(wT9vfDOrO~k@zlP0ATY|bf2CmD>EA598;4AMck4^=w{_3?HUbD(tIoK zWUYkegC&iBP?4T@7IF$W^7j{?iDI$eR}v3-yEt{McrhuhV1rTJfR3@MCA*-eTRJV- z%dcl&2uZ!<|5!2P9{ru2wKxy*N{rg_V(CBj%#pP~s(~m2$W}sa%E~G&g%ZY|##J@5 zW4LmRyYjboqyQZOJrt-Sktk!FGffNcnMg}5rc{X@iK1F!T{iVQZkdCR$;r`N>Etw3 z=d_%n{s(jSZ48%y8w3=Wy3PX&3pWa7Ze(v_Y6>womjNXNCk9DIP)So%xBbooYXX1o zBs9~TLouehcifwBx8)+M97*oINODIuw!t>NhZYDgKu7|Fn$TWCAR!@loa^`U-?0rz z{x2`@t@nLsEwdy|x%ZsC_u1!+EU50?C<_aVKC70mUuC~({1Us3Q>O?Y4CMz~@I$)s z?}$9G{uf1CvSq`NiN03+>H(;*ADVyMpAuPEEMK#INpMJX*iIkch@oSaj2$|4?%df! zZ3Df+c6zu44YhNN@bwCGiy&_ThS~>v?DUF=o;1`pAYkZ5;f(O18@T!)bK3_?LcF%GTN>)Uep#5$@^F9OjVmH{ z+OL%PZCbU<-(huRfZOIZQGxDT7R?+te8;Tuy=PAt*2ihi#Mrr$M!YxKb;{IH^QVn= zoIYmZjIq7?_OooT=-EgGHc>%)Eqd*<=uJ@*so~UiY8|zdnoCWhMo>Gb_0%%zJ!&#F zlG;Emr{1TgQ14P3sTI^zY7~EEPpzazQ=6z&)O2bL90P&D0udCN+-QLan7{ zQRAttlpVF0noUihwoxBYOQ<>2FzRip7Zpj(qXtsFsX)q_>O*y-f~WQ8`TJ*H&MHak`B#nISL_L47i0mfn<{=s@ zI^BI~_cF_FmU{8q;u5+)T|i@IGgIH=?H+kOe(f31^KP%Ty{GlA=wsjKX5WH-v-`>W zec3;Iz~lk?0Y6#ov^pZ0D!KaBs<+In2WxzL&fE0^9j!U*uWbSbjUM!m!F59x3^_jJ z?mK?(9OT@&3sOdEC;fkBXwRWJL+gj08n$s*`0!=J6NVocL5+wTadu?U$b0X8@NWL7 zfuov74;Y;}`uUhOWBZI_#EZ<{5Uk%xij%oZ;nqWhI1{uat(!^HA;UNdb8L^H3i(k6Xt`jo(ZU+Z|LMc()ND}+D9#4z=a3!rQ*JA z$>gfr%={{Y1+>|U_~C79*|Y+6RxHGVN|6?iJ=(vqj^64K=b&K%=yL6TT_c#`gt|_{ znCWd{l~sCeu2v^Kga%q75TC>owMv}=ls19(5W)q}jryyw7xu#;O{k?h>I6(nLTsIO=3t zvIeuJI0nKXNuy3n9ECO3ScFWZ2$VsgFB;cw zVV#x`@25zRZ3r3i!sCbTrNrpi#V`;&$H7T^JsF@^i%x1Ntd3>s92 zdgtaQfht+8RH(V2NvjjRf!RELKbnbV-)TLWb5Y~dAniawn+1t|+eQ&Tid-1IgPcrt zd+Hu)ZOpW%#!(#x9nsOwD`zCr%_--0HSTx)k71UhDH@R%}EW`9ptM z6Y2&G5{q$Nd!J-Es3FZJK8p|w-4&Ohb(Ue`WZZL?3uZ`6dy4z=DtRS8#U!9|_gxY1 zkNjBl*63Hb4<0ZMTM%Vpe;ki`pg!M!ha?;h#g42ixEMnYg&lwk&`3gfs^UQPp~J>z zH~{-)RjyU8uz?`Q2OMNBGG~{dZNPtYQc-S_wemJ5_!t=QOjcj zcR0&j!5Mt2!uN)@sLntOH0jRQ9yFTw)}Mj~XpJ*F=f#jnL^E%wg04Rh@jrj__t>Tj z=hEv0oeEHUXhI0&H|RnIooXqLij*r7lnN=Hi;Z{{I+B`80-j-GtV};hRLX}i#1q`W zN$W-!Qc8aU+4AC0%Xw75}!tpjM+I`|PmFHq&~lOhND%{mCu=hlc&T-!7@ zIbWlVB3W4wP%AD1gQiGRuF`*MAc|=(`%A=^&>3l3O}c`g(EiLiCsC`(0;UkM%B1{J zx*86@B#ZUcY*+h%A8gn83VVAAjv>Su;MIWHq-ytbtav>{04vHj=GzEW;7&;eQ0P_Lf zx(6LcC(xEX7m&rnDR`7Ys*49zAuz?DH%dFvfH#}b1QT!58dhm_^9m}yJ5X{PEkTdi z+T%xSj{|f4!gOqj`z)Jn>)~Z+36aJdK???EQ}>M6R);SLzI*-n9b%DW+;iN0zMG3I zQYv|NxeGkkvJ@`TcHe*3!o5d(LRSUVaJ(~Sof1Efek00(MzpvC|H+pLu}~~)(u482 z!!v??X7Wh#chFDc5RLjCM540X6kS@fT9Klb`i`6mNw5t(c1JV?9)Ziy$Y_mhCK`LM zat|;sbMatLVXGcPLSPU7PZC~UE8-8d4PmqL$WF4DVg*EU?VEoHZDoYES;%ttZ8V4M zYpS^2rX8osK?5l^F&SXwcsIgZ1L187mPSp)b_5}FNYNGbINx7Z)i$S6$ehbdQJWWf z!Xj5Zo+M~BUV$g#8Q2}Wp-FfOT8>tu@n|}7=J0*|H9H;;`Wh9Yd^GBlyI-LZOK}b^ z#qZ3XEG!s*E$@E<<^x{xLe$W(NF$7)`|srTDFX3}rhV%-&8# zd?Ee_uE>rr-M>C(Ch;&>6t&K0dt}JQ4Wl|VK`;%SC>U26X%IxAm=x&SeE$n9Uh!AS zv_PToavoBj`Y!(!CYNtIgqZ#+IO%}H8h@^_!Q?+B}TI^t^yu_{QtC?$aLD)j%^GhGxR`U9_!GRLDka zg&U#0Rp@`B5LI;Sr3gi$D=eBXM!gYr`^9%-zQ*rJ@vGmJh}ZJbp#O}N%DwP8H2hYl zRH%eS<()BpC`Qv^*mg%CreXSTH#=`e^?L-LxxG@P^L1%2a=fgOSX#{rsEd8Q;L*GlD}4rBJlH zY}Vyh4+csOqD41ZG>Me2hhJprK%?VSn#e>5WrB@yrqas%y1IZ`*Tp_7UE?{)4b+Xs z(%&TC_}9VYRoJ~8Z9IFg96`AioQV7!E&jaW#6Zc5j~^cuM`O%91n zOhICCZdq1&Nn)L6q>IAcjdQDa)60OFw0!vj7n4`zE@?tsv>*5~k~Rn^@G?iPi}7~_ z4`#{pO{g#G`Q!1M4e`gf)^M9^HoynOD!P9{s@6Y!ml^6H9m-1#43gkq*-^`npFFg; z>408(PW%9MhnWsbw~ZCDs6F4GWbv>W9qP#9rb;wIXc*e&vF(TcXC4SlZju_)0*^bY zj2}G#3L2zH^ML*~_jP_}C;5%%W}?il{Pq^3aZqVrj5(5Dl0*%WLK8o$%nHgQj-Y>7 z@@JsrA@W3s`TUN&Dbf7CO zJK%OuV$oOo(|uC5jgz&t|TmH6G|;qT!w(iaKrvx=J+;3o4e7T?38IsAXOKM{aG z`iCw7K$*1U7^20+#6&mj-0MS3%Su=c9xYxiKBpDCfw@_7rzR8fNNG+^)kqafeWSx* zJER6b@Zj}^_$8ByWRgFsr|_Y6lUh%HCvG~GV7s#o#4wJU1SSn%^rEc_%$U3_Kley#8g?xjlkFr+zIb<$1IL1)I?v zgT?(TXi%jH*$NUp!i-0twP9k-+`yq@m5l5@uBCCmr-_Z%YOY=4&V+w$qHP1cyjQ~G z64D4-umYQiLZLpdtXf|!Bi8dNTE>6C;-La8KF(1P;W52VcAfT=u7a4xhR$TKQfBOv zO1@9$_p)_i#^3;1NN9*D)Lc_(tn2DAiG7+Am(VAdHj~_6M?dh^EPl&uSLAsL z&e~i(b>Sv@--PElXL5g91t{{m5RaTX!jY=cB&Kq{8v|?ITc(k4h-Ob8Hs|Exn<3IX zN_9!osL4$M)oVUFcJMJvtINyc zK&#i+pEU2h8i$-I;CZ>=)5TX0)ec7IEUCh;M)6e_*?sAF;2>mNXDbh%;L!c9Z*GEWniP+t=fe~<;ll$pAJuZ5bsxK#iofQ=I{*PsPW-f* zK;jqVEkI&|aN>WB96>3D($2{<*Q7;2K`2+0ZYYFmrYhPH92^}Py5+;*GoOES=`km1 zZ=2M;HoPJzC_FqUs3N?!wxU9~i{PsX=H?oaZIcC5qU?t#o0Q^7ZFAXnB#!DZeT8Ud zQ9T+@`sFIfRU4HchX{tma3{nM=R5+$E&3ne5P7|X77~9S4|+Hh?h%?)q9lc->3Kww z%7C0+c?x;>tK;&I#Q?(CDiFgER?9~y!&2=t9x}qQejl{@0GhUZg00oeqlb+jU z4N36mS`FTlesX>sLR|lWMa`9`-Q&db*_$E|TlJsJ%3f zq)0bM$#>VAaK@22}^3!n4-x$1*p>! zrr;dwF{nV04!w+PZ~Rfj_$1a*IAy9tWbxd|DHyuhrenK;dQ0y3oK3j>VT z$9JMb37fS(!tuu-UzP8Vtnkm)8S(lQ0Uf%`jKc3xqxBECDP1mnWK#h8PQ-Lde49ll zT$Z)1X8%RnPwFb6lC;lFZ%V!}0Wrmxk-xF}(Gims+}QC1&AxKIa-bwujvjo$rh9)> zyB!9`c%ksN^usWFdPA5(?x#GM!68SQ)ZcwRO`iL<74HCM?sCUffrgl>no>hmep_hLv@>iAxG?WM3%hvvQ1jt3E)~sTN7ECQ>~!Al z-f--6>s>TAlM`TOY#Sz|Vuz^Bg1>*m7B*GaexmJ~RD_byc1^AvP(A@a-}_VU4c+FDrk<5*jh6 z8(M{pnaMc`kZ2R=N%~}AW+)7z8(?q8%#e0~UFm@bev=Bz&IX$ZMIyU<@7|*oRp!Q) zqQgS4Le+sC!P=}#5VmeqXD2``S#m;}!fw9x{O^;6sZOR16cyzdI*!+@QpdtBaMXqf zIJ^p4&Ea*=F>CF(4%ChtcWi%HuigdZiz=O2TSdg7Rb3%qNv2ONfFdx})?fIv)-zka zZ(Fv!AeQhWIXNywn0oHkeyB5%PIjMWcjpeGbrH2f#BGJy;vdG;9W}4v|7ueGzny6d zK03xL{wv!&=Qs21&;P&qc4y6&8~BkO1HPM=QQ6&rlA~x5--kt4|Db=tPb+DyHoLI; zFe8bJC~DpI+2Gf+oUzZbc)qJ+bgWd5i&^AO6O?N6iuZkZI=cc6LStx!SCzYdBe;XN zdR>t7t^hAT2Vv@05#AJUB&DI0M66!hx`-A~spgKT9^a$2; z(&ld(gC8ka3RMcB&A5MdcWXR@Ptc^RGl_=nJ_}VHv{})CVOO2IaK;%hLcWh_nKhQS z+v1tLT%*@yf&O0{{W+wk<$EK?_BLyMvOcK*2qUx73(#CX!y3KUp4s`KP3Naw)RUV~ z4->j%xG4ND_y+04rOe__HOpgC_(alkt;TPosb~eVM=Lj(rAW=tE>if`wp!&p@Da;;Q00Cvv8dPF7ns`N8td!Bp)IsQQJ+fW67{?KxFA!Nk*ZOHDoq-hyghOyX*ry-9E~Y@ zHCZK-1Szpne3Xucl)@~XJ~N%mD{eY<8%{u_Q+9N*x6XePwlR`lNc~(F?iTLp9qL4Y zyYXbqIXy`jao_bNl@%2+m45NQsZKMmj3b4V`Qck65lR92l$1XM5fe)hs^rZql3p&$ zNza0On*w=JY^oZfLb>p0JEySdBDBD|C?Pi?R-TxURDe01jKlpO#pkIB=WSx;aS8JD zl#&!F8n%B5OIJlDD^rP>sUftULqorh!wW3q3X%$n^YROF6A-61amRczsPw9A z(kzd3)cv$SG;^Dh&cEudM1vaz0R9{0V-dN*FxZVMN#x& z_>zAR{AS&YN5zN0&dim1!&cJM?tpDEK7s3;h)eIH&>SN=*o+PtEYRg<5kC>du&7R4 zSOx||6vRt$9jX@>LRn-aM8$Ks9@o?HQ4kqP>Y)^ocj9=6G8mw&@OKXo%_#;%KWsEv z-MWm{J`s9_W9TmFLJwsnxJz;QUzrPDL}P!e)2R3Q~=y+fxcX3Z-DSrN-`J>&9 zNf8FlU9AX)SjMj^p{%^Tc=x$Yt+tbJudUdE!{R>-82{`J=tf5ljQqzp^2wfiKN0aE z{3|v`@K#0!E5*1ks0);3OqkdYyOXX%Uz~HXAU`YfCUH~@@({~o=V1$(-&8!<4@-aH zT|zGBLxZ6N_>AvLZ0ywl90cS6#q}!M`0lYWaC zjxFp*NdL1qBOf!1{YdJbesSotoN7p};gXfHNe~Lr*>NQb<_}zXMz}J)Et$pdcs%>( zgmE6|9dQR&+WHZm9E&)Bst!aP8z{MfW)od^+O6CJCCr77Td!Tev}MUg&mDj3d^uAb z`)SkB6L6V%GVRQi(eK$#iq<)|I&yi5O<|QWjO5{lpqch#1`YdR>Spkb!SNzQ7S^U zXdQbNmu?V{gtCQ4j7kx&MA?6=sa+}Sq|6&y}a#?~|I|m-IOPgyG19=})F@+8*uf%DFp7xWOU@5BPd4 z>VBc6^=vs2&IN2NI6=V0=m2Oym%k=B21nr(95yypAKP2dK>FYMoh8os{^@If!HJo( zbKLYdNa_U9$v;DhV5;zDBRbcNCN-n;!jB_7MSL-`VNt|uF^H35A2Ipf5-k)Lz0rpm z;+v>dtJCL`&Ll56M;@z6kgK@&@Q0Ro{lESyLfoYyMN;G=_P~=Y@j`Lj8)2Cto{w8K zYE>dAZR9!0dBysIJUw?CeQ1e)*8k~OcnJEI?O5CTj;p=iG79e6HQ)DtZX4hHlSu@x z!g}K`_CiS;DB@SQIkFj~YXTi3>>ys5l%(SD-~YKdErHZ)b;k+{({pq6T|wr#SICx} zYZ7j0&sN1$`$WbkDHNPWEl3)phQjo^tWPg~B+VBDN6%!XrKic~EW|y3*Ht+0Zz!#< z5>_BHwOMyOVavWN;$6{o7QRgT()Tl`Z|4@f!8%wR>ORSTdD?t<9~PxgZCSYgz3Y(z z1immH_@?ek#!a}zU>|&)^@R16(cj9?!xK0Mm*8^tsWQ~-^PEbkhs)7rV{+|bA*?0+ z#tQkGxCt8rok6f4L@Szq%m;`v4*X1n4!6C=YUT4$O=@YoFggx4*uLyRz=F0^ zE}qdnVA{P<3mfvK>MWRChRAF7ksFY!%`)qhKinro!l9a)Zge*Y0sR@8mg59s|T3ttYDU<&O=Ke2bJ z&t4_qzcc;A@uL>5Tj*zssx=!-wZ|MGjx!&PH7ir**ovJWRiY8p0 z3MraY4J0vtl6JW~3re^H;yX<%#^NE%gIrt}m7MdHHl&$Nu$O5JF$9JC$Gc2_o(6vXUUXe6) z1(vMmw&HGySVTI<`FXg{X>55O_j|B97nsa+eU>nP*}pO8zF-8{jnK-R^|*n@V#;pC>Ye5B<-%;`pc}+<=96cOT8V$LfEAwW zW22*^rK^_6CX+(vOu7O^egWi^a*}^Ebyt(d!9lC9jhmqt~vdk6*o@B~Q(x`5iW zu>3>l&|(t1R-|X)rX2Ozge=#geltH#0!E=!Du~>cMN7XMa|TZb>;-tCH(rYSW2=Nt zq$<*tnYoWXL6URaanvmziQt|v?pV<|EHI;g4B?SA^1l4^D-pj*cqBrbiLGSB504x^ z_@_^;8-4fKuXpiMrg1?{_8B3-Ou)<*O#Nrx2YLUS$K1qMzhaRk{p?Qb$46_TfQwZ{ z3Zq$tHmo{Xl>o_*$Y7fOZQRjes-M(%Ik+xgeO%7}_#YcpD?sXYB$h-r0wbI<;dR$LaKU=#QD+6Qy=$Zs(tQ=Khg9PxAb>?|t9z{a%u=wn3mll)ve{uiP|T=BhZqS&E#?#x}!p^9hG=9$QC79k?Z4R3{drOI;C z6XO%)&aZm8IxkthdZn{RiX=TTCQ9lY5G7BLq(sSuAIZ+asWFKXdF~=-kK|C<-`Iafbb*&2`|Eh za3W?BFB7wfXNlRw^8`aU3zZWT(MZlEbI2QZJMC_ZyhI1=XWLIWw2EEDsp5C2Z0a+5 zBW0^!#jvkI@ot8OWn8E%)Zitr6_`%Npd?b!E8OHe{D_Q=D zh<8P|n2swa%8fu5o#-KfGQ||vAq{e ztd&aBghDDvgbhKq4Wpn})h8p@NxL}_E}$t>f99pgB;i0O=NN#4-iqGVoci3nEQM5Z zC~oB3;o-~eobV)WVl!Czxh8Ua48@Fz_${c6fv=!b-Xk3dt4f6VAX%l%rnQg6cy5t{ zlzLxZ63XFLD!d5%SSi)6I|H3yg)`8u5o&m=5QaDuNPYXkxl5NCwghU5&9c1W(wmVI-@zSwZ+(Az4GSCHTaoDzr@es=l|e} z9MGID#JE1fG@>sW2cM_+y)A{)H+xxA7%A0$Nz=$o4m#dq^k=uGZLbuJAh8Ze?%?X zc6I-t~%kefVax?J@EjALH#zjbjS2Itj@T3gshhyIb z8c`4LBL>Z0_zfnPhWVGNxhoXrY>a+bRT9BXCjBf=>-bs*j8I<9Xj3yZNm zp6;{kjbv%PF`JXOypxk^=0s??}d8ZK?+MtKy_QS&;H2WOowNuI^LBag&`?oLb?rce_#0Pe=`x9 z>H{2qggT(BKE{44z5(yW9QGaZhItSJ!PN~n*oslb~ZaJl_7Kz08rJw1LPTg7Pf)4lyS_Iu^ zQ=Xc-zA0(qC^HH<`#Uqzf0@aHA0V#}28IP_kS}v0c@XM={_@KEpLQtwclU4ugD0R8 zDr_H(qD-ZLBD$cqut{&Iv=|CH6W)&9onOGFv?SCEf?TrE=Z&D=xY}Z_Fh5rcv9P5# zU9Z};cUL^TO>ejtgl3}Y4@N#|D>=WZo88{N1C~P|lt8XgQCn;Te={^!HP<%K4;0K& zc-Ufq!_6I>(b`pO2KqM4ljlNoo{Y+!1bga zEID3$wy0j+mTkzdf6s(eIx>CdQs15Zf6Qdd3{b8u*Hn~&8t5WW<#Ko~l?$rc%JOn^ zGh0~=y2hsdurtsM^tY!+ub)ZkDX!t-yJc0r`%|hs8{h)nZ9e`bBC8f9>)3K-HS7br z4k`_QZ-llc{uf@j9Af+ml4&jallV#NJf?cm{2w$!L41N?f4yWyt4!q0F*MgALTmYX z405qz7v!HQ)-H@+uvkrJ-^AS%7G0B%Tt0B=D*I06R?15n73%|EHM7DgGbba3TIfME z`@W!J5%T0Gnf9!f)U?bjSxRe8Yqz1@!eSN&3Lf=tO{pN)wx8sBQg~M#jKV?N%lyhJ z2RPoIdIC_Ee|2I>2MMF->Zl0C^2?d+_2H-BUHZdwmw$s+S@4R;DppqrWwleVqHxMa zwz>@Vmas{IJ1_a}kAN4kXpQ?TJDVd8#c;i`y~Q8p_A1X7G?bo@cZWbQy?&ebs_=li zqoM4U(`8q+2ef*nV0BY;hd-vfs$93fnyt{A59u5Ge_}2t{!Xwr`_I2db{FMCvIAV) zP$QHXo$*NC^la&Ep^@Fn6PiMl@*O}I>~VJ7d3b8&`)McjbgYxz=kmd0Ii7fA?6xt>1oi0ogqj%!I?>W3{ZG@MC^f z-<`T)!OFVe6m&k-_tcOzp*&;T7Z(KU{|H5ojax+g3&_L>`W}oJNazV~hyZ%Ee~6#d zSkThi+}wIN9`d=CBPR`mKp#IZS;ECoc$a$JN_c}_`}_2Z?+p!}G_n<8-SJ0(Hjg%Z zf5x5545orIlm!wPX=MF|8CTDw$k6D%lV}clV}GAcs6piR-TJ>vGB&;^qW-CYS3%UK zJ+TF!hFJXn--6A*(e?ijAjU5vgD}Eh|0fc@won!N&QlfDEpbOB|2WS@Tf@?$5;qbRXMm(3De;kv%141C7H?L!_S(qcuwp%AEBL&{3n|Np2 zHwhL*j-iGzL<;PE%+HyIYDBd|9P?HMuFBdNq#`mnd3;%rK_@Ta5u4db*Y#|Wb zs(*k8REj;&Y`hTr;8*by9EP``xp*zw-g8N3yv`leBZppSr1hn+hbK-q_`Zr<*xg#GGj9kz>v=Y6D);nXZd+DN$$*MzLoZoQXp%a-qy19ld&_WLVM8Y`4jMm>LZ<|Eu?K0+4)C$X@dP-YPONYhW z`E&tNOs(N(|KCOUmi^Cdv`zed=I?_AsQG6_yyrwXQ&|r>(9!jZD&<~v@m>{+zxwjP<R z0GNRJ)t-Ic1M5D>I1RVp)M@Kz-zU0nV3fv@_!_et{0upWEV=;W!npndt~H%+zVhqt zqe9vpl^d7W2fM7%#*%VdhxdCIMd zJtf6KkRs3-Ans_n_-=cve-Ol-&z*(`f=(BIDx_`N=hfxgkHJ23dt*;$jxn`Z16nm} zeE-bxF`#dr_I6tl>JjvoVDLE0A%iEWsggVHe1l$TMNW6Gw2~cn(e|$d#1Urlv}IZ- zrWKW7V2_J$_P@CR|Cdif=+4zG?@75HmDT2R)+|$MMp}Wy{f?(Ce{kNu`|$T3R~Iz1 zx7yBq48NhTuO6NMD~~|Wm~LgGxwWyYC!-;=^zozm-@hm1Ec(D$zH5#;SQ^QtL?o(Z z+8;r%BG$@Bm`G%PPlWzD!7)atEKsVUP|4ymlkpBx)U=q2(? ze_ra^L)_hm)_IgKG4I4oI^i;EMwWSEof)?`qSRV3j;f=q)5fN=)9hE89G@}OI696s zIXV%<{{r31dJdO>8w3;sGI`cb;nRwA5wR?6^4|(oJjeRhjtOe*kfed<)5b%`CJhNzwkAuyzFY4#(JG z`1(tXTqbjHbhQr*iVE@Z@(#1Iv7c-;Yrz6Lt0n%PAwGND0<4_e!n{5G-NNWUepVX; z_xN~*Ma{5U;^$|zLHb6h)dtT{&yWaDkN%bI1O0=-!#qQ*oB};OLjo8kVUgpKsDM3A ze@hPpdTd*3ALO}i*6woEgE4WL{Fni!P=9%Wt2IUW)H8^tc=^@@jt`D^xe;POR z)G(`ICtlk5l79HG;Xxx5BT7fUKC<%Vxi4Sj*Yg)gEg5xs)SpLh7#(i0!lKPWvX~ z`8q6zbclxpy)Lt<2--MfsKMVaG{R>`m)i$7-@DpXB@FFR(8!q^WtUKfyQDoF#B=<2 z?(dKR_D$Y%~}wnldu4$`at_zvj9B6Gd_{9!}rB7rpg zaR571%t&n&N4L^b4#pK|E*HIVAYYUKiP2hZe43E5KWODl;D|Ngw4>)TaWsz3J*P?2 zYPA}zDkCE<20}QuLkH>%ZN~&NI4ma|VaaRX&BRGKs~Ndme_`m)W>c*fKgYpw z@u{>-6OQCbiuiVtAqgVDlK9ZPUr<80RvVlirHRx=0T-rL*66wfOLviTJP) zkOWB)97UJvtbwBIe_bQiNbnqn|Anu~kMu0%pCizP#RWI+KKO3_B{C#mh2t9z-h|`a zeY@*qu0S@EPkF4tRqPYP!fnev?8!hCnM}Uo@m+LfabP)Nb~*aIL0A^9JqT*(%j1?egy8UQ{3C==mP+&f6CpB4ipq)C(a>OWZa{9XnFd0rSXVrD~k?#g^6`afg>tWWQnZz9`Cl+ zCC-bEehF~or*!q|HdXVPbNU+SfUYRxZtg{$OX$GwaiqM*t4GG?7whx?3|ys28K~I= z{m%{qOMn=Ako%pwo&&F zXr-0@7+NR@tT0;QmB8v>(U^K%j;5Y@d}5(CGm>sI_&)%mkrk7BzbTB*)E0wfE$C}h z;tdw6Gc)V6D|A(v6~NV)lwq2M^b~>cR^K^l*aixN+Kk5ZOf7_Sz4N4fO-o?nO}MoR zR~yh>e_|eMF|$+Nlh`wtuYs&^VX^(j6Dw<%&~iy8Gspz8m$>6(G8r}KfGiG0^YYZp zn8ZX#(5jNiG{SG41*>6B#m0}l+k8(03h;gDmE&j5Uwd3|0P8L^lY! zS{2Pb*??|_?>b>Uqhe;)vcV}AGwC!#RpE_v12CDM0~>J&?s z{K7-MdB3L_2eE@ce4@MT2ymaAb0!vKg1yTcwYvJapNb+`wzfO96*o5GpZdX^bYCvI zU@%{!hq|VeYdept+&VWFucw)@oi~AuAXZOoaVkzd`mDS(22!K78F8tq;MJ=lTFo2(n~JztHH6^^Q`NYv~TI5KFqq+ak1;O%XR1A27I7y z+;w<;krPY;n}qq>9723HsTYE@-mYaYe_)0q#n&jiwEfC13s~HQHk5VtVFa0m!-%tr zIR7-7r!8>`dj~%AIlQ&ey>dGc9>~C$t=>DlcdpzwOPW@;wVU=-{LzG=M%mS;caf8$ zzc_(MrHKrBqI~*knXyo()#!zo#H0fd!R={@s;_P>?dtIATxLt;o`e%7EKy%2e?Ru+ z=^D*aBRxeeh4owsgG|aLI(umwcK7WYkJC6|Bfih$pOpCKH@BZ4Gwn86pz590e-dS* z?gv_7tu)Y$63w#siujPnnXq8RDzGCnRYZl|5@p@-OP~{Xny~DIqy}&SMfR3HK@dSE z?_EfiN-4(9bIJz=?u%5N*yN^Mf1KzxRdB{Kv{mACFs?2oJlClVz(hswKj`ZBt<^mW zI<@S4Y|!&w`Sght4i60Hjk!1n2MVzXDF+~mb2lESt235&oZNcQ^(`L}F^^GA#f@|#>m_s$sZb-{i=f<}|CFEt678Y|jNYBrO zOUI7Er8{@PVdqY8n5#NNe_Z)1pT%wU_Fhjb&BE(U+xd^7R4TMH)1>$}(ocW<=g|0@ z_blXl@Aik1CK8o!7`ovuyhD#qEV1!4`yg-k(*9&DP2N3K*hHZ)PKk4%ZfOY_LX$zG zf1;bA9mA?g1{X2yO6jH0SnFoN2fQ&E|VcGqVQktuSvMQmz@~HQFPyv>w zad;70o(MKZR;b($`RF$ntSMYq2q(Bt?t%g3`sE=yAu}#dqBR3#)u>)bDXFFXQB6(U zzRX{O!}rSHve^6of03H{S-wIz9B+&;;b9}Tnnp+k)P~lhN5+Wt64kugYP<~ZagWE| zB2GfD;+G0~+E+pU=&v9=%#J*YgOu&i5?>wM!3MA?ak}DhH1tEt z((t7Gv!mVrdn3UB_Wy2J7rrd*?ob`_JsX+@ToDwM(ap&^`$P?E!bMfG8#GTtI_2mk zG23_(8IK#?f0SAqR~wrQZr=^k%v#?JyL`3l%vGV=Z7aLVKfrGtT&ST^Q#L#6s z@BK7M8A%eUKF&v3-fbKY+>PF^$yBxSy6y>8fA$~3pW(VhRa3>Uue0=Vo?Si}(9cRW zRB-ldN;5he9;ER=Gn3LwGYQ=2H3_^Vkel^BBxY*1RreS=>Gc>|rRk*YNDeT~Ao3;| zHGf0-+|um4k0tZxrP2J>{54dkrD#E$mMEFO0>a}V$^3wwTkg`c$)ibQHct*++j18>JQt|;uw*uwvzy3mk&C?amv=h5s#JSH{WsyH(vSz$)W*iD95bN|YB(Z0 z!%w%1^4;!kJoZ;)n!nEx`b|!ff1zg(jj4AJ!|RK)3$6lJZc_Sb>>-)@f@S?_uBI*c zU_x4~1##>3CVpa~;v31|Or`$D7i=Jej=9HT<4=R~BlERo5}pbm-ykI|=p(CN-?fN7 z;u}0B;jZGs{JgsooYqm`?xId=Vc#5domy>uBBy10&BAd(fI-${;;`k#OEy9k`2_^PKu9BNtq9pYW4%24w|W8>x6?6 zjQ2<6de^t1tm9@GHl-HZ6u93zpmzbuh4?NG`t?cgqllR=Fir~J- zDPlHp#|qzQA^P@;(lsy@wmL<)a{uPb7TJwcA0Ms`U-&=Dga3B``&;jQ=_wXU?#ttM z*#285TV7dSSypv&%jtx6Nqs)Mg%fbh^m}BC^N#(#?y4MD{_PW|e=0iZvzLI3T(t`} zgzi=Ox$a2xg%z;(L~J!pjG5NlwjYi^Hj6*=xfMG7Evdw}(WGpkNm&Y^eWdd>#A-p4 zo}?mg^==?5L_fuM5*%kxIQqeqzCpLx4#JQzy$o@nkH3|g&SZ)rUzpa1v|B7D{lw`H zWJyI$3piI_hD${^e+#tlb<;=p-K~V2?A%JOUv9^@e~!a(y76zQD5{d3I);G~f6oxh z_(RDJRBzY9S-8;ATzTp!Ewvmdiq~o&Em7DRy**(g-MVYxj`9>;hAsoRct|{;B3-nN zCR7#ZG7IvAqLS9G+rZt2>2KM?I5KRnW64<`Rd;cFb!%|Le_sE6Q9I^-X@`Sw#>2b# z5)Pezhm6_dn(V7qz1SKO<9ld+P_mFbdf`YpF2#TH)DV7j@V)BJlSe+Ge9@Xw8{(NB z9SA|3S3_7!y|KLOgFPRPCBwf9rEbCM0bIj;YGApUsj3Jx|%z7IVp@jVtd@#$pzW0u0*yr8|X z6(XAizr?su2;tZ6&F>-~vDNv8RbA;QF8jo-hpBmRiX**d+}TScz@@u@iD zxf6;vh$U!FvqBGVE*FjB13te1bU+2Cmof#&{`#C!kE@>8Q=T@GCyt96th?$V5XH9r4zQIY?Bk780@>WTPN_!r`f-wI(6U(`)e#{H&HD#hM>GsNCzWA~R= zjvhPFAPf};;j;TQ(cN|TD_Y zB0epKiUEyfTtRF_Rd#7{ws0F;6zK9lJ|ffb4&S%8ZGE#nkGD~L)cetIw%xS4>$mZHp&`Y%-s)Ox zzi^AayIMv3Nn~OY4PKPx0df8>usnhSj(GbPzTDX=YsLZSB)z;T!CO@N!Z_DmU`?2a zRau8zRi^yXW@zF%0vg@j0s`D-e?H!f!*Icue|`K;$aiFBgYb33habV0+%@};iHevl zaDHRkk?8uyw=0j;Bp%w4D|B{T1U+zf!NK1@eJAZX!9KwnPfffwQk$+x&43h0=MLzh zO6YfWB-`-gCW^)Ta?zY5^NVe=7#8$AL#Al$f9B{6gxSHCWBV*JsaPJ8CFC+5qP{97UFa z7a6t2X{CG9{>GMu>cizJMz=hn_0`{I?b)^|J}&BjYSs*x0G^yLt4l0|JjveW z7*r?8BEH?XWzQa8-#vR;eB0YwTH1vdut8TS7c2MQlS|!Gtq-dpKaU8JYq%^@$p(MO+kDSN!6ROyVE2 zcds3~Uf!aKY7qRBVj`#*jL6$xnZQvhjxXw2T10a5ad(xH?963N<|rE^n48&E4IX$X zfAC@p?Ero?zWm?rM4Or9TqdpEY0CZ+kFttPN&i= zxU~+~=rPbj13L2gX3=oQ@IuxANA`0o6n+=H8$7{*93rm7iR>kTIFrmoEqb98?a-zs zJ3l2O1Jd(knPfJ9VYj-$8dz}5@8-VK;gDS#A8?H71X-oaEP--h z44`X}*$rEhEf#b#@)J$;9i*`kZAI8lX0cxQS4rdkPR%u7aO%4!_yuyV&&gz8|Ag=$ zS&x)>9oNRVwSx zN673xSkW7LvrXvNf`2gzf^9MLrHJ>(7}ih-jVH4Dcb=E2%zhPL14HI5b|T}5{OvrP zg|p86Qd5-z*~xji2eV}{YkcAZgb1fRoP0&rBGz@}pV6CY+uG|b@D56dZT>dK?gQPI z8VwfS#z^0P`PW-yM7Rg{v&JG^fTOt7^sFREWCD#zjg7{dj_$3^0bhlBsZzN-6iLXE zKh%-CAJz2>+FIZ-G-w&iLaBi5V_w|c{gK)(q(yu)US)p@yhyCR*uF|VlIOMLzbXCg ze<@kKFjR`vKyTkEee80MH2r^oRM22fr?O4F)Pl=@>*&Wqtuba1hVV`-PPdTh=%XMXk`+T$GK z&uCp3*;Y0?KyO zWa)Bsxxl1BMv{zlN)JGKU8yd=w3sWeG<80I1?DBp`APxP$k@H>D!&bt^;Vp%H^nsV zRfi?+Sop{tN2BYj=lB`gEqO+!1_c}nSIR!MhQxRYZJJF28Wuxvya-p~uPj_Ya-;cD zy}A3$cLEAiZi6N`CpikDnUJQqw&TW{&TB!}KPUEN*)me;4WtS)aMJ4^P>yn!hh%hr z!dh4y#34tdDW^Eq2m?^U;Mm@tt3$AKhBGXk_6d%juS6Sxi%{N1#2fiRwxkqv zU}Q*$Bn!yQqiH%#fwoLr%BUn^1gy;xLHFI7vXa6l0(J&{B!nT32a_XweF>B42HP3$ zZYXZ7tSBntDyoHX?*yDviQ=36%qPu%{BuF>0A3pq@nd)~`_1tyr{D+X?c7d66NgpH zT{bsue7J`r*4qwv!B&Py-}vDqbbdB~4AP6v`!{pM`z@PL7G)5+9C)WQJiV~XCooaD zDU2hd7O|~~-z!ff8V^`v!Jk>WRHJbA>wWa#T-SxBKi)$F+FUl`uOraM<35~!AmS%t zJG&alIx;UJq_{esYbn(0p^Y&`8^UA4l6J4Y?Eh8>b$x&7syK0y7dsotd4Yc|5Vz@5B+96se;=HnFS;b(=k0CQ-(NUvzrZnhuDe)y{0j_8ZZs+LSJ!D<>cv;_p>uD0*_c8wMG)k>3-{*V<+6>@AiQL#s*OWscBC6mVy|dJFWzymYQmEZd?8 zRLY2&BxGcQ77`tj_$AU$H*^L$9M}FMPB5G3RU zW+|y^g%eCiWJ{nbGEy~v_swP;iyn_&yt%0PiOg-{{@HZ>20UW=6*q~Dh&_D2+;%4U zcuRY2mm%Zijv~(7aT^MOc@AD`b&YsAG?qZ|9m;=+4M8uJP?iCRcW?}ADjYcuYsZy)y(%QVGJ}nVP^%4If4Z_x6kW(vjjC$hl z!%=_xFcdljO&&@~C6a}Kulpw@XQ#$(idB1$^B?a$dB%)s-hPSEsc}&eTfBoJ)UnZt z5o+=y!Fy#=R9v(=dy=SbyI^$InOdXbt=JwZK5$teZpMLk8A z5GVv2f754&be{CHz8SI+vMsWU^fLNdzci)~^GSbUz=DCJ1~v}z8q_#=*x(ypdxxwY za(C#$p&t$XZdmTHy5Z@=zZfxp#IcdO@E^M-zbzGiV%QVs# z%Jms~UTfB=rnv0J&AetNDAH-Z&|JV5GGZO=<1N5OIWVnT(lK( z!DP~H#oeyI%hMxbQx=0~Rip5hr3)J10^epXZkKD97ws+yR9F=K2Yp~4`2`XkcWsM2dBt11|g`KP6Asu@0ld6-O(l||` zF^h|XOfV+M#iwaB7D;}(e`of|sb#9~>%aa8?l7Ot{Q!F@aSrZb_alpKhfsP96lf6r zUCpbTW-Rc<{Z)7zzRmtt{fAMD3VY*z;JK};1+G_R zgw2c7Z>Bq(6A8BaQm5Uylr1$_4JMA~cqMPWbfD#x`oyh%3xb2!t;ksm%w#<1J+!16 z(5x@fP}R}%w@-Zo3>tI_Q&_4qllxUdVJQ@o#w~>+D`}TLQKOP!m-ydqIs8%TeAf9i zTT$iylc_L3rqZ>7e-6dzvKHEbp1*h$Jw+boL%TGtUvz~gBWM%_HfU6e;q?2cLFSgx zXJaPgKmvUlO**mv>7nVZ&gm@@_+Cu8Cv`T9<5{!_4@QHrFOI^i$XAW$p#gX(nu@~E zIuwesl`f@g3_Et_9ptmC1WoKglr&l#VFX(Hhljr1dafKUI8PgZX`jTXiq921f?La$sksg>X zbq4fKwl&xP;18jC*)95mcFmehE|<$uwa^Dq9U(C9g`|wBz)YdLkkQs* zD?UObVi=8-J0h?oAF|CFa%UMzm$^<8)G|ALu2P@De*w>HRWG@A{IBVE*^Ns$J(S=& z;y{PpxF$$Z2fE7MpwG8!)@E}#T=wI=bA2;Ye1Mro??t zcIWb{TY3+`ZP@D;i_P?GO{v{R!me?1c5_s6x}5-e$Bs@ohKo_(!uL;(P>UM$HG9wg z(*^j3f4Mup2ai(X^X_f_Z^}H9qQIlc1zS4-tVue|ZjZj7MWaP#9a>X|tUNPcgm0N18W5 z5+n;rkO7+@!!5cF`ckbvo#(RoLX|057tR%`m(Pp!2WBE3+>I6$1Df{*8mKyR^Q%Lj zleTBxe~!!ubw8n?1WF$2$6?eg@6|H1SyP}4oS)DYde|2fcq4ujug95q5n@Si&$@AK zf7kKds*3cEs0y+StkxQL=e}U|C93G#Cb`*zN_wQ?&479-`rwA2NmV`he*g_d0~+|_(T7!udpDN`Z;LLMXWHV+^p^PQ zgk5l)xzcmx7LvX_cXW=q61FM}L04(D2^Oo;W9QB|&@RuUafXXOv7S-RxJP*`H_tuU zHiG{jo5X0GEyE{BdufTYti0}-|Nm*xpA(CNs8)uK)8V-8Pb~6GDR78*4~ffHe<~J{ zxI8siW@&>uQULvT=ZsC})3_AUi1qG9MD&W@(Qp9yl!Je?P4FElo|vcthbVP^9%X=v7aHUWHChC?ye>F>2ah zU)tyy?u1EFeos0iJHC)QL&YoX<8dC%Z!pJ!8Uied|2oc><9lhu{7PrNK>V>!J(5>K zwY5(5fjItmX6`?c8RU|2*^mzf3Ow@ubi|-15RC>Pw$WW%>5b0O?!tOgf9i}P{>t99 ztMwc__E+(+!jk6pS0}1date7~m#f0tTp8XXG5KaI6e&8+KufQ^THuDT9@bdY?%O{k z)RaXc*7dWzDAUSqgBq|DmARYHJ)$4krUOzjUYyRNXf*dy_j^KN{Hsx5Q7y1ftGB+ zeXubJq+F}b@99ZZX*s=7i?du&@>j(iz5=YotnNAs+m)WmiRE4+f3d~En?kr-I=i8Q zE8SY8t6U6P@<^kh07tl{kfm9~AzHxpZ>BEM|qwsK?@ZSrd_ zux1IwDJwh|884AbZ$o|Vp+Gx&^79IEfP8>5K9{0Q@eI31vz>2nTf5tLtIPBP&+}l? zs@7$0&~GFmMihrNe`stxQ9vE=IzDebJ|^!KL=!_4wxUF^l$Izv_aEPW5||^7sMj)e zxL-_wD&>vPnANZXf_D{sYU9hyHelYW>1=G!*f%eSfZUhPEcyzKL@X)VvG;eYKGTBubZHJ1x>_y7jdpnT-^{+joIERo>k98hLtp}yZgzm60Ie7F^z#|yno6El= z(}lT@23%jiC#7ClSgfwqmh7!Z(v$FjxjygcG%OwOJ2tu|?0>C9CGy_JCN*ws%c_oT zNv(q}=FFw{ZuA@pTfSsfi2o+#j1_ECPIp9ePFqHY8bX=bQoY1!VebBDS-CqL4#e11>X$(uLc`|^F&=V(YVngB-`Gr1zqCZ~s})FI)4 z3*1g!!V;ku`X++&!Xi^tC?S5UN zmx^6T!J;&}rXCs^vS6zUN6;70BpI4Z*Lp7HsPIG@4M$zYRpeYFC@Qt31qLH;GAXe) zzAVGb{@tHyIwu=4GwYyMg(B(2c#;gyrL%J$U7AP=2ES#<2P2pj1!dZbs-n^=o09nZ zZuimnkAMH9(0vvMc~CCvCBp8M+a+)ry?aS2HjC@nTghky*?&|p9vqdajCe(jXTVY> zuo{m?6R+Jog!-RQoKwF8*#7d2QmKN52( zud1T3>@`hNZ|#!_zQ=Kp$jPiNY5#F?4QX7SJ00?e(#W6`w6{yS1P8W`Q(tn>oWuL za!e+Z*=XkAO)iQYHx|(D$@bvV{yis;oIVd}HyBn`5fS<{vo+r# zH$So;FReX4wO)z5_PqT7PBLego*IjX`G36}l2w_uv#Wk*%Yi7!R~|j}X;BR@2RqYN zrWG!ZTBC|y7t4opStLROZ!mKvFffHBQ19+T{p|v5ZTw{=N&LG66V|itS7U`0Y3=jx z0$L64mWeVXpxDX^fp{IJ#AG!Tz8oIgzkqE#BV)(SC&OD(-hl_YVKMpRsV3meHu$^#r|xNtG^8M^uGjynn*O?h(lR8 zWV)L8S@eTNXA6Ka7&$$W@)Diu(oD4NxDQ}2z{&`Gkr1{pKi_Nyj?ou!#ntCe+3iZS z2!(VaJs>Z}i!{PqJKkQ4wp7qKva+9Jz^4P11Nu&D7}VchHfRt<{SO1tTpyQ!8w3=W z>No@o3o{C3Ze(v_Y6>$pmjNXNCk9hQNKa5iw=FpY9s+-_p1)}MiuvQ`Ep=W$$w~gn zP-&1t8r)49qFhbPgS#8s6RjEsI~=sZ-}+%}ADrBmQ7RM*TsO@N42llf?&}xkFlOFZ zhe^|?Pji^N%O_;}R?h&3rJiAaKD#`_=r=nZRtIj~?h_XMs>9r!I~`WZzY*%N$|uw( zB*MqLYuSH!fxCjj!+b&!!ZmYubc29H%=?n*7?B*;B?^ce60NjwxPY z7)NFpvyoZO%x9)EuQJ1#P0R|$g?W>i$c$iCG7Ep0w-_g8B(sp2#EfEAGmDtf%o^rx z<~3#vvzA%ROku_{Zp>6>9J7vbWnO32GfNp~W*Rer*}yDg<}q(D0~lLo7h}itX6zYj zW+2m#v0+q9f2IfHzz9rFx&>!iX@+B#Fy|G{3QISeZWopA%1^sb?ryZ|ZKY=&*mCYw z?f`!$@qYX}J;wIP=<%fI%2&p`vcK2lURAwU_9oVIt#kS;>~ps7h`tehPxKqyuhnL{ z%^g*5)q(y@|59Ow@X3G;1Aey6wi{{JXg|!})BY>_Uk4@+{BF?XK~;lY23HLkJ|uR? zC+ddZ6me@;SpU|op{5i>>4B&~28ZEgQQ3cPiw6ZQo3tQ?OePC~A0a)!K_a_FM-;FT zw!kRxG4onvIvx;4E8XC%e^dGdF(Be7QCeK0fcAq*DWH9d5MLDsF%Ss*llDauW5+-2 zl4EsAvw@G$vd4@kO*L>F-hrb!UgY#sAkS#dHX1dju(uVKvX{vys|oZm^LNk;4RC)S z>gi+SIP$IJFCa^5tVk3~x9#XNKx`8A2cg+)WWi zUdx$UAkMHq!C=r3ju?mv%dO6d><;}TgMn_*-Q-0ddXK~99Ye!5g>Uj-I3MiyfZmv7 z&PpxMhkE`2L`6YLWHSZ3GYShFRcCfxs2fW7NkR^eM@D9kC1X@p7)@#ECNoaQKs$6M$yRS@*+z2JMl1`90W)yph|8w`QEP@SH(n-7t(b%Czf1ZSX;epU!wG{zWh3NU{gj8Mi)qLIVO zj>lP%xhXkdUjms2QnRpDB6h}3)Uy`zLujO5-*)bpFq9&UNP@X=h==$Pp4M`5ud@^z zEfy>kZ78#B@f;2#9FDeCNmwJjB48md=AIPI*gR{~(s3GOV+3T1-@goZ_;03sLZ+%a z7IadKRsAHh%$vnGKfizf`1`5X$SYZzspLI@xMB;su_YivoyQSRSPk)f9FYEGgt`kX z&>(fUC_r*nN^7N&LS~N11X+CP9*93BxcvZ1!(Xu3*cXdKK_7% zmF?luZ$egnCX|^AO-05+;7dhzt6{S~kV11cY?EPM4hNwsLBAg;@X2y=$c}8mQ&wNd zupie6`$;cgZ|YE3kx1G`&SHK{E6@zz!!a2)3XJ5ef3bi21Hk*wD)C(VR3SdsV2q#} zj{g6_ZV4x)bbOW_XEYRm{Xxho*GRWHC^H%lnJdgDnZuPL>!VvmkKzgIz>99Ol9IU4 zP^7Qc84VE5cgWOI&N6z$i_$N$xH?L@Hf4K8`y`FcYR#th=JU5O*8Cf_Kcwy!*lX zAAFf}hJpmXn_Wg!<|w1S9QZ1usY=s@3gRZ>P>ZBEzqNsCEJGo|QfTzIRo%uQ{JQ|f zMq_?{L*tqBGT^Vhvy9k~p)Ttd@6p0JcTIdA7@>cdzfRdg6?Pfd>~|ue5qKQ;<5#Fb zd#7*7h&gUMqr)_+@7n%AmXD^x_^$#@_tK|7m0xr{f^T*)An7}$p*b;y?%S_QBaurj`y-3Lm8uP9n-Z#F}{0g&pYBRBpNVMSN2` z+tAt9x#*~DZ@_N^+(|}Kg$g0jL_@}qZDfBdI#3~x#28fLNc2>9bSGDY72tfx>*F0) zlWxL2c+dRBiN7^oxmI}z-h=Cb4R0S?k~#|(g3JENo(tTaUBcIbOs(K2%Vck(ap&sJq4d4 zCvsFzdp}{Z+s9dzX=$L(P{+n6ML`trQ6E)xxVE&h$+u$L3LM2~UmHJFVPSeyz~&IP15FS0u^+3Ht?yo=B1F4}Eq-xYs%3)1MP z=i%@*=VdBALu*^=G|mm6m6^xgs6^`@)CNQJZV2GLY9p(wYfBr>uB~3@vUP)Nm|E3> zRvdZrB}+mn@~8UJ@jy0PaKiUDEg05l1K+x!66d25?z`NxRs9@~nYc=L4X(Acz_t7L zVUfE#EP72ttP_OR(9`-#3gLed=kMMSLyp82Xbu;YnsSW#6n!Ej^C5-NRaJ$>73DGY zn`5;)zb)$MT+h#Pn(z}c5)T<9Ihw%^$n<2%xB_sYA6hU_Cf%HuNDp@OF54HxaV5xtv_gXT5^xD|k zdih<*m%H-e0lEFdSEI-A4pY?m6 zl4zecU>Q2deJY=Ifb^h!qHVcYkd|zb2G!a?ljlv0qyNcm@kLSCma#YoME>eSD879x zU`?9Z7;8)^1-=5($~AwVaIzHd*F%)IIylcSeJk+02xW-v){>x-7)^uUvE(~@c+~?- z^6kAV2F{rX;X{LOHOHw_@>5_B@S%_#rXdP03KEMlOmLu7O=rgev#Hhp43q$0gRcUP zYL2Y;JEZZh_D`Rg$G`Bq&u8=tG43?IKS^Z3A0~GFN}q7G0Uv*|FHLLJqmEO5VSE4I zzL;{)J)ViTgos#U!J01iVIq!mK*z67*{XJ<1%DN=277Wi)iiV2YIuW8*WmaF0r|tH z--i$QC#2iwWQDq;@9%`{8o^DJkX_CVYdF;@+WdUlyqfK`eh>xD@HT9`vHe8&)%|o_ z{G9hyK^e8r5r%(+y#`H+HXwW#EQiFKDNXvEr0a&XJvY|WcofKc)s1-)FZ!0Ew3u*{WjOhn^K`f-VPV0G|(e2Q;|(6Or@NO`#)rC6%?ca-JG7ic^Vn^#Jd% z;8_1;f0znWt2bWtIKTHMd=1#W=mRf9~bU?0j)v_BuM54P+u2 zO}3IvIFd}noFh+7S5Hw$E6z;2PKViVBF-*R{GB$jr>MkTvfUpgl2N!?%Nj;+95Y78 z`~ICAXzxi>?gPx+a|Pt@HHo^Yiei_iJvl)SYMI{-@T}yN8CrxmPAD_tbLmB>r^(P(|%;3RraSi0{A-}cZs8xJ!htRe~Et4 zmvizy9i_V;b2uEb-^wOzm)tcDdJ))IS}K2Rl1s(Prg<#Y<;}DpvL8j37KGJujr7>9 z^y_h_(IqU`75ev=N`0vkM{`CCRuFM~z4|qBA7gy_&3}8q}(9ke!rkTI$FEjtV zj$XMTd5{P8g^+E|F6Fxx=`t4UXmOv8=mNG6It$h1ndv3@b)I#eM?ACQ3L-(rCq{q6 zUbU7xZ2Hoe1{SC@)aiLKhVuYj>fQn}6MgM)z?1x(tc+`5FLFV;5ITZ_V6iF8*qI{C zy38c9l8m*JHoqKiI!;lNP!n_1D4HyA6i#+BXMyZT!kVvBiu}-pI7xF>jw?S4|Cz(@ z%~6x5*hmy)o*r%AQA<<)5|$GI>>``l!2t!SfEZm&$AR64LTgGcU;< z2-EK}gwoS#P2uwCvf2#sI$g3srx`}F2#ZIo-Vs@U!#e#gx-n1FZu-n6u5<&jKXJ_Yxj)g{^@^b{0mu< z9-LRu5v9bi_Qk@V%1YI!)_Bq+v#C{I_q?XvCR!bp11K&(jE)wn-92VuKb#`Zwg{=` z9bqSI{-^pRTapVE<$GbTW|@)VrJSd-`(Xb2Wb7(pz5lfrcQA*kwwTn1(rb;mz~8R- zoUPeTm3_XBWF(T21IJ_E=<9!cBU>KL3POyI^(+#9lfYyAn@%*pwu%<8T%npE1( z$_2ilY>$$D71Hxkvu*)jOxtSMqz|I$avgZfDKzW9Aa1`dg;tojcWfftrBJJH<=&6) zyrG%a89~3{u=-a;W^`)OA+Rr?8_%hb$5pcD7k^y*DWzy>xPX6ZUua@7uR{RdLEjr-v<^dc2$$)GnU+earwf*82O6kH!vT5u=^3BNMDo+GGo(S0Z1C~GU>qQ1l+ zUp+;or5nMRk*Rrv3hYJ(Sb1yND&rN?5vYY0{So@ie3^o$*RFW^=FhY1pRKCxf4%+t zvh8YJS>&w0zWw_@AIRmNu5TRSv~I)ZV0GlfiDn;|0;}BpU3q`ir+;x*`20GhR2uRp ztJayDV{nHwQoz%D=023Dk$bv%}JSUYaa~4u}?cgvg5a8r1OS=$WTo>p-Cr| zJ6M0R`aE^()LEv1zQVqg<^$h2OOxj?8c?Ks+$(`4mj9W)q$?~olwjHvZc)#2P(vKmMb*A z)alB@d{cj-gJ2iGy*%*v@rtTrS3TdAOErBeNmHwSff-qEH7*cme;j&)oP?yTUpMI-XRpyB2Oi5s&@OiRZtAIip9x+);mAaX%G5LRB%%*i(y?D|i2?=ruD3;c zC}ih=3F>*`!G-}Dowg@6BGr(k&*rtPAIYF5CHv#Nyi`+8`lnDxOE8m-4v&h64j)gt z&m(_>fQ;c?-huQ2G3^6&D+eddCo{yXYo(X!8=p@S;#P`t(MbU~Q;9oDge0O^>=qH7 zoTAgwY?_dhka^&zd#L%__6sXF@AUK7deG-|ZAqco+|^6zQ`*LRYj0!W?X~yhShq@;^GY5SD0MW{lrbPs zwk@mX4kW#iSx=8W<_3qm*t&WV33 zVz-KF2JIvul94B!LVY^ClTc z)c=@+ed@)G8^_c{=_O2n+dn*pPkz2s?v{|M$=yLC&vxE5c;vLs8d;>TyDrqC=+~2jmfyrgfV|Vs7VSD1z%WQw)a-z8TcohhY#WX%rm(UZe&+b zhtwEVyrpm(429{i8l3j6+w-dHo?Rewo{qU>@dO3UIDAEkKesD|GRO{&*TcR<^{iDR zAOiSEZ3$Zd=Z%+&`Hp;|(Q+ru&uEx$gJ)f7-a#%J&@x@Xp~vJa(Gj=+)k=S=8XG9&LrHJPrIS{ijIF3`C_8n=vmiEA zU0rc3#{&Gl)`fEx_$+jpuOXX>=iWGKha&BxrMX>wszpb%I{qOJIVQKtk-|Vjg<%MN zb+lDcUH=Jx60Votx&Zh1JF|bU(sf>$x#TU6nxJDXm9jXQlDT^0b|!|VdU`Ob*YCpX^v!7R#K^I@vqt9 z=@+zq(xc@Re+zH@@b&qCdo+!yyOJa^mHx7-L;;VKQXdj71RPv^#S?$~2me>xH*gO8Z6n9Uzmb`z(Iv5xs=#oBle^Il}`94(n@p^9*N_m>Fhy$T40315F4i^KX$xrrNu_- zr@PDM=j+bDTYmZc@0O~E^mm;E0xSZ)YxSqHq01vBevM{<9&LXIcGG_LHgZnaqJU3I z(8Z^KzHqk&ZAkw*;sRt6kPYj}B&v+c*jTEhDSUjkF0-)dXkn2Wop53~y23O5cY7kM zcK@O-)%JZ!xqtmD<@Tit`)`{4A1eBP|6hu}$T?yA3bp%*RWjuWN5=V)-kKNkF4;*# z1+wcg`_-M=Pf9>5bg>83+x8~ygeZtN2ON&!t>bgropVTf7P^Mv)5J(G`fExr9m+VvoJqB4(Pfbojw=Y!$Z2^D7z?=gL z8qHCOItPrsVtJO_7$YiJK*5HJWd=b&Dbfb9(A&(Kp%X z)#$T4QcO(r;yPrLm%GoPF<0NaFTecunLp;7HT&%Kt?yf9WQ?T+Ba_MOR(mdSU+g?) zj=S@!iIb!|j^aR>ILJaAEMI>~G6z{kbS7FI9@Ot_AN=eM+}sN%^=9NUnTwnEoY1W? z;eq}Ekq#s0jB=PbW5zUx*};C{fg9B!4({s60KZ^$B>fWPuqy z@nGgL6PTflC*#66F~b;FW+F43S;ov~Mlj2n1U`8`uj2p9x zac7*FvCL{_F*Apm&IErmc8oP+L$`OLm@$_0;YYIBvV9gkEh^-k+)sYPGQ{#HD<7*% zikXT$#S?ZBTg%C~i`GM}Ked@?)7B%n$Kf9T)3e65zip81F2<01qTYAk zi0ae3PfXuleGPr9-n4jgBR@v$VfU*=_4f>z#78Ds2M&;Ta#(-Gs};#EJIEw5A2gamps1nbycE8F!wGLoHCzH6aTqdsXoWUoTYO^9B9JHy) zF+|_>Y(Vl3(1xamr>8*_a4{;yUc)C)2eohws-G7r)q4&t*7`uaj>;*1d$!9fw4z_mxzpWJ```1+A@rCp~LMb5@3YeN~X zm(H*c&-35W z{yFEhsXBk1POB5r(_?o+IHx|ay{4jR_p#fA&0axV<`IstWYD)0a0E`=k6ez@?pMn( zj_*I`!7=fv^qP9?%adgBgT#tN(11M&q;bEjfGC|VEGbUn+8&rT=-`x3~`&nkbw`c8`hdWk}cTEkN~K-W{Kr9XBQ zA9a{WAgh5yNYrqYUBcN4%C3)$SS8W37ycIxk{{}H=AScg6^k=&J^1e1>21U|Pr#wI z`)g@yGMX_i#GZ1o7DIU)IN=8}kxZNNHt9$Dw~xb#IPKmK*hfhW#FHoe0IhEygOAD@ zh04Q6OHFVV8n>2&mivPjcyrT%g3L=CNiou$am7jV=Gl}c_*in`IVaY$QDqzITxbA? z44+IK$lE_mMf=mo%8Z8uFBV<0txT+YG8}&rM3E)3u7|vO@v2yVYTX;K?LMvZJGUb>YO`TKugaVyDn*J>8PXy7(ib-8x7sTmxyTQI1va1B~ z77LYn{oc${L%F^bxGIw(Qah81DHPs?NGhf(wiXOfonDuw*FhB5HC4(LW8;}P6MBD@ zRaTU37u2;D#(aZzCUN#@%h!WDbG+Hx9D3Evl8J9g&cjmP=N;Rc|sx}MB6B<4XOJs=pW z1sV&o(uBi|lA0vVX46RH2V@NIg3EsuHBm>xKLHL0Kl=)YqjLNMGSFjH^p=gnDVEIs zO~YNeuS(QKY~~LhZ!JCq+~?;#$N(~I&Z6RrocJ0Yr(zNjQlh zgUJZuPyEq=IO0~i9MBQ{m86SY<`;t7e!sKc*HXWsPJNnjr}>K`SFYBahg?;nU%4~Y6%o!{$$B|UAn^8l?VlUz$5RYH_ z^R%3dX79n3z=K|OK4oiw@Ib70dIhWvST}$3L}^=@S1YYY__GNkjI!%bA0Q{kU~w3a z3KQw^MDg@ev9Z9Q(`GAoCM0eL4Y#o&W^ZL<(UE5Vmbp$u?ngM~u-SjA>*Qy1oNmx4 z)lo01DXphS9AuK)=L*lIpE9-}y69iHRyJq7;d>$^{o8GDz^5W2>8d!nc_JcCBM zoBcQ4EIuw(Qk+4Vz0zDvHDuJLnZ#KN zF}9pne3$PtOK8D*wc>yM1oarD2Nt7~0>^=IVG-fE7DWgqSatn_zP;U1)oDeymR;Pn z^?99n`b2`m7o&J%4o*gE<*xYT?GVHH7`NBd7)zQ@dhPRmH_%1BiqXAncPgzBEOoLkGqlwWdeX4!)R#7*V%io(9l<(6LC~V&r69E38s@hbsBO=8; z5|(lvpU+1(eCN)`H|~4Zg%>Kls~5p!+AnN?RJ|%Et_jK@S6@`Ho5LR2{1j;W@Iz?3 zcMn|Ftpk@S!WnlF~-NtHIh|4h@x3s58p?aWvS|2leg<3E|=Z__!G?|RS; zB@HAh;2^ZZ12{q5C-zu(n*AH)YeL987;k1L-#edq?e06>3wBDVcCM z@o+e(x%Zqvv&yabQK&MdT&Ld-oCeY(1;Vo1Ah{^V0LA6Xy=6xOK88}TKaFn`qW$qO zV|1zDb09E#MgF3KB?WMt`}_e^pgenCxIw9p&6Uzx1!PnSFWL~P#Jt{#3|})hSfa!C zir;6kbANxT6Zuu{syrBH)R^#~5gSc?Bmp&{WBnd`gpg(C@g~H%Sr7it;yF3W2C)KIZv#yk?w-iGG>2xEZ0pTf1xChN6v1e6~@~n_USG! zlcbh50k`vile#?z*aC}T0W78k3LS^Bw5ti-7#Xhz#HgA-|X&PS#>>GFTJNDwo}&ak6cZqra5dhMLGw zT&90k=tg>v9GT8-zD4%4j<+MPUO#f?y0TU6#V!aA30eY|t7w}hn;tKvNAcv3IF#lC zIYxBK`R2|0eSLxg{rvU^HXkzXZ&s4IWC86k&i_vOZM5ay2N%uKcNfR7lr?dtPWG@2 z9^$o!a?BCk_>q9#TOL-dkII2)vso5P{7YeI5mF8VyIhhFcI6O(ID}{{c7u@&g z=DuE^m#-`+$lG00b8g-3Sg8U#UFzug#{D6Y)d(-T89ZvjQuBy{H>H?HboS>vOp1RH z8dHC|9JCY6&~U#lN*{tJqoV7tee@ zt>&~6zhjBZ%M6>qj<_81tol0KGAZ@%C~)@6*3D9qj-CHOD%1O?WOz{Wz?aTSzl=~s zlLV_4MIOp>@8VG4Zgt%!V^oTph9`ftEB+Mz6K+bWYK(aQCQBdZPRk<}-C3!MHh|{h ziw9#~;41;CnhLJ6-PESfpNz-Zt zvXBh75>@Q$`AXt&Ewnw)S8uV!g+;q7OVO4%4aiBNN7iu((XdOYVyg|8sNqT211-{w zxdWmhUcW0NEhByp*WHMA``&-)E86loB^f#AB;P}{v6M4D5NigH%{u|H)c3RmVF=kx zSZuO7D`gQ6>iR1Bvene)Je!e}6`Pruk&+()sh~|y)}_xPo&yMjWs-FyoiMl3tm6&A zW@{YR^+rxiW^yIi7tm~yTi$`C13E}?UX=9Jz7jIBb4s}vDixq^l<-#UV{ir;tsK|v%Is)zz-1JZkRUDC>;m1vj z*|NsR_~Cyev;X@nnwNj%TR(Gn`8R?XD89pEBCg+EkeB;FiuMx9tMw2JGa+2Uwi2p! zdlNVv+hs$pTH&2PsM*czll$mL8Vu=~sgPzLzXqacv>OaxLle})H)brhvMV4hD`C&? zIVi)22t0CVU$8qb_bcf@%jkguDTh@MDjle-A~jh{FRd_T)JT7{wQ6}0ykJ;iw)m1o zC$f|df+ON~B_~e@dlmbM!2tVdKh*;JB$jQ{Waa2VpOY&*Mk|z)fmUjjqS|norrmnl zc1Sk!q(o3}j_vcm4K{RtUYoE5Tw&AkU6nL2mO2}!#EQ-yCfU#X z#b5cHQbYC~Nr9_rP?pl5I75UvC)|f!I?$#i3gq3crNn<#46^#xq}ZYz4}K5?qs>Nl z*k;0z!Cee-p^v|jYQiYWqAf7i%(Oc!CjP=@Z_ki4NA;DHU5w76dH~MpQfKcl-z|fz z%$zdL+(zNgr>kH6&I(|K^hlV2w8assMxE-p~!xLZh-T-7i`C0PF%xY zrO#oNknJ4t2a)}YTWrt@rTT~`#L&^gij1Z(3;zaY-#-QaFV>0tWA?#~12;<=v@x~H z;KVtd8Y+EF?zXacjs_yGu+zDa^?|&eJyBNG(^lWp zj$!@@l~Pq;mw+1t6qiP51U&{+P*PD+PPd6@1c?HF-VjJwvXo-oij%5AZH=?F)egmK zr?$246Z_Eb`<^5~(zm|f_i6Ied+&3fanApL&i|ZPQP#aED=Vu3F6%dL*tl-Wa%UHp z8Pg4SM(amf=|}a_zadD&QvJbKYi$}vP55Sre*R#j7>H&Jq6Ah}tJZE`9vl)S^7Zx+ zkDj!D{H@V5=Ffk3^wK~tk?)?}L8F~_i+#KTcZapW=)#?7Dc^HjiI(tA5bf(`P4LOEVZ3lPpzaJsCTGw)COu5 z^&T~y8c%JcR#P*m3DhR)eQG8(k#eCNsaez{YBS|T&8FU>T&XqG9BMM6VZM3@Di|hjJ=%JY z^&OkVHZAlUbRPYa&`EfZv10rgUGKMldpGqN+~?=MnSKAOUw;2S{SOV8J0Nesi-9GB z_(94+|2=s7;F=+VA?ZV&+0M7UF?8_IvY~&m$;0{$J3Rc2;TP-{+TF14W1nmPa0ENT ze?;wwKS$0P**NmXs4=6OMqPU&;f?Ay9&kgsz1$&wHLn}Zj}Cs*;mw#gzZ)}ueoXzC zKgOnvy*Y0FxHNs`0DUEB^-`_X=Q@<46QEW4Q*0YuvL6~6Lm`&ObLp5c2nei!Qof~A zy3c&2??)fV&2Qp6glf?E`aom^w+g2Sjr0AkMY;!8p!X9Xo&EtUJ0w*GKoG=$%nSGL z)YwTu3@P%2l$1n>V*+bI#r;ZumsgV|Bf*=m`rQW2rK`r;ct?_@s-c|!l~&b4Lvd)$G&m=krsg-nxNF%2c#)%_IMnnja?$a`BeO zDnOZ?2gOWHRJkZ5Ix2Mc!9A_dPawO(EY5g()UI{W4*5ohTy(>2KSvJwp==YB?%|fv zF(NW`EtK#laJz^33eBQR$N?KgWCI>(C2f1+`Q1Zj&zA&$z~RWfLgTpohH-COj*F#V zY&o{zeRp4p#ISCP7JaUNwE`Uq>k#PoAuF~n2vTAa<νN}OcJQefsTzxmziIwV9R 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 delta 96006 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

5@-u`hK+MYa8VK^Xovgn*^Ze-n3f8l^2 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 - -int main(void) -{ - return 0; -} -/* ch1-01-1 */ - diff --git a/examples/ch1-02.c b/examples/ch1-02.c deleted file mode 100644 index 9d41f21..0000000 --- a/examples/ch1-02.c +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Name : ch1-02.c - * Purpose : Demonstration of error handling - * Author : Tom St Denis - * - * History : v0.79 Initial release - */ - -/* ch1-01-1 */ -#include - -int main(void) -{ - int errno; - - if ((errno = some_func(...)) != CRYPT_OK) { - printf("Error: %s\n", error_to_string(errno)); - return EXIT_FAILURE; - } - - return 0; -} -/*ch1-01-1 */ - - diff --git a/examples/ch1-03.c b/examples/ch1-03.c deleted file mode 100644 index c749aa1..0000000 --- a/examples/ch1-03.c +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Name : ch1-03.c - * Purpose : Demonstration of variable length outputs - * Author : Tom St Denis - * - * History : v0.79 Initial release - */ - - /* ch1-01-1 */ - #include - - int main(void) - { - unsigned long length; - unsigned char buffer[512]; - int errno; - - length = sizeof(buffer); - if ((errno = some_func(..., buffer, &length)) != CRYPT_OK) { - printf("Error: %s\n", error_to_string(errno)); - return EXIT_FAILURE; - } - printf("Size of output is %lu bytes\n", length); - return 0; -} -/* ch1-01-1 */ - - - \ No newline at end of file diff --git a/examples/ch2-01.c b/examples/ch2-01.c deleted file mode 100644 index b565479..0000000 --- a/examples/ch2-01.c +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Name : ch2-01.c - * Purpose : Demonstration of reading the RNG - * Author : Tom St Denis - * - * History : v0.81 Initial release - */ - - /* ch2-02-2 */ - #include - - int main(void) - { - unsigned char buf[16]; - unsigned long len; - int ix; - - /* read the RNG */ - len = rng_get_bytes(buf, sizeof(buf), NULL); - - /* verify return */ - if (len != sizeof(buf)) { - printf("Error: Only read %lu bytes.\n", len); - } else { - printf("Read %lu bytes\n", len); - for (ix = 0; ix < sizeof(buf); ix++) { - printf("%02x ", buf[ix]); - } - printf("\n"); - } - - return EXIT_SUCCESS; -} -/* ch2-02-2 */ - diff --git a/fortuna.c b/fortuna.c new file mode 100644 index 0000000..32cfa08 --- /dev/null +++ b/fortuna.c @@ -0,0 +1,256 @@ +/* LibTomCrypt, modular cryptographic library -- Tom St Denis + * + * LibTomCrypt is a library that provides various cryptographic + * algorithms in a highly modular and flexible manner. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://libtomcrypt.org + */ + +/* Implementation of Fortuna by Tom St Denis + +We deviate slightly here for reasons of simplicity [and to fit in the API]. First all "sources" +in the AddEntropy function are fixed to 0. Second since no reliable timer is provided +we reseed automatically when len(pool0) >= 64 or every FORTUNA_WD calls to the read function */ + +#include "mycrypt.h" + +#ifdef FORTUNA + +const struct _prng_descriptor fortuna_desc = { + "fortuna", + &fortuna_start, + &fortuna_add_entropy, + &fortuna_ready, + &fortuna_read, + &fortuna_done, + &fortuna_export, + &fortuna_import + +}; + +/* update the IV */ +static void fortuna_update_iv(prng_state *prng) +{ + int x; + unsigned char *IV; + /* update IV */ + IV = prng->fortuna.IV; + for (x = 0; x < 16; x++) { + IV[x] = (IV[x] + 1) & 255; + if (IV[x] != 0) break; + } +} + +/* reseed the PRNG */ +static int fortuna_reseed(prng_state *prng) +{ + unsigned char tmp[32]; + hash_state md; + int err, x; + + ++prng->fortuna.reset_cnt; + + /* new K == SHA256(K || s) where s == SHA256(P0) || SHA256(P1) ... */ + sha256_init(&md); + if ((err = sha256_process(&md, prng->fortuna.K, 32)) != CRYPT_OK) { + return err; + } + + for (x = 0; x < 32; x++) { + if (x == 0 || ((prng->fortuna.reset_cnt >> (x-1)) & 1) == 0) { + /* terminate this hash */ + if ((err = sha256_done(&prng->fortuna.pool[x], tmp)) != CRYPT_OK) { + return err; + } + /* add it to the string */ + if ((err = sha256_process(&md, tmp, 32)) != CRYPT_OK) { + return err; + } + /* reset this pool */ + sha256_init(&prng->fortuna.pool[x]); + } else { + break; + } + } + + /* finish key */ + if ((err = sha256_done(&md, prng->fortuna.K)) != CRYPT_OK) { + return err; + } + if ((err = rijndael_setup(prng->fortuna.K, 32, 0, &prng->fortuna.skey)) != CRYPT_OK) { + return err; + } + fortuna_update_iv(prng); + + /* reset pool len */ + prng->fortuna.pool0_len = 0; + prng->fortuna.wd = 0; + + +#ifdef CLEAN_STACK + zeromem(&md, sizeof(md)); + zeromem(tmp, sizeof(tmp)); +#endif + + return CRYPT_OK; +} + +int fortuna_start(prng_state *prng) +{ + int err, x; + + _ARGCHK(prng != NULL); + + /* initialize the pools */ + for (x = 0; x < 32; x++) { + sha256_init(&prng->fortuna.pool[x]); + } + prng->fortuna.pool_idx = prng->fortuna.pool0_len = prng->fortuna.reset_cnt = + prng->fortuna.wd = 0; + + /* reset bufs */ + zeromem(prng->fortuna.K, 32); + if ((err = rijndael_setup(prng->fortuna.K, 32, 0, &prng->fortuna.skey)) != CRYPT_OK) { + return err; + } + zeromem(prng->fortuna.IV, 16); + + return CRYPT_OK; +} + +int fortuna_add_entropy(const unsigned char *buf, unsigned long len, prng_state *prng) +{ + unsigned char tmp[2]; + int err; + + _ARGCHK(buf != NULL); + _ARGCHK(prng != NULL); + + /* ensure len <= 32 */ + if (len > 32) { + return CRYPT_INVALID_ARG; + } + + /* add s || length(buf) || buf to pool[pool_idx] */ + tmp[0] = 0; + tmp[1] = len; + if ((err = sha256_process(&prng->fortuna.pool[prng->fortuna.pool_idx], tmp, 2)) != CRYPT_OK) { + return err; + } + if ((err = sha256_process(&prng->fortuna.pool[prng->fortuna.pool_idx], buf, len)) != CRYPT_OK) { + return err; + } + if (prng->fortuna.pool_idx == 0) { + prng->fortuna.pool0_len += len + 2; + } + prng->fortuna.pool_idx = (prng->fortuna.pool_idx + 1) & 31; + + return CRYPT_OK; +} + +int fortuna_ready(prng_state *prng) +{ + return fortuna_reseed(prng); +} + +unsigned long fortuna_read(unsigned char *dst, unsigned long len, prng_state *prng) +{ + unsigned char tmp[16]; + int err; + unsigned long tlen, n; + + _ARGCHK(dst != NULL); + _ARGCHK(prng != NULL); + + /* do we have to reseed? */ + if (++prng->fortuna.wd == FORTUNA_WD || prng->fortuna.pool0_len >= 64) { + if ((err = fortuna_reseed(prng)) != CRYPT_OK) { + return 0; + } + } + + /* now generate the blocks required */ + tlen = len; + while (len > 0) { + if (len >= 16) { + /* encrypt the IV and store it */ + rijndael_ecb_encrypt(prng->fortuna.IV, dst, &prng->fortuna.skey); + dst += 16; + len -= 16; + } else { + rijndael_ecb_encrypt(prng->fortuna.IV, tmp, &prng->fortuna.skey); + XMEMCPY(dst, tmp, len); + len = 0; + } + fortuna_update_iv(prng); + } + + /* generate new key */ + rijndael_ecb_encrypt(prng->fortuna.IV, prng->fortuna.K , &prng->fortuna.skey); fortuna_update_iv(prng); + rijndael_ecb_encrypt(prng->fortuna.IV, prng->fortuna.K+16, &prng->fortuna.skey); fortuna_update_iv(prng); + if ((err = rijndael_setup(prng->fortuna.K, 32, 0, &prng->fortuna.skey)) != CRYPT_OK) { + return 0; + } + +#ifdef CLEAN_STACK + zeromem(tmp, sizeof(tmp)); +#endif + return tlen; +} + +void fortuna_done(prng_state *prng) +{ + _ARGCHK(prng != NULL); + /* call cipher done when we invent one ;-) */ +} + +int fortuna_export(unsigned char *out, unsigned long *outlen, prng_state *prng) +{ + int x; + + _ARGCHK(out != NULL); + _ARGCHK(outlen != NULL); + _ARGCHK(prng != NULL); + + /* we'll write 2048 bytes for s&g's */ + if (*outlen < 2048) { + return CRYPT_BUFFER_OVERFLOW; + } + + for (x = 0; x < 32; x++) { + if (fortuna_read(out+x*64, 64, prng) != 64) { + return CRYPT_ERROR_READPRNG; + } + } + *outlen = 2048; + + return CRYPT_OK; +} + +int fortuna_import(const unsigned char *in, unsigned long inlen, prng_state *prng) +{ + int err, x; + + _ARGCHK(in != NULL); + _ARGCHK(prng != NULL); + + if (inlen != 2048) { + return CRYPT_INVALID_ARG; + } + + if ((err = fortuna_start(prng)) != CRYPT_OK) { + return err; + } + for (x = 0; x < 32; x++) { + if ((err = fortuna_add_entropy(in+x*64, 64, &prng)) != CRYPT_OK) { + return err; + } + } + return fortuna_ready(&prng); +} + +#endif + diff --git a/hmac_done.c b/hmac_done.c index c308cc3..7ded6a1 100644 --- a/hmac_done.c +++ b/hmac_done.c @@ -94,6 +94,7 @@ int hmac_done(hmac_state *hmac, unsigned char *hashOut, unsigned long *outlen) err = CRYPT_OK; __ERR: + XFREE(hmac->key); #ifdef CLEAN_STACK zeromem(isha, hashsize); zeromem(buf, hashsize); diff --git a/hmac_init.c b/hmac_init.c index 076b529..2cbf001 100644 --- a/hmac_init.c +++ b/hmac_init.c @@ -61,9 +61,16 @@ int hmac_init(hmac_state *hmac, int hash, const unsigned char *key, unsigned lon return CRYPT_MEM; } + /* allocate memory for key */ + hmac->key = XMALLOC(HMAC_BLOCKSIZE); + if (hmac->key == NULL) { + XFREE(buf); + return CRYPT_MEM; + } + // (1) make sure we have a large enough key if(keylen > HMAC_BLOCKSIZE) { - z = (unsigned long)sizeof(hmac->key); + z = (unsigned long)HMAC_BLOCKSIZE; if ((err = hash_memory(hash, key, keylen, hmac->key, &z)) != CRYPT_OK) { goto __ERR; } diff --git a/hmac_test.c b/hmac_test.c index 4ec7d94..c0f2185 100644 --- a/hmac_test.c +++ b/hmac_test.c @@ -285,7 +285,7 @@ Key First" outlen = sizeof(digest); if((err = hmac_memory(hash, cases[i].key, cases[i].keylen, cases[i].data, cases[i].datalen, digest, &outlen)) != CRYPT_OK) { #if 0 - printf("HMAC-%s test #%d\n", cases[i].algo, cases[i].num); + printf("HMAC-%s test #%d, %s\n", cases[i].algo, cases[i].num, error_to_string(err)); #endif return err; } diff --git a/ltc_tommath.h b/ltc_tommath.h index a53c973..3276141 100644 --- a/ltc_tommath.h +++ b/ltc_tommath.h @@ -1,3 +1,4 @@ + /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision @@ -20,6 +21,7 @@ #include #include #include +#include #undef MIN #define MIN(x,y) ((x)<(y)?(x):(y)) @@ -147,7 +149,7 @@ extern "C" { typedef int mp_err; /* you'll have to tune these... */ - int KARATSUBA_MUL_CUTOFF, +extern int KARATSUBA_MUL_CUTOFF, KARATSUBA_SQR_CUTOFF, TOOM_MUL_CUTOFF, TOOM_SQR_CUTOFF; @@ -552,6 +554,7 @@ void bn_reverse(unsigned char *s, int len); const char *mp_s_rmap; + #ifdef __cplusplus } #endif diff --git a/makefile b/makefile index 6b9a5da..b9e810f 100644 --- a/makefile +++ b/makefile @@ -4,7 +4,7 @@ # Modified by Clay Culver # The version -VERSION=0.97a +VERSION=0.97b # Compiler and Linker Names #CC=gcc @@ -63,7 +63,7 @@ crypt_find_cipher_id.o crypt_find_prng.o crypt_prng_is_valid.o \ crypt_unregister_cipher.o crypt_cipher_is_valid.o crypt_find_hash.o \ crypt_hash_descriptor.o crypt_register_cipher.o crypt_unregister_hash.o \ \ -sprng.o yarrow.o rc4.o rng_get_bytes.o rng_make_prng.o \ +fortuna.o sprng.o yarrow.o rc4.o rng_get_bytes.o rng_make_prng.o \ \ rand_prime.o is_prime.o \ \ @@ -71,6 +71,7 @@ ecc.o dh.o \ \ rsa_decrypt_key.o rsa_encrypt_key.o rsa_exptmod.o rsa_free.o rsa_make_key.o \ rsa_sign_hash.o rsa_verify_hash.o rsa_export.o rsa_import.o tim_exptmod.o \ +rsa_v15_encrypt_key.o rsa_v15_decrypt_key.o rsa_v15_sign_hash.o rsa_v15_verify_hash.o \ \ dsa_export.o dsa_free.o dsa_import.o dsa_make_key.o dsa_sign_hash.o \ dsa_verify_hash.o dsa_verify_key.o \ diff --git a/makefile.cygwin_dll b/makefile.cygwin_dll index 287677d..0dece2f 100644 --- a/makefile.cygwin_dll +++ b/makefile.cygwin_dll @@ -28,7 +28,7 @@ crypt_find_cipher_id.o crypt_find_prng.o crypt_prng_is_valid.o \ crypt_unregister_cipher.o crypt_cipher_is_valid.o crypt_find_hash.o \ crypt_hash_descriptor.o crypt_register_cipher.o crypt_unregister_hash.o \ \ -sprng.o yarrow.o rc4.o rng_get_bytes.o rng_make_prng.o \ +sprng.o fortuna.o yarrow.o rc4.o rng_get_bytes.o rng_make_prng.o \ \ rand_prime.o is_prime.o \ \ @@ -36,6 +36,7 @@ ecc.o dh.o \ \ rsa_decrypt_key.o rsa_encrypt_key.o rsa_exptmod.o rsa_free.o rsa_make_key.o \ rsa_sign_hash.o rsa_verify_hash.o rsa_export.o rsa_import.o tim_exptmod.o \ +rsa_v15_encrypt_key.o rsa_v15_decrypt_key.o rsa_v15_sign_hash.o rsa_v15_verify_hash.o \ \ dsa_export.o dsa_free.o dsa_import.o dsa_make_key.o dsa_sign_hash.o \ dsa_verify_hash.o dsa_verify_key.o \ diff --git a/makefile.icc b/makefile.icc index e49cb66..4019e2f 100644 --- a/makefile.icc +++ b/makefile.icc @@ -41,7 +41,7 @@ default:library # B - Blend of P4 and PM [mobile] # # Default to just generic max opts -CFLAGS += -O3 -xN -ip +CFLAGS += -O3 -xN -ip # want to see stuff? #CFLAGS += -opt_report @@ -79,7 +79,7 @@ crypt_find_cipher_id.o crypt_find_prng.o crypt_prng_is_valid.o \ crypt_unregister_cipher.o crypt_cipher_is_valid.o crypt_find_hash.o \ crypt_hash_descriptor.o crypt_register_cipher.o crypt_unregister_hash.o \ \ -sprng.o yarrow.o rc4.o rng_get_bytes.o rng_make_prng.o \ +sprng.o fortuna.o yarrow.o rc4.o rng_get_bytes.o rng_make_prng.o \ \ rand_prime.o is_prime.o \ \ @@ -87,6 +87,7 @@ ecc.o dh.o \ \ rsa_decrypt_key.o rsa_encrypt_key.o rsa_exptmod.o rsa_free.o rsa_make_key.o \ rsa_sign_hash.o rsa_verify_hash.o rsa_export.o rsa_import.o tim_exptmod.o \ +rsa_v15_encrypt_key.o rsa_v15_decrypt_key.o rsa_v15_sign_hash.o rsa_v15_verify_hash.o \ \ dsa_export.o dsa_free.o dsa_import.o dsa_make_key.o dsa_sign_hash.o \ dsa_verify_hash.o dsa_verify_key.o \ diff --git a/makefile.msvc b/makefile.msvc index aa8a9bc..6fd60ef 100644 --- a/makefile.msvc +++ b/makefile.msvc @@ -18,7 +18,7 @@ crypt_find_cipher_id.obj crypt_find_prng.obj crypt_prng_is_valid.obj crypt_unregister_cipher.obj crypt_cipher_is_valid.obj crypt_find_hash.obj \ crypt_hash_descriptor.obj crypt_register_cipher.obj crypt_unregister_hash.obj \ \ -sprng.obj yarrow.obj rc4.obj rng_get_bytes.obj rng_make_prng.obj \ +sprng.obj fortuna.obj yarrow.obj rc4.obj rng_get_bytes.obj rng_make_prng.obj \ \ rand_prime.obj is_prime.obj \ \ @@ -26,6 +26,7 @@ ecc.obj dh.obj \ \ rsa_decrypt_key.obj rsa_encrypt_key.obj rsa_exptmod.obj rsa_free.obj rsa_make_key.obj \ rsa_sign_hash.obj rsa_verify_hash.obj rsa_export.obj rsa_import.obj tim_exptmod.obj \ +rsa_v15_encrypt_key.obj rsa_v15_decrypt_key.obj rsa_v15_sign_hash.obj rsa_v15_verify_hash.obj \ \ dsa_export.obj dsa_free.obj dsa_import.obj dsa_make_key.obj dsa_sign_hash.obj \ dsa_verify_hash.obj dsa_verify_key.obj \ diff --git a/mpi.c b/mpi.c index d3d9918..ae120d8 100644 --- a/mpi.c +++ b/mpi.c @@ -258,6 +258,15 @@ fast_mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho) /* now we proceed to zero successive digits * from the least significant upwards */ +#ifdef LTMSSE + // compute globals we'd like to have in MMX registers + asm ("movl $268435455,%%eax \n\t" //mm2 == MP_MASK + "movd %%eax,%%mm2 \n\t" + "movd %0,%%mm3 \n\t" //mm3 = rho + "movq (%1),%%mm0 \n\t" // W[ix] for ix=0 + ::"r"(rho),"r"(W):"%eax"); +#endif + for (ix = 0; ix < n->used; ix++) { /* mu = ai * m' mod b * @@ -265,9 +274,13 @@ fast_mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho) * by casting the value down to a mp_digit. Note this requires * that W[ix-1] have the carry cleared (see after the inner loop) */ +#ifndef LTMSSE register mp_digit mu; mu = (mp_digit) (((W[ix] & MP_MASK) * rho) & MP_MASK); - +#else + asm("pmuludq %mm3,%mm0 \n\t" // multiply against rho + "pand %mm2,%mm0 \n\t"); // mu == mm0 +#endif /* a = a + mu * m * b**i * * This is computed in place and on the fly. The multiplication @@ -295,13 +308,33 @@ fast_mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho) /* inner loop */ for (iy = 0; iy < n->used; iy++) { +#ifndef LTMSSE *_W++ += ((mp_word)mu) * ((mp_word)*tmpn++); +#else +// SSE version + asm ("movd (%0), %%mm1 \n\t" // load right side + "pmuludq %%mm0,%%mm1 \n\t" // multiply into left side + "paddq (%1),%%mm1 \n\t" // add 64-bit result out + "movq %%mm1,(%1)" // store result + :: "r"(tmpn), "r"(_W)); + // update pointers + ++tmpn; + ++_W; +#endif } } /* now fix carry for next digit, W[ix+1] */ +#ifndef LTMSSE W[ix + 1] += W[ix] >> ((mp_word) DIGIT_BIT); - } +#else + asm("movq (%0),%%mm0 \n\t" // W[ix] + "psrlq $28,%%mm0 \n\t" // W[ix]>>28 + "paddq 8(%0),%%mm0 \n\t" // W[ix+1] + W[ix]>>28 + "movq %%mm0,8(%0) " // store + ::"r"(&W[ix])); +#endif +} /* now we have to propagate the carries and * shift the words downward [all those least @@ -319,35 +352,36 @@ fast_mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho) /* alias for next word, where the carry goes */ _W = W + ++ix; - for (; ix <= n->used * 2 + 1; ix++) { - *_W++ += *_W1++ >> ((mp_word) DIGIT_BIT); - } - - /* copy out, A = A/b**n - * - * The result is A/b**n but instead of converting from an - * array of mp_word to mp_digit than calling mp_rshd - * we just copy them in the right order - */ - /* alias for destination word */ tmpx = x->dp; - /* alias for shifted double precision result */ - _W = W + n->used; - - for (ix = 0; ix < n->used + 1; ix++) { - *tmpx++ = (mp_digit)(*_W++ & ((mp_word) MP_MASK)); + for (; ix <= n->used * 2 + 1; ix++) { +#ifndef LTMSSE + *tmpx++ = (mp_digit)(*_W1 & ((mp_word) MP_MASK)); + *_W++ += *_W1++ >> ((mp_word) DIGIT_BIT); +#else + asm("movq %%mm0,%%mm1 \n\t" // copy of W[ix] + "psrlq $28,%%mm0 \n\t" // >>28 + "pand %%mm2,%%mm1 \n\t" // & with MP_MASK + "paddq (%0),%%mm0 \n\t" // += _W + "movd %%mm1,(%1) \n\t" // store it + ::"r"(_W),"r"(tmpx)); + ++_W; ++tmpx; +#endif } /* zero oldused digits, if the input a was larger than * m->used+1 we'll have to clear the digits */ - for (; ix < olduse; ix++) { + for (ix = n->used + 1; ix < olduse; ix++) { *tmpx++ = 0; } } +#ifdef LTMSSE + asm("emms"); +#endif + /* set the max used and clamp */ x->used = n->used + 1; mp_clamp (x); @@ -408,7 +442,7 @@ fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) } /* clear temp buf (the columns) */ - XMEMSET (W, 0, sizeof (mp_word) * digs); + memset (W, 0, sizeof (mp_word) * digs); /* calculate the columns */ pa = a->used; @@ -423,13 +457,21 @@ fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) * the loop without scheduling problems */ { - register mp_digit tmpx, *tmpy; +#ifndef LTMSSE + register mp_digit tmpx; +#endif + + register mp_digit *tmpy; register mp_word *_W; register int iy, pb; /* alias for the the word on the left e.g. A[ix] * A[iy] */ +#ifndef LTMSSE tmpx = a->dp[ix]; - +#else +// SSE: now we load the left side in mm0 + asm (" movd %0, %%mm0 " :: "r"(a->dp[ix])); +#endif /* alias for the right side */ tmpy = b->dp; @@ -445,7 +487,19 @@ fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) pb = MIN (b->used, digs - ix); for (iy = 0; iy < pb; iy++) { +#ifndef LTMSSE *_W++ += ((mp_word)tmpx) * ((mp_word)*tmpy++); +#else +// SSE version + asm ("movd (%0), %%mm1 \n\t" // load right side + "pmuludq %%mm0,%%mm1 \n\t" // multiply into left side + "paddq (%1), %%mm1 \n\t" // add 64-bit result out + "movq %%mm1,(%1)" // store result + :: "r"(tmpy), "r"(_W)); + // update pointers + ++tmpy; + ++_W; +#endif } } @@ -474,21 +528,56 @@ fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) * last digit to copy */ tmpc = c->dp; + +#ifdef LTMSSE + // mm2 has W[ix-1] + asm("movq (%0),%%mm2"::"r"(W)); +#endif + for (ix = 1; ix < digs; ix++) { +#ifndef LTMSSE /* forward the carry from the previous temp */ W[ix] += (W[ix - 1] >> ((mp_word) DIGIT_BIT)); /* now extract the previous digit [below the carry] */ *tmpc++ = (mp_digit) (W[ix - 1] & ((mp_word) MP_MASK)); + +#else + asm( + "movq (%0),%%mm1 \n\t" // W[ix] + "movd %%mm2,%%eax \n\t" // get 32-bit version of it W[ix-1] + "psrlq $28,%%mm2 \n\t" // W[ix-1] >> DIGIT_BIT ... must be 28 + "andl $268435455,%%eax \n\t" // & with MP_MASK against W[ix-1] + "paddq %%mm1,%%mm2 \n\t" // add them + "movl %%eax,(%1) \n\t" // store it + :: "r"(&W[ix]), "r"(tmpc) : "%eax"); + ++tmpc; +#endif + } + +#ifndef LTMSSE /* fetch the last digit */ *tmpc++ = (mp_digit) (W[digs - 1] & ((mp_word) MP_MASK)); +#else + // get last since we don't store into W[ix] anymore ;-) + asm("movd %%mm2,%%eax \n\t" + "andl $268435455,%%eax \n\t" // & with MP_MASK against W[ix-1] + "movl %%eax,(%0)" // store it + ::"r"(tmpc):"%eax"); + ++tmpc; +#endif /* clear unused digits [that existed in the old copy of c] */ for (; ix < olduse; ix++) { *tmpc++ = 0; } } + +#ifdef LTMSSE + asm("emms"); +#endif + mp_clamp (c); return MP_OKAY; } @@ -538,10 +627,14 @@ fast_s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) /* like the other comba method we compute the columns first */ pa = a->used; pb = b->used; - XMEMSET (W + digs, 0, (pa + pb + 1 - digs) * sizeof (mp_word)); + memset (W + digs, 0, (pa + pb + 1 - digs) * sizeof (mp_word)); for (ix = 0; ix < pa; ix++) { { - register mp_digit tmpx, *tmpy; +#ifndef LTMSSE + register mp_digit tmpx; +#endif + + register mp_digit *tmpy; register int iy; register mp_word *_W; @@ -549,7 +642,12 @@ fast_s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) iy = digs - ix; /* copy of word on the left of A[ix] * B[iy] */ +#ifndef LTMSSE tmpx = a->dp[ix]; +#else +//SSE we load tmpx into mm0 + asm (" movd %0, %%mm0 " :: "r"(a->dp[ix])); +#endif /* alias for right side */ tmpy = b->dp + iy; @@ -569,8 +667,21 @@ fast_s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) /* compute column products for digits above the minimum */ for (; iy < pb; iy++) { +#ifndef LTMSSE *_W++ += ((mp_word) tmpx) * ((mp_word)*tmpy++); +#else +// SSE version + asm ("movd (%0), %%mm1 \n\t" // load right side + "pmuludq %%mm0,%%mm1 \n\t" // multiply into left side + "paddq (%1),%%mm1 \n\t" // add 64-bit result out + "movq %%mm1,(%1)" // store result + :: "r"(tmpy), "r"(_W)); + // update pointers + ++tmpy; + ++_W; +#endif } + } } @@ -582,15 +693,46 @@ fast_s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) * * See comments in bn_fast_s_mp_mul_digs.c */ +#ifdef LTMSSE + // mm2 has W[ix-1] + asm("movq (%0),%%mm2"::"r"(W + digs)); +#endif + for (ix = digs + 1; ix < newused; ix++) { + /* forward the carry from the previous temp */ +#ifndef LTMSSE W[ix] += (W[ix - 1] >> ((mp_word) DIGIT_BIT)); c->dp[ix - 1] = (mp_digit) (W[ix - 1] & ((mp_word) MP_MASK)); +#else + asm( + "movd %%mm2,%%eax \n\t" // get 32-bit version of it W[ix-1] + "psrlq $28,%%mm2 \n\t" // W[ix-1] >> DIGIT_BIT ... must be 28 + "andl $268435455,%%eax \n\t" // & with MP_MASK against W[ix-1] + "paddq (%0),%%mm2 \n\t" // add them + "movl %%eax,(%1) \n\t" // store it + :: "r"(&W[ix]), "r"(&c->dp[ix-1]) : "%eax"); +#endif + } + +#ifndef LTMSSE c->dp[newused - 1] = (mp_digit) (W[newused - 1] & ((mp_word) MP_MASK)); +#else + // get last since we don't store into W[ix] anymore ;-) + asm("movd %%mm2,%%eax\n\t" + "andl $268435455,%%eax \n\t" // & with MP_MASK against W[ix-1] + "movl %%eax,(%0)" // store it + ::"r"(&(c->dp[newused-1])):"%eax"); +#endif for (; ix < oldused; ix++) { c->dp[ix] = 0; } + +#ifdef LTMSSE + asm("emms"); +#endif + mp_clamp (c); return MP_OKAY; } @@ -638,7 +780,7 @@ int fast_s_mp_sqr (mp_int * a, mp_int * b) /* calculate size of product and allocate as required */ pa = a->used; - newused = pa + pa + 1; + newused = pa + pa; if (b->alloc < newused) { if ((res = mp_grow (b, newused)) != MP_OKAY) { return res; @@ -654,12 +796,15 @@ int fast_s_mp_sqr (mp_int * a, mp_int * b) * the inner product can be doubled using n doublings instead of * n**2 */ - XMEMSET (W, 0, newused * sizeof (mp_word)); - XMEMSET (W2, 0, newused * sizeof (mp_word)); + memset (W, 0, newused * sizeof (mp_word)); +#ifndef LTMSSE + memset (W2, 0, newused * sizeof (mp_word)); +#endif /* This computes the inner product. To simplify the inner N**2 loop * the multiplication by two is done afterwards in the N loop. */ + for (ix = 0; ix < pa; ix++) { /* compute the outer product * @@ -668,15 +813,31 @@ int fast_s_mp_sqr (mp_int * a, mp_int * b) * there is no need todo a double precision addition * into the W2[] array. */ +#ifndef LTMSSE W2[ix + ix] = ((mp_word)a->dp[ix]) * ((mp_word)a->dp[ix]); +#else + asm("movd %0,%%xmm0 \n\t" // load a->dp[ix] + "movdq2q %%xmm0,%%mm0 \n\t" // get 64-bit version + "pmuludq %%xmm0,%%xmm0 \n\t" // square it + "movdqu %%xmm0,(%1) \n\t" // store it (8-byte result, 8-byte zero) + ::"r"(a->dp[ix]), "r"(&(W2[ix+ix]))); +#endif { - register mp_digit tmpx, *tmpy; +#ifndef LTMSSE + register mp_digit tmpx; +#endif + register mp_digit *tmpy; register mp_word *_W; register int iy; /* copy of left side */ +#ifndef LTMSSE tmpx = a->dp[ix]; +#else +//SSE we load tmpx into mm0 [note: loaded above] +// asm (" movd %0, %%mm0 " :: "r"(a->dp[ix])); +#endif /* alias for right side */ tmpy = a->dp + (ix + 1); @@ -686,7 +847,19 @@ int fast_s_mp_sqr (mp_int * a, mp_int * b) /* inner products */ for (iy = ix + 1; iy < pa; iy++) { +#ifndef LTMSSE *_W++ += ((mp_word)tmpx) * ((mp_word)*tmpy++); +#else +// SSE version + asm ("movd (%0), %%mm1 \n\t" // load right side + "pmuludq %%mm0,%%mm1 \n\t" // multiply into left side + "paddq (%1),%%mm1 \n\t" // add 64-bit result out + "movq %%mm1,(%1)" // store result + :: "r"(tmpy), "r"(_W)); + // update pointers + ++tmpy; + ++_W; +#endif } } } @@ -707,10 +880,19 @@ int fast_s_mp_sqr (mp_int * a, mp_int * b) /* double first value, since the inner products are * half of what they should be */ - W[0] += W[0] + W2[0]; - tmpb = b->dp; +#ifndef LTMSSE + W[0] += W[0] + W2[0]; +#else + // mm2 has W[ix-1] + asm("movq (%0),%%mm2 \n\t" // load W[0] + "paddq %%mm2,%%mm2 \n\t" // W[0] + W[0] + "paddq (%1),%%mm2 \n\t" // W[0] + W[0] + W2[0] + ::"r"(W),"r"(W2)); +#endif + for (ix = 1; ix < newused; ix++) { +#ifndef LTMSSE /* double/add next digit */ W[ix] += W[ix] + W2[ix]; @@ -721,12 +903,34 @@ int fast_s_mp_sqr (mp_int * a, mp_int * b) * needed */ *tmpb++ = (mp_digit) (W[ix - 1] & ((mp_word) MP_MASK)); +#else + asm( "movq (%0),%%mm0 \n\t" // load W[ix] + "movd %%mm2,%%eax \n\t" // 32-bit version of W[ix-1] + "paddq %%mm0,%%mm0 \n\t" // W[ix] + W[ix] + "psrlq $28,%%mm2 \n\t" // W[ix-1] >> DIGIT_BIT ... must be 28 + "paddq (%1),%%mm0 \n\t" // W[ix] + W[ix] + W2[ix] + "andl $268435455,%%eax \n\t" // & with MP_MASK against W[ix-1] + "paddq %%mm0,%%mm2 \n\t" // W[ix] + W[ix] + W2[ix] + W[ix-1]>>DIGIT_BIT + "movl %%eax,(%2) " // store it + :: "r"(&W[ix]), "r"(&W2[ix]), "r"(tmpb):"%eax"); + ++tmpb; +#endif } + +#ifndef LTMSSE /* set the last value. Note even if the carry is zero * this is required since the next step will not zero * it if b originally had a value at b->dp[2*a.used] */ *tmpb++ = (mp_digit) (W[(newused) - 1] & ((mp_word) MP_MASK)); +#else + // get last since we don't store into W[ix] anymore ;-) + asm("movd %%mm2,%%eax \n\t" + "andl $268435455,%%eax \n\t" // & with MP_MASK against W[ix-1] + "movl %%eax,(%0) " // store it + ::"r"(tmpb):"%eax"); + ++tmpb; +#endif /* clear high digits of b if there were any originally */ for (; ix < olduse; ix++) { @@ -734,6 +938,10 @@ int fast_s_mp_sqr (mp_int * a, mp_int * b) } } +#ifdef LTMSSE + asm("emms"); +#endif + mp_clamp (b); return MP_OKAY; } @@ -1142,10 +1350,14 @@ mp_clamp (mp_int * a) void mp_clear (mp_int * a) { + int i; + /* only do anything if a hasn't been freed previously */ if (a->dp != NULL) { /* first zero the digits */ - XMEMSET (a->dp, 0, sizeof (mp_digit) * a->used); + for (i = 0; i < a->used; i++) { + a->dp[i] = 0; + } /* free ram */ XFREE(a->dp); @@ -3083,15 +3295,22 @@ int mp_grow (mp_int * a, int size) */ #include -/* init a new bigint */ +/* init a new mp_int */ int mp_init (mp_int * a) { + int i; + /* allocate memory required and clear it */ - a->dp = OPT_CAST(mp_digit) XCALLOC (sizeof (mp_digit), MP_PREC); + a->dp = OPT_CAST(mp_digit) XMALLOC (sizeof (mp_digit) * MP_PREC); if (a->dp == NULL) { return MP_MEM; } + /* set the digits to zero */ + for (i = 0; i < MP_PREC; i++) { + a->dp[i] = 0; + } + /* set the used to zero, allocated digits to the default precision * and sign to positive */ a->used = 0; @@ -7538,7 +7757,7 @@ mp_zero (mp_int * a) { a->sign = MP_ZPOS; a->used = 0; - XMEMSET (a->dp, 0, sizeof (mp_digit) * a->alloc); + memset (a->dp, 0, sizeof (mp_digit) * a->alloc); } /* End: bn_mp_zero.c */ @@ -8396,6 +8615,7 @@ s_mp_sub (mp_int * a, mp_int * b, mp_int * c) CPU /Compiler /MUL CUTOFF/SQR CUTOFF ------------------------------------------------------------- + Intel P4 Northwood /GCC v3.3.3 / 121/ 128/SSE patches ;-) Intel P4 Northwood /GCC v3.3.3 / 59/ 81/profiled build Intel P4 Northwood /GCC v3.3.3 / 59/ 80/profiled_single build Intel P4 Northwood /ICC v8.0 / 57/ 70/profiled build @@ -8404,8 +8624,8 @@ s_mp_sub (mp_int * a, mp_int * b, mp_int * c) */ -int KARATSUBA_MUL_CUTOFF = 57, /* Min. number of digits before Karatsuba multiplication is used. */ - KARATSUBA_SQR_CUTOFF = 70, /* Min. number of digits before Karatsuba squaring is used. */ +int KARATSUBA_MUL_CUTOFF = 121, /* Min. number of digits before Karatsuba multiplication is used. */ + KARATSUBA_SQR_CUTOFF = 128, /* Min. number of digits before Karatsuba squaring is used. */ TOOM_MUL_CUTOFF = 350, /* no optimal values of these are known yet so set em high */ TOOM_SQR_CUTOFF = 400; diff --git a/mycrypt.h b/mycrypt.h index 887bc43..43a93e9 100644 --- a/mycrypt.h +++ b/mycrypt.h @@ -16,8 +16,8 @@ extern "C" { #endif /* version */ -#define CRYPT 0x0097 -#define SCRYPT "0.97a" +#define CRYPT 0x0098 +#define SCRYPT "0.98" /* max size of either a cipher/hash block or symmetric key [largest of the two] */ #define MAXBLOCKSIZE 64 diff --git a/mycrypt_cfg.h b/mycrypt_cfg.h index 175c0ea..d24824e 100644 --- a/mycrypt_cfg.h +++ b/mycrypt_cfg.h @@ -8,10 +8,10 @@ #define MYCRYPT_CFG_H /* you can change how memory allocation works ... */ - void *XMALLOC(size_t n); - void *REALLOC(void *p, size_t n); - void *XCALLOC(size_t n, size_t s); - void XFREE(void *p); +void *XMALLOC(size_t n); +void *REALLOC(void *p, size_t n); +void *XCALLOC(size_t n, size_t s); +void XFREE(void *p); /* change the clock function too */ clock_t XCLOCK(void); diff --git a/mycrypt_custom.h b/mycrypt_custom.h index 980b799..1e00830 100644 --- a/mycrypt_custom.h +++ b/mycrypt_custom.h @@ -5,10 +5,6 @@ #ifndef MYCRYPT_CUSTOM_H_ #define MYCRYPT_CUSTOM_H_ -#ifdef CRYPT - #error mycrypt_custom.h should be included before mycrypt.h -#endif - /* macros for various libc functions you can change for embedded targets */ #define XMALLOC malloc #define XREALLOC realloc @@ -28,7 +24,7 @@ #define LTC_TEST /* clean the stack of functions which put private information on stack */ -//#define CLEAN_STACK +// #define CLEAN_STACK /* disable all file related functions */ //#define NO_FILE @@ -43,8 +39,8 @@ #define XTEA #define TWOFISH #define TWOFISH_TABLES -//#define TWOFISH_ALL_TABLES -//#define TWOFISH_SMALL +// #define TWOFISH_ALL_TABLES +// #define TWOFISH_SMALL #define DES #define CAST5 #define NOEKEON @@ -92,6 +88,13 @@ #define YARROW_AES 0 #define SPRNG #define RC4 + +/* Fortuna */ +#define FORTUNA +/* reseed every N calls to the read function */ +#define FORTUNA_WD 1024 + + #define DEVRANDOM #define TRY_URANDOM_FIRST @@ -133,11 +136,12 @@ /* Include the MPI functionality? (required by the PK algorithms) */ #define MPI +/* Use SSE2 optimizations in LTM? Requires GCC or ICC and a P4 or K8 processor */ +// #define LTMSSE + /* PKCS #1 and #5 stuff */ #define PKCS_1 #define PKCS_5 -#include - #endif diff --git a/mycrypt_hash.h b/mycrypt_hash.h index dc828a4..b661d12 100644 --- a/mycrypt_hash.h +++ b/mycrypt_hash.h @@ -276,7 +276,7 @@ typedef struct Hmac_state { hash_state md; int hash; hash_state hashstate; - unsigned char key[MAXBLOCKSIZE]; + unsigned char *key; } hmac_state; int hmac_init(hmac_state *hmac, int hash, const unsigned char *key, unsigned long keylen); diff --git a/mycrypt_pk.h b/mycrypt_pk.h index 148ead3..9afacda 100644 --- a/mycrypt_pk.h +++ b/mycrypt_pk.h @@ -113,6 +113,7 @@ typedef struct Rsa_key { void rsa_free(rsa_key *key); +/* These use PKCS #1 v2.0 padding */ int rsa_encrypt_key(const unsigned char *inkey, unsigned long inlen, unsigned char *outkey, unsigned long *outlen, const unsigned char *lparam, unsigned long lparamlen, @@ -137,6 +138,30 @@ int rsa_verify_hash(const unsigned char *sig, unsigned long siglen, int hash_idx, unsigned long saltlen, int *stat, rsa_key *key); +/* these use PKCS #1 v1.5 padding */ +int rsa_v15_encrypt_key(const unsigned char *inkey, unsigned long inlen, + unsigned char *outkey, unsigned long *outlen, + prng_state *prng, int prng_idx, + rsa_key *key); + +int rsa_v15_decrypt_key(const unsigned char *in, unsigned long inlen, + unsigned char *outkey, unsigned long keylen, + prng_state *prng, int prng_idx, + int *res, rsa_key *key); + +int rsa_v15_sign_hash(const unsigned char *msghash, unsigned long msghashlen, + unsigned char *sig, unsigned long *siglen, + prng_state *prng, int prng_idx, + int hash_idx, rsa_key *key); + +int rsa_v15_verify_hash(const unsigned char *sig, unsigned long siglen, + const unsigned char *msghash, unsigned long msghashlen, + prng_state *prng, int prng_idx, + int hash_idx, int *stat, + rsa_key *key); + + +/* PKCS #1 import/export */ int rsa_export(unsigned char *out, unsigned long *outlen, int type, rsa_key *key); int rsa_import(const unsigned char *in, unsigned long inlen, rsa_key *key); diff --git a/mycrypt_prng.h b/mycrypt_prng.h index 64d862f..3ded2cc 100644 --- a/mycrypt_prng.h +++ b/mycrypt_prng.h @@ -10,9 +10,25 @@ struct rc4_prng { unsigned char buf[256]; }; +struct fortuna_prng { + hash_state pool[32]; /* the 32 pools */ + + symmetric_key skey; + + unsigned char K[32], /* the current key */ + IV[16]; /* IV for CTR mode */ + + unsigned long pool_idx, /* current pool we will add to */ + pool0_len, /* length of 0'th pool */ + wd; + + ulong64 reset_cnt; /* number of times we have reset */ +}; + typedef union Prng_state { struct yarrow_prng yarrow; struct rc4_prng rc4; + struct fortuna_prng fortuna; } prng_state; extern struct _prng_descriptor { @@ -20,7 +36,10 @@ extern struct _prng_descriptor { int (*start)(prng_state *); int (*add_entropy)(const unsigned char *, unsigned long, prng_state *); int (*ready)(prng_state *); - unsigned long (*read)(unsigned char *, unsigned long len, prng_state *); + unsigned long (*read)(unsigned char *, unsigned long, prng_state *); + void (*done)(prng_state *); + int (*export)(unsigned char *, unsigned long *, prng_state *); + int (*import)(const unsigned char *, unsigned long, prng_state *); } prng_descriptor[]; #ifdef YARROW @@ -28,14 +47,31 @@ extern struct _prng_descriptor { int yarrow_add_entropy(const unsigned char *buf, unsigned long len, prng_state *prng); int yarrow_ready(prng_state *prng); unsigned long yarrow_read(unsigned char *buf, unsigned long len, prng_state *prng); + void yarrow_done(prng_state *prng); + int yarrow_export(unsigned char *out, unsigned long *outlen, prng_state *prng); + int yarrow_import(const unsigned char *in, unsigned long inlen, prng_state *prng); extern const struct _prng_descriptor yarrow_desc; #endif +#ifdef FORTUNA + int fortuna_start(prng_state *prng); + int fortuna_add_entropy(const unsigned char *buf, unsigned long len, prng_state *prng); + int fortuna_ready(prng_state *prng); + unsigned long fortuna_read(unsigned char *buf, unsigned long len, prng_state *prng); + void fortuna_done(prng_state *prng); + int fortuna_export(unsigned char *out, unsigned long *outlen, prng_state *prng); + int fortuna_import(const unsigned char *in, unsigned long inlen, prng_state *prng); + extern const struct _prng_descriptor fortuna_desc; +#endif + #ifdef RC4 int rc4_start(prng_state *prng); int rc4_add_entropy(const unsigned char *buf, unsigned long len, prng_state *prng); int rc4_ready(prng_state *prng); unsigned long rc4_read(unsigned char *buf, unsigned long len, prng_state *prng); + void rc4_done(prng_state *prng); + int rc4_export(unsigned char *out, unsigned long *outlen, prng_state *prng); + int rc4_import(const unsigned char *in, unsigned long inlen, prng_state *prng); extern const struct _prng_descriptor rc4_desc; #endif @@ -44,6 +80,9 @@ extern struct _prng_descriptor { int sprng_add_entropy(const unsigned char *buf, unsigned long len, prng_state *prng); int sprng_ready(prng_state *prng); unsigned long sprng_read(unsigned char *buf, unsigned long len, prng_state *prng); + void sprng_done(prng_state *prng); + int sprng_export(unsigned char *out, unsigned long *outlen, prng_state *prng); + int sprng_import(const unsigned char *in, unsigned long inlen, prng_state *prng); extern const struct _prng_descriptor sprng_desc; #endif diff --git a/pkcs_5_2.c b/pkcs_5_2.c index 7bc2786..a58994f 100644 --- a/pkcs_5_2.c +++ b/pkcs_5_2.c @@ -52,7 +52,7 @@ int pkcs_5_alg2(const unsigned char *password, unsigned long password_len, stored = 0; while (left != 0) { /* process block number blkno */ - zeromem(buf, MAXBLOCKSIZE*2); + zeromem(buf[0], MAXBLOCKSIZE*2); /* store current block number and increment for next pass */ STORE32H(blkno, buf[1]); @@ -75,7 +75,7 @@ int pkcs_5_alg2(const unsigned char *password, unsigned long password_len, /* now compute repeated and XOR it in buf[1] */ XMEMCPY(buf[1], buf[0], x); - for (itts = 2; itts < iteration_count; ++itts) { + for (itts = 1; itts < iteration_count; ++itts) { if ((err = hmac_memory(hash_idx, password, password_len, buf[0], x, buf[0], &x)) != CRYPT_OK) { goto __ERR; } diff --git a/rc2.c b/rc2.c index a8f1d2d..f3f8c31 100644 --- a/rc2.c +++ b/rc2.c @@ -33,17 +33,8 @@ const struct _cipher_descriptor rc2_desc = { &rc2_keysize }; - -/**********************************************************************\ -* Expand a variable-length user key (between 1 and 128 bytes) to a * -* 64-short working rc2 key, of at most "bits" effective key bits. * -* The effective key bits parameter looks like an export control hack. * -* For normal use, it should always be set to 1024. For convenience, * -* zero is accepted as an alias for 1024. * -\**********************************************************************/ - - /* 256-entry permutation table, probably derived somehow from pi */ - static const unsigned char permute[256] = { +/* 256-entry permutation table, probably derived somehow from pi */ +static const unsigned char permute[256] = { 217,120,249,196, 25,221,181,237, 40,233,253,121, 74,160,216,157, 198,126, 55,131, 43,118, 83,142, 98, 76,100,136, 68,139,251,162, 23,154, 89,245,135,179, 79, 19, 97, 69,109,141, 9,129,125, 50, @@ -60,7 +51,7 @@ const struct _cipher_descriptor rc2_desc = { 211, 0,230,207,225,158,168, 44, 99, 22, 1, 63, 88,226,137,169, 13, 56, 52, 27,171, 51,255,176,187, 72, 12, 95,185,177,205, 46, 197,243,219, 71,229,165,156,119, 10,166, 32,104,254,127,193,173 - }; +}; int rc2_setup(const unsigned char *key, int keylen, int rounds, symmetric_key *skey) { @@ -87,24 +78,23 @@ int rc2_setup(const unsigned char *key, int keylen, int rounds, symmetric_key *s /* Phase 1: Expand input key to 128 bytes */ if (keylen < 128) { for (i = keylen; i < 128; i++) { - tmp[i] = permute[(int)((tmp[i - 1] + tmp[i - keylen]) & 255)]; + tmp[i] = permute[(tmp[i - 1] + tmp[i - keylen]) & 255]; } } /* Phase 2 - reduce effective key size to "bits" */ - bits = keylen*8; + bits = keylen<<3; T8 = (unsigned)(bits+7)>>3; TM = (255 >> (unsigned)(7 & -bits)); - tmp[128 - T8] = permute[(int)(tmp[128 - T8] & TM)]; + tmp[128 - T8] = permute[tmp[128 - T8] & TM]; for (i = 127 - T8; i >= 0; i--) { - tmp[i] = permute[(int)(tmp[i + 1] ^ tmp[i + T8])]; + tmp[i] = permute[tmp[i + 1] ^ tmp[i + T8]]; } /* Phase 3 - copy to xkey in little-endian order */ - i = 63; - do { + for (i = 0; i < 64; i++) { xkey[i] = (unsigned)tmp[2*i] + ((unsigned)tmp[2*i+1] << 8); - } while (i-- > 0); + } #ifdef CLEAN_STACK zeromem(tmp, sizeof(tmp)); @@ -129,9 +119,9 @@ void rc2_ecb_encrypt( const unsigned char *plain, unsigned *xkey; unsigned x76, x54, x32, x10, i; - _ARGCHK(plain != NULL); + _ARGCHK(plain != NULL); _ARGCHK(cipher != NULL); - _ARGCHK(skey != NULL); + _ARGCHK(skey != NULL); xkey = skey->rc2.xkey; @@ -142,16 +132,16 @@ void rc2_ecb_encrypt( const unsigned char *plain, for (i = 0; i < 16; i++) { x10 = (x10 + (x32 & ~x76) + (x54 & x76) + xkey[4*i+0]) & 0xFFFF; - x10 = ((x10 << 1) | (x10 >> 15)) & 0xFFFF; + x10 = ((x10 << 1) | (x10 >> 15)); x32 = (x32 + (x54 & ~x10) + (x76 & x10) + xkey[4*i+1]) & 0xFFFF; - x32 = ((x32 << 2) | (x32 >> 14)) & 0xFFFF; + x32 = ((x32 << 2) | (x32 >> 14)); x54 = (x54 + (x76 & ~x32) + (x10 & x32) + xkey[4*i+2]) & 0xFFFF; - x54 = ((x54 << 3) | (x54 >> 13)) & 0xFFFF; + x54 = ((x54 << 3) | (x54 >> 13)); x76 = (x76 + (x10 & ~x54) + (x32 & x54) + xkey[4*i+3]) & 0xFFFF; - x76 = ((x76 << 5) | (x76 >> 11)) & 0xFFFF; + x76 = ((x76 << 5) | (x76 >> 11)); if (i == 4 || i == 10) { x10 = (x10 + xkey[x76 & 63]) & 0xFFFF; @@ -199,9 +189,9 @@ void rc2_ecb_decrypt( const unsigned char *cipher, unsigned *xkey; int i; - _ARGCHK(plain != NULL); + _ARGCHK(plain != NULL); _ARGCHK(cipher != NULL); - _ARGCHK(skey != NULL); + _ARGCHK(skey != NULL); xkey = skey->rc2.xkey; @@ -218,16 +208,16 @@ void rc2_ecb_decrypt( const unsigned char *cipher, x10 = (x10 - xkey[x76 & 63]) & 0xFFFF; } - x76 = ((x76 << 11) | (x76 >> 5)) & 0xFFFF; + x76 = ((x76 << 11) | (x76 >> 5)); x76 = (x76 - ((x10 & ~x54) + (x32 & x54) + xkey[4*i+3])) & 0xFFFF; - x54 = ((x54 << 13) | (x54 >> 3)) & 0xFFFF; + x54 = ((x54 << 13) | (x54 >> 3)); x54 = (x54 - ((x76 & ~x32) + (x10 & x32) + xkey[4*i+2])) & 0xFFFF; - x32 = ((x32 << 14) | (x32 >> 2)) & 0xFFFF; + x32 = ((x32 << 14) | (x32 >> 2)); x32 = (x32 - ((x54 & ~x10) + (x76 & x10) + xkey[4*i+1])) & 0xFFFF; - x10 = ((x10 << 15) | (x10 >> 1)) & 0xFFFF; + x10 = ((x10 << 15) | (x10 >> 1)); x10 = (x10 - ((x32 & ~x76) + (x54 & x76) + xkey[4*i+0])) & 0xFFFF; } diff --git a/rc4.c b/rc4.c index e218f9b..b340204 100644 --- a/rc4.c +++ b/rc4.c @@ -18,7 +18,10 @@ const struct _prng_descriptor rc4_desc = &rc4_start, &rc4_add_entropy, &rc4_ready, - &rc4_read + &rc4_read, + &rc4_done, + &rc4_export, + &rc4_import }; int rc4_start(prng_state *prng) @@ -96,12 +99,31 @@ unsigned long rc4_read(unsigned char *buf, unsigned long len, prng_state *prng) y = (y + s[x]) & 255; tmp = s[x]; s[x] = s[y]; s[y] = tmp; tmp = (s[x] + s[y]) & 255; - *buf++ ^= s[tmp]; + *buf++ = s[tmp]; } prng->rc4.x = x; prng->rc4.y = y; return n; } +void rc4_done(prng_state *prng) +{ + _ARGCHK(prng != NULL); +} + +int rc4_export(unsigned char *out, unsigned long *outlen, prng_state *prng) +{ + _ARGCHK(outlen != NULL); + + *outlen = 0; + return CRYPT_OK; +} + +int rc4_import(const unsigned char *in, unsigned long inlen, prng_state *prng) +{ + return CRYPT_OK; +} + + #endif diff --git a/rsa_decrypt_key.c b/rsa_decrypt_key.c index d6b6553..ccdc8b1 100644 --- a/rsa_decrypt_key.c +++ b/rsa_decrypt_key.c @@ -30,7 +30,10 @@ int rsa_decrypt_key(const unsigned char *in, unsigned long inlen, _ARGCHK(key != NULL); _ARGCHK(res != NULL); - /* valid hash ? */ + /* valid hash/prng ? */ + if ((err = prng_is_valid(prng_idx)) != CRYPT_OK) { + return err; + } if ((err = hash_is_valid(hash_idx)) != CRYPT_OK) { return err; } diff --git a/rsa_v15_decrypt_key.c b/rsa_v15_decrypt_key.c new file mode 100644 index 0000000..fa187ba --- /dev/null +++ b/rsa_v15_decrypt_key.c @@ -0,0 +1,63 @@ + /* LibTomCrypt, modular cryptographic library -- Tom St Denis + * + * LibTomCrypt is a library that provides various cryptographic + * algorithms in a highly modular and flexible manner. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://libtomcrypt.org + */ + +#include "mycrypt.h" + +#ifdef MRSA + +/* decrypt then PKCS #1 v1.5 depad */ +int rsa_v15_decrypt_key(const unsigned char *in, unsigned long inlen, + unsigned char *outkey, unsigned long keylen, + prng_state *prng, int prng_idx, + int *res, rsa_key *key) +{ + unsigned long modulus_bitlen, modulus_bytelen, x; + int err; + unsigned char *tmp; + + _ARGCHK(outkey != NULL); + _ARGCHK(key != NULL); + _ARGCHK(res != NULL); + + /* valid prng ? */ + if ((err = prng_is_valid(prng_idx)) != CRYPT_OK) { + return err; + } + + /* get modulus len in bits */ + modulus_bitlen = mp_count_bits(&(key->N)); + + /* outlen must be at least the size of the modulus */ + modulus_bytelen = mp_unsigned_bin_size(&(key->N)); + if (modulus_bytelen != inlen) { + return CRYPT_INVALID_PACKET; + } + + /* allocate ram */ + tmp = XMALLOC(inlen); + if (tmp == NULL) { + return CRYPT_MEM; + } + + /* rsa decode the packet */ + x = inlen; + if ((err = rsa_exptmod(in, inlen, tmp, &x, PK_PRIVATE, prng, prng_idx, key)) != CRYPT_OK) { + XFREE(tmp); + return err; + } + + /* PKCS #1 v1.5 depad */ + err = pkcs_1_v15_es_decode(tmp, x, modulus_bitlen, outkey, keylen, res); + XFREE(tmp); + return err; +} + +#endif diff --git a/rsa_v15_encrypt_key.c b/rsa_v15_encrypt_key.c new file mode 100644 index 0000000..3724a72 --- /dev/null +++ b/rsa_v15_encrypt_key.c @@ -0,0 +1,54 @@ +/* LibTomCrypt, modular cryptographic library -- Tom St Denis + * + * LibTomCrypt is a library that provides various cryptographic + * algorithms in a highly modular and flexible manner. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://libtomcrypt.org + */ + +#include "mycrypt.h" + +#ifdef MRSA + +/* PKCS #1 v1.5 pad then encrypt */ +int rsa_v15_encrypt_key(const unsigned char *inkey, unsigned long inlen, + unsigned char *outkey, unsigned long *outlen, + prng_state *prng, int prng_idx, + rsa_key *key) +{ + unsigned long modulus_bitlen, modulus_bytelen, x; + int err; + + _ARGCHK(inkey != NULL); + _ARGCHK(outkey != NULL); + _ARGCHK(outlen != NULL); + _ARGCHK(key != NULL); + + /* valid prng? */ + if ((err = prng_is_valid(prng_idx)) != CRYPT_OK) { + return err; + } + + /* get modulus len in bits */ + modulus_bitlen = mp_count_bits(&(key->N)); + + /* outlen must be at least the size of the modulus */ + modulus_bytelen = mp_unsigned_bin_size(&(key->N)); + if (modulus_bytelen > *outlen) { + return CRYPT_BUFFER_OVERFLOW; + } + + /* pad it */ + x = *outlen; + if ((err = pkcs_1_v15_es_encode(inkey, inlen, modulus_bitlen, prng, prng_idx, outkey, &x)) != CRYPT_OK) { + return err; + } + + /* encrypt it */ + return rsa_exptmod(outkey, x, outkey, outlen, PK_PUBLIC, prng, prng_idx, key); +} + +#endif diff --git a/rsa_v15_sign_hash.c b/rsa_v15_sign_hash.c new file mode 100644 index 0000000..0a3da2a --- /dev/null +++ b/rsa_v15_sign_hash.c @@ -0,0 +1,57 @@ +/* LibTomCrypt, modular cryptographic library -- Tom St Denis + * + * LibTomCrypt is a library that provides various cryptographic + * algorithms in a highly modular and flexible manner. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://libtomcrypt.org + */ + +#include "mycrypt.h" + +#ifdef MRSA + +/* PKCS #1 v1.5 pad then sign */ +int rsa_v15_sign_hash(const unsigned char *msghash, unsigned long msghashlen, + unsigned char *sig, unsigned long *siglen, + prng_state *prng, int prng_idx, + int hash_idx, rsa_key *key) +{ + unsigned long modulus_bitlen, modulus_bytelen, x; + int err; + + _ARGCHK(msghash != NULL); + _ARGCHK(sig != NULL); + _ARGCHK(siglen != NULL); + _ARGCHK(key != NULL); + + /* valid prng and hash ? */ + if ((err = prng_is_valid(prng_idx)) != CRYPT_OK) { + return err; + } + if ((err = hash_is_valid(hash_idx)) != CRYPT_OK) { + return err; + } + + /* get modulus len in bits */ + modulus_bitlen = mp_count_bits(&(key->N)); + + /* outlen must be at least the size of the modulus */ + modulus_bytelen = mp_unsigned_bin_size(&(key->N)); + if (modulus_bytelen > *siglen) { + return CRYPT_BUFFER_OVERFLOW; + } + + /* PKCS #1 v1.5 pad the key */ + x = *siglen; + if ((err = pkcs_1_v15_sa_encode(msghash, msghashlen, hash_idx, modulus_bitlen, sig, &x)) != CRYPT_OK) { + return err; + } + + /* RSA encode it */ + return rsa_exptmod(sig, x, sig, siglen, PK_PRIVATE, prng, prng_idx, key); +} + +#endif diff --git a/rsa_v15_verify_hash.c b/rsa_v15_verify_hash.c new file mode 100644 index 0000000..80ca72a --- /dev/null +++ b/rsa_v15_verify_hash.c @@ -0,0 +1,69 @@ +/* LibTomCrypt, modular cryptographic library -- Tom St Denis + * + * LibTomCrypt is a library that provides various cryptographic + * algorithms in a highly modular and flexible manner. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://libtomcrypt.org + */ + +#include "mycrypt.h" + +#ifdef MRSA + +/* design then PKCS v1.5 depad */ +int rsa_v15_verify_hash(const unsigned char *sig, unsigned long siglen, + const unsigned char *msghash, unsigned long msghashlen, + prng_state *prng, int prng_idx, + int hash_idx, int *stat, + rsa_key *key) +{ + unsigned long modulus_bitlen, modulus_bytelen, x; + int err; + unsigned char *tmpbuf; + + _ARGCHK(msghash != NULL); + _ARGCHK(sig != NULL); + _ARGCHK(stat != NULL); + _ARGCHK(key != NULL); + + /* valid hash ? */ + if ((err = hash_is_valid(hash_idx)) != CRYPT_OK) { + return err; + } + + if ((err = prng_is_valid(prng_idx)) != CRYPT_OK) { + return err; + } + + /* get modulus len in bits */ + modulus_bitlen = mp_count_bits(&(key->N)); + + /* outlen must be at least the size of the modulus */ + modulus_bytelen = mp_unsigned_bin_size(&(key->N)); + if (modulus_bytelen != siglen) { + return CRYPT_INVALID_PACKET; + } + + /* allocate temp buffer for decoded sig */ + tmpbuf = XMALLOC(siglen); + if (tmpbuf == NULL) { + return CRYPT_MEM; + } + + /* RSA decode it */ + x = siglen; + if ((err = rsa_exptmod(sig, siglen, tmpbuf, &x, PK_PUBLIC, prng, prng_idx, key)) != CRYPT_OK) { + XFREE(tmpbuf); + return err; + } + + /* PSS decode it */ + err = pkcs_1_v15_sa_decode(msghash, msghashlen, tmpbuf, x, hash_idx, modulus_bitlen, stat); + XFREE(tmpbuf); + return err; +} + +#endif diff --git a/sprng.c b/sprng.c index db6e338..f1de461 100644 --- a/sprng.c +++ b/sprng.c @@ -23,7 +23,11 @@ const struct _prng_descriptor sprng_desc = &sprng_start, &sprng_add_entropy, &sprng_ready, - &sprng_read + &sprng_read, + &sprng_done, + &sprng_export, + &sprng_import + }; int sprng_start(prng_state *prng) @@ -47,6 +51,24 @@ unsigned long sprng_read(unsigned char *buf, unsigned long len, prng_state *prng return rng_get_bytes(buf, len, NULL); } +void sprng_done(prng_state *prng) +{ + _ARGCHK(prng != NULL); +} + +int sprng_export(unsigned char *out, unsigned long *outlen, prng_state *prng) +{ + _ARGCHK(outlen != NULL); + + *outlen = 0; + return CRYPT_OK; +} + +int sprng_import(const unsigned char *in, unsigned long inlen, prng_state *prng) +{ + return CRYPT_OK; +} + #endif diff --git a/yarrow.c b/yarrow.c index 4415f78..7354d47 100644 --- a/yarrow.c +++ b/yarrow.c @@ -19,7 +19,10 @@ const struct _prng_descriptor yarrow_desc = &yarrow_start, &yarrow_add_entropy, &yarrow_ready, - &yarrow_read + &yarrow_read, + &yarrow_done, + &yarrow_export, + &yarrow_import }; int yarrow_start(prng_state *prng) @@ -180,5 +183,50 @@ unsigned long yarrow_read(unsigned char *buf, unsigned long len, prng_state *prn return len; } +void yarrow_done(prng_state *prng) +{ + _ARGCHK(prng != NULL); + /* call cipher done when we invent one ;-) */ +} + +int yarrow_export(unsigned char *out, unsigned long *outlen, prng_state *prng) +{ + _ARGCHK(out != NULL); + _ARGCHK(outlen != NULL); + _ARGCHK(prng != NULL); + + /* we'll write 64 bytes for s&g's */ + if (*outlen < 64) { + return CRYPT_BUFFER_OVERFLOW; + } + + if (yarrow_read(out, 64, prng) != 64) { + return CRYPT_ERROR_READPRNG; + } + *outlen = 64; + + return CRYPT_OK; +} + +int yarrow_import(const unsigned char *in, unsigned long inlen, prng_state *prng) +{ + int err; + + _ARGCHK(in != NULL); + _ARGCHK(prng != NULL); + + if (inlen != 64) { + return CRYPT_INVALID_ARG; + } + + if ((err = yarrow_start(prng)) != CRYPT_OK) { + return err; + } + if ((err = yarrow_add_entropy(in, 64, &prng)) != CRYPT_OK) { + return err; + } + return yarrow_ready(&prng); +} + #endif