Codebase list libcryptx-perl / 91ae9db
LTC sync Karel Miko 6 years ago
31 changed file(s) with 736 addition(s) and 591 deletion(s). Raw diff Collapse all Expand all
381381 /* --- */
382382 if(register_prng(&fortuna_desc)==-1) { croak("FATAL: cannot register_prng fortuna"); }
383383 if(register_prng(&yarrow_desc)==-1) { croak("FATAL: cannot register_prng yarrow"); }
384 if(register_prng(&rc4_prng_desc)==-1) { croak("FATAL: cannot register_prng rc4"); }
385 if(register_prng(&sober128_prng_desc)==-1) { croak("FATAL: cannot register_prng sober128"); }
384 if(register_prng(&rc4_desc)==-1) { croak("FATAL: cannot register_prng rc4"); }
385 if(register_prng(&sober128_desc)==-1) { croak("FATAL: cannot register_prng sober128"); }
386386 if(register_prng(&chacha20_prng_desc)==-1) { croak("FATAL: cannot register_prng chacha20"); }
387387 /* --- */
388388 #ifdef TFM_DESC
1313 Newz(0, RETVAL, 1, struct rc4_struct);
1414 if (!RETVAL) croak("FATAL: Newz failed");
1515
16 rv = rc4_setup(&RETVAL->state, k, (unsigned long)k_len);
17 if (rv != CRYPT_OK) croak("FATAL: rc4_setup failed: %s", error_to_string(rv));
16 rv = rc4_stream_setup(&RETVAL->state, k, (unsigned long)k_len);
17 if (rv != CRYPT_OK) croak("FATAL: rc4_stream_setup failed: %s", error_to_string(rv));
1818 }
1919 OUTPUT:
2020 RETVAL
2222 void
2323 DESTROY(Crypt::Stream::RC4 self)
2424 CODE:
25 rc4_done(&self->state);
25 rc4_stream_done(&self->state);
2626 Safefree(self);
2727
2828 Crypt::Stream::RC4
4545 SvPOK_only(RETVAL);
4646 SvCUR_set(RETVAL, out_len);
4747 out_data = (unsigned char *)SvPV_nolen(RETVAL);
48 rv = rc4_keystream(&self->state, out_data, out_len);
49 if (rv != CRYPT_OK) croak("FATAL: rc4_keystream failed: %s", error_to_string(rv));
48 rv = rc4_stream_keystream(&self->state, out_data, out_len);
49 if (rv != CRYPT_OK) croak("FATAL: rc4_stream_keystream failed: %s", error_to_string(rv));
5050 }
5151 OUTPUT:
5252 RETVAL
6868 SvPOK_only(RETVAL);
6969 SvCUR_set(RETVAL, in_data_len);
7070 out_data = (unsigned char *)SvPV_nolen(RETVAL);
71 rv = rc4_crypt(&self->state, in_data, (unsigned long)in_data_len, out_data);
72 if (rv != CRYPT_OK) croak("FATAL: rc4_crypt failed: %s", error_to_string(rv));
71 rv = rc4_stream_crypt(&self->state, in_data, (unsigned long)in_data_len, out_data);
72 if (rv != CRYPT_OK) croak("FATAL: rc4_stream_crypt failed: %s", error_to_string(rv));
7373 }
7474 }
7575 OUTPUT:
1515 Newz(0, RETVAL, 1, struct sober128_struct);
1616 if (!RETVAL) croak("FATAL: Newz failed");
1717
18 rv = sober128_setup(&RETVAL->state, k, (unsigned long)k_len);
19 if (rv != CRYPT_OK) croak("FATAL: sober128_setup failed: %s", error_to_string(rv));
18 rv = sober128_stream_setup(&RETVAL->state, k, (unsigned long)k_len);
19 if (rv != CRYPT_OK) croak("FATAL: sober128_stream_setup failed: %s", error_to_string(rv));
2020
21 rv = sober128_setiv(&RETVAL->state, iv, (unsigned long)iv_len);
22 if (rv != CRYPT_OK) croak("FATAL: sober128_setiv failed: %s", error_to_string(rv));
21 rv = sober128_stream_setiv(&RETVAL->state, iv, (unsigned long)iv_len);
22 if (rv != CRYPT_OK) croak("FATAL: sober128_stream_setiv failed: %s", error_to_string(rv));
2323 }
2424 OUTPUT:
2525 RETVAL
2727 void
2828 DESTROY(Crypt::Stream::Sober128 self)
2929 CODE:
30 sober128_done(&self->state);
30 sober128_stream_done(&self->state);
3131 Safefree(self);
3232
3333 Crypt::Stream::Sober128
5050 SvPOK_only(RETVAL);
5151 SvCUR_set(RETVAL, out_len);
5252 out_data = (unsigned char *)SvPV_nolen(RETVAL);
53 rv = sober128_keystream(&self->state, out_data, out_len);
54 if (rv != CRYPT_OK) croak("FATAL: sober128_keystream failed: %s", error_to_string(rv));
53 rv = sober128_stream_keystream(&self->state, out_data, out_len);
54 if (rv != CRYPT_OK) croak("FATAL: sober128_stream_keystream failed: %s", error_to_string(rv));
5555 }
5656 OUTPUT:
5757 RETVAL
7373 SvPOK_only(RETVAL);
7474 SvCUR_set(RETVAL, in_data_len);
7575 out_data = (unsigned char *)SvPV_nolen(RETVAL);
76 rv = sober128_crypt(&self->state, in_data, (unsigned long)in_data_len, out_data);
77 if (rv != CRYPT_OK) croak("FATAL: sober128_crypt failed: %s", error_to_string(rv));
76 rv = sober128_stream_crypt(&self->state, in_data, (unsigned long)in_data_len, out_data);
77 if (rv != CRYPT_OK) croak("FATAL: sober128_stream_crypt failed: %s", error_to_string(rv));
7878 }
7979 }
8080 OUTPUT:
2626 int hash_filehandle(int hash, FILE *in, unsigned char *out, unsigned long *outlen)
2727 {
2828 hash_state md;
29 unsigned char buf[512];
29 unsigned char *buf;
3030 size_t x;
3131 int err;
3232
3434 LTC_ARGCHK(outlen != NULL);
3535 LTC_ARGCHK(in != NULL);
3636
37 if ((buf = XMALLOC(LTC_FILE_READ_BUFSIZE)) == NULL) {
38 return CRYPT_MEM;
39 }
40
3741 if ((err = hash_is_valid(hash)) != CRYPT_OK) {
38 return err;
42 goto LBL_ERR;
3943 }
4044
4145 if (*outlen < hash_descriptor[hash].hashsize) {
4246 *outlen = hash_descriptor[hash].hashsize;
43 return CRYPT_BUFFER_OVERFLOW;
47 err = CRYPT_BUFFER_OVERFLOW;
48 goto LBL_ERR;
4449 }
4550 if ((err = hash_descriptor[hash].init(&md)) != CRYPT_OK) {
46 return err;
51 goto LBL_ERR;
4752 }
4853
4954 *outlen = hash_descriptor[hash].hashsize;
5055 do {
51 x = fread(buf, 1, sizeof(buf), in);
56 x = fread(buf, 1, LTC_FILE_READ_BUFSIZE, in);
5257 if ((err = hash_descriptor[hash].process(&md, buf, (unsigned long)x)) != CRYPT_OK) {
53 return err;
58 goto LBL_CLEANBUF;
5459 }
55 } while (x == sizeof(buf));
60 } while (x == LTC_FILE_READ_BUFSIZE);
5661 err = hash_descriptor[hash].done(&md, out);
5762
58 #ifdef LTC_CLEAN_STACK
59 zeromem(buf, sizeof(buf));
60 #endif
63 LBL_CLEANBUF:
64 zeromem(buf, LTC_FILE_READ_BUFSIZE);
65 LBL_ERR:
66 XFREE(buf);
6167 return err;
6268 }
6369 #endif /* #ifndef LTC_NO_FILE */
958958
959959 #endif /* LTC_CHACHA */
960960
961 #ifdef LTC_RC4
962
963 typedef struct {
964 int x, y;
961 #ifdef LTC_RC4_STREAM
962
963 typedef struct {
964 unsigned int x, y;
965965 unsigned char buf[256];
966966 } rc4_state;
967967
968 int rc4_setup(rc4_state *st, const unsigned char *key, unsigned long keylen);
969 int rc4_crypt(rc4_state *st, const unsigned char *in, unsigned long inlen, unsigned char *out);
970 int rc4_keystream(rc4_state *st, unsigned char *out, unsigned long outlen);
971 int rc4_done(rc4_state *st);
972 int rc4_test(void);
973
974 #endif /* LTC_RC4 */
975
976 #ifdef LTC_SOBER128
968 int rc4_stream_setup(rc4_state *st, const unsigned char *key, unsigned long keylen);
969 int rc4_stream_crypt(rc4_state *st, const unsigned char *in, unsigned long inlen, unsigned char *out);
970 int rc4_stream_keystream(rc4_state *st, unsigned char *out, unsigned long outlen);
971 int rc4_stream_done(rc4_state *st);
972 int rc4_stream_test(void);
973
974 #endif /* LTC_RC4_STREAM */
975
976 #ifdef LTC_SOBER128_STREAM
977977
978978 typedef struct {
979979 ulong32 R[17], /* Working storage for the shift register */
983983 int nbuf; /* number of part-word stream bits buffered */
984984 } sober128_state;
985985
986 int sober128_setup(sober128_state *st, const unsigned char *key, unsigned long keylen);
987 int sober128_setiv(sober128_state *st, const unsigned char *iv, unsigned long ivlen);
988 int sober128_crypt(sober128_state *st, const unsigned char *in, unsigned long inlen, unsigned char *out);
989 int sober128_keystream(sober128_state *st, unsigned char *out, unsigned long outlen);
990 int sober128_done(sober128_state *st);
991 int sober128_test(void);
992
993 #endif /* LTC_SOBER128 */
986 int sober128_stream_setup(sober128_state *st, const unsigned char *key, unsigned long keylen);
987 int sober128_stream_setiv(sober128_state *st, const unsigned char *iv, unsigned long ivlen);
988 int sober128_stream_crypt(sober128_state *st, const unsigned char *in, unsigned long inlen, unsigned char *out);
989 int sober128_stream_keystream(sober128_state *st, unsigned char *out, unsigned long outlen);
990 int sober128_stream_done(sober128_state *st);
991 int sober128_stream_test(void);
992
993 #endif /* LTC_SOBER128_STREAM */
994994
995995 /* $Source$ */
996996 /* $Revision$ */
194194
195195 /* stream ciphers */
196196 #define LTC_CHACHA
197 #define LTC_RC4
198 #define LTC_SOBER128
197 #define LTC_RC4_STREAM
198 #define LTC_SOBER128_STREAM
199199
200200 #endif /* LTC_NO_CIPHERS */
201201
301301 #define LTC_SPRNG
302302
303303 /* The RC4 stream cipher based PRNG */
304 #define LTC_RC4_PRNG
304 #define LTC_RC4
305305
306306 /* The ChaCha20 stream cipher based PRNG */
307307 #define LTC_CHACHA20_PRNG
310310 #define LTC_FORTUNA
311311
312312 /* Greg's SOBER128 stream cipher based PRNG */
313 #define LTC_SOBER128_PRNG
313 #define LTC_SOBER128
314314
315315 /* the *nix style /dev/random device */
316316 #define LTC_DEVRANDOM
556556 #error LTC_CHACHA20_PRNG requires LTC_CHACHA
557557 #endif
558558
559 #if defined(LTC_RC4_PRNG) && !defined(LTC_RC4)
560 #error LTC_RC4_PRNG requires LTC_RC4
561 #endif
562
563 #if defined(LTC_SOBER128_PRNG) && !defined(LTC_SOBER128)
564 #error LTC_SOBER128_PRNG requires LTC_SOBER128
559 #if defined(LTC_RC4) && !defined(LTC_RC4_STREAM)
560 #error LTC_RC4 requires LTC_RC4_STREAM
561 #endif
562
563 #if defined(LTC_SOBER128) && !defined(LTC_SOBER128_STREAM)
564 #error LTC_SOBER128 requires LTC_SOBER128_STREAM
565565 #endif
566566
567567 #if defined(LTC_BLAKE2SMAC) && !defined(LTC_BLAKE2S)
33 int cipher, hash;
44 unsigned char pool[MAXBLOCKSIZE];
55 symmetric_CTR ctr;
6 LTC_MUTEX_TYPE(prng_lock)
76 };
87 #endif
98
109 #ifdef LTC_RC4
1110 struct rc4_prng {
1211 rc4_state s;
13 short ready;
1412 };
1513 #endif
1614
1917 chacha_state s; /* chacha state */
2018 unsigned char ent[40]; /* entropy buffer */
2119 unsigned long idx; /* entropy counter */
22 short ready; /* ready flag 0-1 */
2320 };
2421 #endif
2522
3734 wd;
3835
3936 ulong64 reset_cnt; /* number of times we have reset */
40 LTC_MUTEX_TYPE(prng_lock)
4137 };
4238 #endif
4339
4642 sober128_state s; /* sober128 state */
4743 unsigned char ent[40]; /* entropy buffer */
4844 unsigned long idx; /* entropy counter */
49 short ready; /* ready flag 0-1 */
50 };
51 #endif
52
53 typedef union Prng_state {
54 char dummy[1];
45 };
46 #endif
47
48 typedef struct {
49 union {
50 char dummy[1];
5551 #ifdef LTC_YARROW
56 struct yarrow_prng yarrow;
52 struct yarrow_prng yarrow;
5753 #endif
5854 #ifdef LTC_RC4
59 struct rc4_prng rc4;
55 struct rc4_prng rc4;
6056 #endif
6157 #ifdef LTC_CHACHA20_PRNG
62 struct chacha20_prng chacha;
58 struct chacha20_prng chacha;
6359 #endif
6460 #ifdef LTC_FORTUNA
65 struct fortuna_prng fortuna;
61 struct fortuna_prng fortuna;
6662 #endif
6763 #ifdef LTC_SOBER128
68 struct sober128_prng sober128;
69 #endif
64 struct sober128_prng sober128;
65 #endif
66 };
67 short ready; /* ready flag 0-1 */
68 LTC_MUTEX_TYPE(lock); /* lock */
7069 } prng_state;
7170
7271 /** PRNG descriptor */
149148 #endif
150149
151150 #ifdef LTC_RC4
152 int rc4_prng_start(prng_state *prng);
153 int rc4_prng_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
154 int rc4_prng_ready(prng_state *prng);
155 unsigned long rc4_prng_read(unsigned char *out, unsigned long outlen, prng_state *prng);
156 int rc4_prng_done(prng_state *prng);
157 int rc4_prng_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
158 int rc4_prng_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
159 int rc4_prng_test(void);
160 extern const struct ltc_prng_descriptor rc4_prng_desc;
151 int rc4_start(prng_state *prng);
152 int rc4_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
153 int rc4_ready(prng_state *prng);
154 unsigned long rc4_read(unsigned char *out, unsigned long outlen, prng_state *prng);
155 int rc4_done(prng_state *prng);
156 int rc4_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
157 int rc4_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
158 int rc4_test(void);
159 extern const struct ltc_prng_descriptor rc4_desc;
161160 #endif
162161
163162 #ifdef LTC_CHACHA20_PRNG
185184 #endif
186185
187186 #ifdef LTC_SOBER128
188 int sober128_prng_start(prng_state *prng);
189 int sober128_prng_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
190 int sober128_prng_ready(prng_state *prng);
191 unsigned long sober128_prng_read(unsigned char *out, unsigned long outlen, prng_state *prng);
192 int sober128_prng_done(prng_state *prng);
193 int sober128_prng_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
194 int sober128_prng_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
195 int sober128_prng_test(void);
196 extern const struct ltc_prng_descriptor sober128_prng_desc;
187 int sober128_start(prng_state *prng);
188 int sober128_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
189 int sober128_ready(prng_state *prng);
190 unsigned long sober128_read(unsigned char *out, unsigned long outlen, prng_state *prng);
191 int sober128_done(prng_state *prng);
192 int sober128_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
193 int sober128_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
194 int sober128_test(void);
195 extern const struct ltc_prng_descriptor sober128_desc;
197196 #endif
198197
199198 int find_prng(const char *name);
2121 @param cipher The index of the cipher desired
2222 @param key The secret key
2323 @param keylen The length of the secret key (octets)
24 @param filename The name of the file you wish to f9
24 @param fname The name of the file you wish to f9
2525 @param out [out] Where the authentication tag is to be stored
2626 @param outlen [in/out] The max size and resulting size of the authentication tag
2727 @return CRYPT_OK if successful, CRYPT_NOP if file support has been disabled
2828 */
2929 int f9_file(int cipher,
3030 const unsigned char *key, unsigned long keylen,
31 const char *filename,
31 const char *fname,
3232 unsigned char *out, unsigned long *outlen)
3333 {
3434 #ifdef LTC_NO_FILE
3838 int err;
3939 f9_state f9;
4040 FILE *in;
41 unsigned char buf[512];
41 unsigned char *buf;
4242
43 LTC_ARGCHK(key != NULL);
44 LTC_ARGCHK(filename != NULL);
45 LTC_ARGCHK(out != NULL);
46 LTC_ARGCHK(outlen != NULL);
43 LTC_ARGCHK(key != NULL);
44 LTC_ARGCHK(fname != NULL);
45 LTC_ARGCHK(out != NULL);
46 LTC_ARGCHK(outlen != NULL);
4747
48 in = fopen(filename, "rb");
49 if (in == NULL) {
50 return CRYPT_FILE_NOTFOUND;
48 if ((buf = XMALLOC(LTC_FILE_READ_BUFSIZE)) == NULL) {
49 return CRYPT_MEM;
5150 }
5251
5352 if ((err = f9_init(&f9, cipher, key, keylen)) != CRYPT_OK) {
54 fclose(in);
55 return err;
53 goto LBL_ERR;
54 }
55
56 in = fopen(fname, "rb");
57 if (in == NULL) {
58 err = CRYPT_FILE_NOTFOUND;
59 goto LBL_ERR;
5660 }
5761
5862 do {
59 x = fread(buf, 1, sizeof(buf), in);
63 x = fread(buf, 1, LTC_FILE_READ_BUFSIZE, in);
6064 if ((err = f9_process(&f9, buf, (unsigned long)x)) != CRYPT_OK) {
6165 fclose(in);
62 return err;
66 goto LBL_CLEANBUF;
6367 }
64 } while (x == sizeof(buf));
65 fclose(in);
68 } while (x == LTC_FILE_READ_BUFSIZE);
6669
67 if ((err = f9_done(&f9, out, outlen)) != CRYPT_OK) {
68 return err;
70 if (fclose(in) != 0) {
71 err = CRYPT_ERROR;
72 goto LBL_CLEANBUF;
6973 }
7074
75 err = f9_done(&f9, out, outlen);
76
77 LBL_CLEANBUF:
78 zeromem(buf, LTC_FILE_READ_BUFSIZE);
79 LBL_ERR:
7180 #ifdef LTC_CLEAN_STACK
72 zeromem(buf, sizeof(buf));
81 zeromem(&f9, sizeof(f9_state));
7382 #endif
74
75 return CRYPT_OK;
83 XFREE(buf);
84 return err;
7685 #endif
7786 }
7887
3535 #else
3636 hmac_state hmac;
3737 FILE *in;
38 unsigned char buf[512];
38 unsigned char *buf;
3939 size_t x;
4040 int err;
4141
4444 LTC_ARGCHK(out != NULL);
4545 LTC_ARGCHK(outlen != NULL);
4646
47 if((err = hash_is_valid(hash)) != CRYPT_OK) {
48 return err;
47 if ((buf = XMALLOC(LTC_FILE_READ_BUFSIZE)) == NULL) {
48 return CRYPT_MEM;
49 }
50
51 if ((err = hash_is_valid(hash)) != CRYPT_OK) {
52 goto LBL_ERR;
4953 }
5054
5155 if ((err = hmac_init(&hmac, hash, key, keylen)) != CRYPT_OK) {
52 return err;
56 goto LBL_ERR;
5357 }
5458
5559 in = fopen(fname, "rb");
5660 if (in == NULL) {
57 return CRYPT_FILE_NOTFOUND;
61 err = CRYPT_FILE_NOTFOUND;
62 goto LBL_ERR;
5863 }
5964
60 /* process the file contents */
6165 do {
62 x = fread(buf, 1, sizeof(buf), in);
66 x = fread(buf, 1, LTC_FILE_READ_BUFSIZE, in);
6367 if ((err = hmac_process(&hmac, buf, (unsigned long)x)) != CRYPT_OK) {
64 /* we don't trap this error since we're already returning an error! */
65 fclose(in);
66 return err;
68 fclose(in); /* we don't trap this error since we're already returning an error! */
69 goto LBL_CLEANBUF;
6770 }
68 } while (x == sizeof(buf));
71 } while (x == LTC_FILE_READ_BUFSIZE);
6972
7073 if (fclose(in) != 0) {
71 return CRYPT_ERROR;
74 err = CRYPT_ERROR;
75 goto LBL_CLEANBUF;
7276 }
7377
74 /* get final hmac */
75 if ((err = hmac_done(&hmac, out, outlen)) != CRYPT_OK) {
76 return err;
77 }
78 err = hmac_done(&hmac, out, outlen);
7879
80 LBL_CLEANBUF:
81 zeromem(buf, LTC_FILE_READ_BUFSIZE);
82 LBL_ERR:
7983 #ifdef LTC_CLEAN_STACK
80 /* clear memory */
81 zeromem(buf, sizeof(buf));
84 zeromem(&hmac, sizeof(hmac_state));
8285 #endif
83 return CRYPT_OK;
86 XFREE(buf);
87 return err;
8488 #endif
8589 }
8690
8791 #endif
8892
89
9093 /* $Source$ */
9194 /* $Revision$ */
9295 /* $Date$ */
3838 int err;
3939 omac_state omac;
4040 FILE *in;
41 unsigned char buf[512];
41 unsigned char *buf;
4242
4343 LTC_ARGCHK(key != NULL);
4444 LTC_ARGCHK(filename != NULL);
4545 LTC_ARGCHK(out != NULL);
4646 LTC_ARGCHK(outlen != NULL);
4747
48 in = fopen(filename, "rb");
49 if (in == NULL) {
50 return CRYPT_FILE_NOTFOUND;
48 if ((buf = XMALLOC(LTC_FILE_READ_BUFSIZE)) == NULL) {
49 return CRYPT_MEM;
5150 }
5251
5352 if ((err = omac_init(&omac, cipher, key, keylen)) != CRYPT_OK) {
54 fclose(in);
55 return err;
53 goto LBL_ERR;
54 }
55
56 in = fopen(filename, "rb");
57 if (in == NULL) {
58 err = CRYPT_FILE_NOTFOUND;
59 goto LBL_ERR;
5660 }
5761
5862 do {
59 x = fread(buf, 1, sizeof(buf), in);
63 x = fread(buf, 1, LTC_FILE_READ_BUFSIZE, in);
6064 if ((err = omac_process(&omac, buf, (unsigned long)x)) != CRYPT_OK) {
6165 fclose(in);
62 return err;
66 goto LBL_CLEANBUF;
6367 }
64 } while (x == sizeof(buf));
65 fclose(in);
68 } while (x == LTC_FILE_READ_BUFSIZE);
6669
67 if ((err = omac_done(&omac, out, outlen)) != CRYPT_OK) {
68 return err;
70 if (fclose(in) != 0) {
71 err = CRYPT_ERROR;
72 goto LBL_CLEANBUF;
6973 }
7074
75 err = omac_done(&omac, out, outlen);
76
77 LBL_CLEANBUF:
78 zeromem(buf, LTC_FILE_READ_BUFSIZE);
79 LBL_ERR:
7180 #ifdef LTC_CLEAN_STACK
72 zeromem(buf, sizeof(buf));
81 zeromem(&omac, sizeof(omac_state));
7382 #endif
74
75 return CRYPT_OK;
83 XFREE(buf);
84 return err;
7685 #endif
7786 }
7887
3838 int err;
3939 pmac_state pmac;
4040 FILE *in;
41 unsigned char buf[512];
41 unsigned char *buf;
4242
4343
4444 LTC_ARGCHK(key != NULL);
4646 LTC_ARGCHK(out != NULL);
4747 LTC_ARGCHK(outlen != NULL);
4848
49 in = fopen(filename, "rb");
50 if (in == NULL) {
51 return CRYPT_FILE_NOTFOUND;
49 if ((buf = XMALLOC(LTC_FILE_READ_BUFSIZE)) == NULL) {
50 return CRYPT_MEM;
5251 }
5352
5453 if ((err = pmac_init(&pmac, cipher, key, keylen)) != CRYPT_OK) {
55 fclose(in);
56 return err;
54 goto LBL_ERR;
55 }
56
57 in = fopen(filename, "rb");
58 if (in == NULL) {
59 err = CRYPT_FILE_NOTFOUND;
60 goto LBL_ERR;
5761 }
5862
5963 do {
60 x = fread(buf, 1, sizeof(buf), in);
64 x = fread(buf, 1, LTC_FILE_READ_BUFSIZE, in);
6165 if ((err = pmac_process(&pmac, buf, (unsigned long)x)) != CRYPT_OK) {
6266 fclose(in);
63 return err;
67 goto LBL_CLEANBUF;
6468 }
65 } while (x == sizeof(buf));
66 fclose(in);
69 } while (x == LTC_FILE_READ_BUFSIZE);
6770
68 if ((err = pmac_done(&pmac, out, outlen)) != CRYPT_OK) {
69 return err;
71 if (fclose(in) != 0) {
72 err = CRYPT_ERROR;
73 goto LBL_CLEANBUF;
7074 }
7175
76 err = pmac_done(&pmac, out, outlen);
77
78 LBL_CLEANBUF:
79 zeromem(buf, LTC_FILE_READ_BUFSIZE);
80 LBL_ERR:
7281 #ifdef LTC_CLEAN_STACK
73 zeromem(buf, sizeof(buf));
82 zeromem(&pmac, sizeof(pmac_state));
7483 #endif
75
76 return CRYPT_OK;
84 XFREE(buf);
85 return err;
7786 #endif
7887 }
7988
2020 @param fname The name of the file you wish to POLY1305
2121 @param key The secret key
2222 @param keylen The length of the secret key
23 @param out [out] The POLY1305 authentication tag
24 @param outlen [in/out] The max size and resulting size of the authentication tag
23 @param mac [out] The POLY1305 authentication tag
24 @param maclen [in/out] The max size and resulting size of the authentication tag
2525 @return CRYPT_OK if successful, CRYPT_NOP if file support has been disabled
2626 */
2727 int poly1305_file(const char *fname, const unsigned char *key, unsigned long keylen, unsigned char *mac, unsigned long *maclen)
4040 LTC_ARGCHK(mac != NULL);
4141 LTC_ARGCHK(maclen != NULL);
4242
43 if ((in = fopen(fname, "rb")) == NULL) { return CRYPT_FILE_NOTFOUND; }
44 if ((buf = XMALLOC(LTC_FILE_READ_BUFSIZE)) == NULL) { return CRYPT_MEM; }
45 if ((err = poly1305_init(&st, key, keylen)) != CRYPT_OK) { goto LBL_ERR; }
43 if ((buf = XMALLOC(LTC_FILE_READ_BUFSIZE)) == NULL) {
44 return CRYPT_MEM;
45 }
46
47 if ((err = poly1305_init(&st, key, keylen)) != CRYPT_OK) {
48 goto LBL_ERR;
49 }
50
51 in = fopen(fname, "rb");
52 if (in == NULL) {
53 err = CRYPT_FILE_NOTFOUND;
54 goto LBL_ERR;
55 }
4656
4757 do {
4858 x = fread(buf, 1, LTC_FILE_READ_BUFSIZE, in);
4959 if ((err = poly1305_process(&st, buf, (unsigned long)x)) != CRYPT_OK) {
5060 fclose(in);
51 goto LBL_ERR;
61 goto LBL_CLEANBUF;
5262 }
5363 } while (x == LTC_FILE_READ_BUFSIZE);
54 if (fclose(in) != 0) {
64
65 if (fclose(in) != 0) {
5566 err = CRYPT_ERROR;
56 goto LBL_ERR;
67 goto LBL_CLEANBUF;
5768 }
69
5870 err = poly1305_done(&st, mac, maclen);
5971
72 LBL_CLEANBUF:
73 zeromem(buf, LTC_FILE_READ_BUFSIZE);
6074 LBL_ERR:
6175 #ifdef LTC_CLEAN_STACK
6276 zeromem(&st, sizeof(poly1305_state));
6478 XFREE(buf);
6579 return err;
6680 #endif
67 };
81 }
6882
6983 #endif
4343 zeromem(&st, sizeof(poly1305_state));
4444 #endif
4545 return err;
46 };
46 }
4747
4848 #endif
5757 #endif
5858 va_end(args);
5959 return err;
60 };
60 }
6161
6262 #endif
3838 int err;
3939 xcbc_state xcbc;
4040 FILE *in;
41 unsigned char buf[512];
41 unsigned char *buf;
4242
4343 LTC_ARGCHK(key != NULL);
4444 LTC_ARGCHK(filename != NULL);
4545 LTC_ARGCHK(out != NULL);
4646 LTC_ARGCHK(outlen != NULL);
4747
48 in = fopen(filename, "rb");
49 if (in == NULL) {
50 return CRYPT_FILE_NOTFOUND;
48 if ((buf = XMALLOC(LTC_FILE_READ_BUFSIZE)) == NULL) {
49 return CRYPT_MEM;
5150 }
5251
5352 if ((err = xcbc_init(&xcbc, cipher, key, keylen)) != CRYPT_OK) {
54 fclose(in);
55 return err;
53 goto LBL_ERR;
54 }
55
56 in = fopen(filename, "rb");
57 if (in == NULL) {
58 err = CRYPT_FILE_NOTFOUND;
59 goto LBL_ERR;
5660 }
5761
5862 do {
59 x = fread(buf, 1, sizeof(buf), in);
63 x = fread(buf, 1, LTC_FILE_READ_BUFSIZE, in);
6064 if ((err = xcbc_process(&xcbc, buf, (unsigned long)x)) != CRYPT_OK) {
6165 fclose(in);
62 return err;
66 goto LBL_CLEANBUF;
6367 }
64 } while (x == sizeof(buf));
65 fclose(in);
68 } while (x == LTC_FILE_READ_BUFSIZE);
6669
67 if ((err = xcbc_done(&xcbc, out, outlen)) != CRYPT_OK) {
68 return err;
70 if (fclose(in) != 0) {
71 err = CRYPT_ERROR;
72 goto LBL_CLEANBUF;
6973 }
7074
75 err = xcbc_done(&xcbc, out, outlen);
76
77 LBL_CLEANBUF:
78 zeromem(buf, LTC_FILE_READ_BUFSIZE);
79 LBL_ERR:
7180 #ifdef LTC_CLEAN_STACK
72 zeromem(buf, sizeof(buf));
81 zeromem(&xcbc, sizeof(xcbc_state));
7382 #endif
74
75 return CRYPT_OK;
83 XFREE(buf);
84 return err;
7685 #endif
7786 }
7887
123123 #if defined(LTC_CAMELLIA)
124124 " Camellia\n"
125125 #endif
126 "Stream ciphers built-in:\n"
126127 #if defined(LTC_CHACHA)
127128 " ChaCha\n"
129 #endif
130 #if defined(LTC_RC4_STREAM)
131 " RC4\n"
132 #endif
133 #if defined(LTC_SOBER128_STREAM)
134 " SOBER128\n"
128135 #endif
129136
130137 "\nHashes built-in:\n"
178185 #endif
179186 #if defined(LTC_WHIRLPOOL)
180187 " WHIRLPOOL\n"
188 #endif
189 #if defined(LTC_BLAKE2S)
190 " BLAKE2S\n"
191 #endif
192 #if defined(LTC_BLAKE2B)
193 " BLAKE2B\n"
181194 #endif
182195 #if defined(LTC_CHC_HASH)
183196 " CHC_HASH\n"
234247 #endif
235248 #if defined(LTC_POLY1305)
236249 " POLY1305\n"
250 #endif
251 #if defined(LTC_BLAKE2SMAC)
252 " BLAKE2S MAC\n"
253 #endif
254 #if defined(LTC_BLAKE2BMAC)
255 " BLAKE2B MAC\n"
237256 #endif
238257
239258 "\nENC + AUTH modes:\n"
1717 const struct ltc_prng_descriptor chacha20_prng_desc =
1818 {
1919 "chacha20",
20 sizeof(chacha_state),
20 40,
2121 &chacha20_prng_start,
2222 &chacha20_prng_add_entropy,
2323 &chacha20_prng_ready,
3636 int chacha20_prng_start(prng_state *prng)
3737 {
3838 LTC_ARGCHK(prng != NULL);
39 prng->chacha.ready = 0;
40 XMEMSET(&prng->chacha.ent, 0, 40);
39 prng->ready = 0;
40 XMEMSET(&prng->chacha.ent, 0, sizeof(prng->chacha.ent));
4141 prng->chacha.idx = 0;
42 LTC_MUTEX_INIT(&prng->lock)
4243 return CRYPT_OK;
4344 }
4445
5960 LTC_ARGCHK(in != NULL);
6061 LTC_ARGCHK(inlen > 0);
6162
62 if (prng->chacha.ready) {
63 LTC_MUTEX_LOCK(&prng->lock);
64 if (prng->ready) {
6365 /* chacha20_prng_ready() was already called, do "rekey" operation */
64 if ((err = chacha_keystream(&prng->chacha.s, buf, 40)) != CRYPT_OK) return err;
65 for(i = 0; i < inlen; i++) buf[i % 40] ^= in[i];
66 if ((err = chacha_keystream(&prng->chacha.s, buf, sizeof(buf))) != CRYPT_OK) goto LBL_UNLOCK;
67 for(i = 0; i < inlen; i++) buf[i % sizeof(buf)] ^= in[i];
6668 /* key 32 bytes, 20 rounds */
67 if ((err = chacha_setup(&prng->chacha.s, buf, 32, 20)) != CRYPT_OK) return err;
69 if ((err = chacha_setup(&prng->chacha.s, buf, 32, 20)) != CRYPT_OK) goto LBL_UNLOCK;
6870 /* iv 8 bytes */
69 if ((err = chacha_ivctr64(&prng->chacha.s, buf + 32, 8, 0)) != CRYPT_OK) return err;
71 if ((err = chacha_ivctr64(&prng->chacha.s, buf + 32, 8, 0)) != CRYPT_OK) goto LBL_UNLOCK;
7072 /* clear KEY + IV */
71 XMEMSET(buf, 0, 40);
73 XMEMSET(buf, 0, sizeof(buf));
7274 }
7375 else {
7476 /* chacha20_prng_ready() was not called yet, add entropy to ent buffer */
75 while (inlen--) prng->chacha.ent[prng->chacha.idx++ % 40] ^= *in++;
76 }
77
78 return CRYPT_OK;
77 while (inlen--) prng->chacha.ent[prng->chacha.idx++ % sizeof(prng->chacha.ent)] ^= *in++;
78 }
79 err = CRYPT_OK;
80 LBL_UNLOCK:
81 LTC_MUTEX_UNLOCK(&prng->lock);
82 return err;
7983 }
8084
8185 /**
8892 int err;
8993
9094 LTC_ARGCHK(prng != NULL);
91 if (prng->chacha.ready) return CRYPT_OK;
92
95
96 LTC_MUTEX_LOCK(&prng->lock);
97 if (prng->ready) { err = CRYPT_OK; goto LBL_UNLOCK; }
9398 /* key 32 bytes, 20 rounds */
94 if ((err = chacha_setup(&prng->chacha.s, prng->chacha.ent, 32, 20)) != CRYPT_OK) return err;
99 if ((err = chacha_setup(&prng->chacha.s, prng->chacha.ent, 32, 20)) != CRYPT_OK) goto LBL_UNLOCK;
95100 /* iv 8 bytes */
96 if ((err = chacha_ivctr64(&prng->chacha.s, prng->chacha.ent + 32, 8, 0)) != CRYPT_OK) return err;
97 XMEMSET(&prng->chacha.ent, 0, 40);
98 prng->chacha.ready = 1;
101 if ((err = chacha_ivctr64(&prng->chacha.s, prng->chacha.ent + 32, 8, 0)) != CRYPT_OK) goto LBL_UNLOCK;
102 XMEMSET(&prng->chacha.ent, 0, sizeof(prng->chacha.ent));
99103 prng->chacha.idx = 0;
100 return CRYPT_OK;
104 prng->ready = 1;
105 LBL_UNLOCK:
106 LTC_MUTEX_UNLOCK(&prng->lock);
107 return err;
101108 }
102109
103110 /**
109116 */
110117 unsigned long chacha20_prng_read(unsigned char *out, unsigned long outlen, prng_state *prng)
111118 {
112 LTC_ARGCHK(prng != NULL);
113 if (!prng->chacha.ready) return 0;
114 if (chacha_keystream(&prng->chacha.s, out, outlen) != CRYPT_OK) return 0;
119 if (outlen == 0 || prng == NULL || out == NULL) return 0;
120 LTC_MUTEX_LOCK(&prng->lock);
121 if (!prng->ready) { outlen = 0; goto LBL_UNLOCK; }
122 if (chacha_keystream(&prng->chacha.s, out, outlen) != CRYPT_OK) outlen = 0;
123 LBL_UNLOCK:
124 LTC_MUTEX_UNLOCK(&prng->lock);
115125 return outlen;
116126 }
117127
123133 int chacha20_prng_done(prng_state *prng)
124134 {
125135 int err;
126
127 LTC_ARGCHK(prng != NULL);
128 if ((err = chacha_done(&prng->chacha.s)) != CRYPT_OK) return err;
129 prng->chacha.ready = 0;
130 return CRYPT_OK;
136 LTC_ARGCHK(prng != NULL);
137 LTC_MUTEX_LOCK(&prng->lock);
138 prng->ready = 0;
139 err = chacha_done(&prng->chacha.s);
140 LTC_MUTEX_UNLOCK(&prng->lock);
141 return err;
131142 }
132143
133144 /**
139150 */
140151 int chacha20_prng_export(unsigned char *out, unsigned long *outlen, prng_state *prng)
141152 {
142 unsigned long len = sizeof(chacha_state);
153 unsigned long len = chacha20_prng_desc.export_size;
154
155 LTC_ARGCHK(prng != NULL);
156 LTC_ARGCHK(out != NULL);
143157 LTC_ARGCHK(outlen != NULL);
144 LTC_ARGCHK(out != NULL);
145 LTC_ARGCHK(prng != NULL);
146
147 if (!prng->chacha.ready) {
148 return CRYPT_ERROR;
149 }
158
150159 if (*outlen < len) {
151160 *outlen = len;
152161 return CRYPT_BUFFER_OVERFLOW;
153162 }
154 XMEMCPY(out, &prng->chacha.s, len);
163
164 if (chacha20_prng_read(out, len, prng) != len) {
165 return CRYPT_ERROR_READPRNG;
166 }
167
155168 *outlen = len;
156169 return CRYPT_OK;
157170 }
165178 */
166179 int chacha20_prng_import(const unsigned char *in, unsigned long inlen, prng_state *prng)
167180 {
168 unsigned long len = sizeof(chacha_state);
181 int err;
182
183 LTC_ARGCHK(prng != NULL);
169184 LTC_ARGCHK(in != NULL);
170 LTC_ARGCHK(prng != NULL);
171
172 if (inlen != len) return CRYPT_INVALID_ARG;
173 XMEMCPY(&prng->chacha.s, in, inlen);
174 prng->chacha.ready = 1;
185 if (inlen < (unsigned long)chacha20_prng_desc.export_size) return CRYPT_INVALID_ARG;
186
187 if ((err = chacha20_prng_start(prng)) != CRYPT_OK) return err;
188 if ((err = chacha20_prng_add_entropy(in, inlen, prng)) != CRYPT_OK) return err;
175189 return CRYPT_OK;
176190 }
177191
193207 unsigned char dmp[300];
194208 unsigned long dmplen = sizeof(dmp);
195209 unsigned char out[500];
196 unsigned char t1[] = { 0x59, 0xb2, 0x26, 0x95, 0x2b, 0x01, 0x8f, 0x05, 0xbe, 0xd8 };
197 unsigned char t2[] = { 0x30, 0x34, 0x5c, 0x6e, 0x56, 0x18, 0x8c, 0x46, 0xbe, 0x8a };
198
199 chacha20_prng_start(&st);
200 chacha20_prng_add_entropy(en, sizeof(en), &st); /* add entropy to uninitialized prng */
201 chacha20_prng_ready(&st);
202 chacha20_prng_read(out, 10, &st); /* 10 bytes for testing */
203 if (compare_testvector(out, 10, t1, sizeof(t1), "CHACHA-PRNG", 1) != 0) return CRYPT_FAIL_TESTVECTOR;
204 chacha20_prng_read(out, 500, &st);
205 chacha20_prng_add_entropy(en, sizeof(en), &st); /* add entropy to already initialized prng */
206 chacha20_prng_read(out, 500, &st);
207 chacha20_prng_export(dmp, &dmplen, &st);
208 chacha20_prng_read(out, 500, &st); /* skip 500 bytes */
209 chacha20_prng_read(out, 10, &st); /* 10 bytes for testing */
210 if (compare_testvector(out, 10, t2, sizeof(t2), "CHACHA-PRNG", 2) != 0) return CRYPT_FAIL_TESTVECTOR;
211 chacha20_prng_done(&st);
212
213 XMEMSET(&st, 0xFF, sizeof(st)); /* just to be sure */
214 chacha20_prng_import(dmp, dmplen, &st);
215 chacha20_prng_read(out, 500, &st); /* skip 500 bytes */
216 chacha20_prng_read(out, 10, &st); /* 10 bytes for testing */
217 if (compare_testvector(out, 10, t2, sizeof(t2), "CHACHA-PRNG", 3) != 0) return CRYPT_FAIL_TESTVECTOR;
218 chacha20_prng_done(&st);
210 unsigned char t1[] = { 0x59, 0xB2, 0x26, 0x95, 0x2B, 0x01, 0x8F, 0x05, 0xBE, 0xD8 };
211 unsigned char t2[] = { 0x47, 0xC9, 0x0D, 0x03, 0xE4, 0x75, 0x34, 0x27, 0xBD, 0xDE };
212 unsigned char t3[] = { 0xBC, 0xFA, 0xEF, 0x59, 0x37, 0x7F, 0x1A, 0x91, 0x1A, 0xA6 };
213 int err;
214
215 if ((err = chacha20_prng_start(&st)) != CRYPT_OK) return err;
216 /* add entropy to uninitialized prng */
217 if ((err = chacha20_prng_add_entropy(en, sizeof(en), &st)) != CRYPT_OK) return err;
218 if ((err = chacha20_prng_ready(&st)) != CRYPT_OK) return err;
219 if (chacha20_prng_read(out, 10, &st) != 10) return CRYPT_ERROR_READPRNG; /* 10 bytes for testing */
220 if (compare_testvector(out, 10, t1, sizeof(t1), "CHACHA-PRNG", 1)) return CRYPT_FAIL_TESTVECTOR;
221 if (chacha20_prng_read(out, 500, &st) != 500) return CRYPT_ERROR_READPRNG; /* skip 500 bytes */
222 /* add entropy to already initialized prng */
223 if ((err = chacha20_prng_add_entropy(en, sizeof(en), &st)) != CRYPT_OK) return err;
224 if (chacha20_prng_read(out, 500, &st) != 500) return CRYPT_ERROR_READPRNG; /* skip 500 bytes */
225 if ((err = chacha20_prng_export(dmp, &dmplen, &st)) != CRYPT_OK) return err;
226 if (chacha20_prng_read(out, 500, &st) != 500) return CRYPT_ERROR_READPRNG; /* skip 500 bytes */
227 if (chacha20_prng_read(out, 10, &st) != 10) return CRYPT_ERROR_READPRNG; /* 10 bytes for testing */
228 if (compare_testvector(out, 10, t2, sizeof(t2), "CHACHA-PRNG", 2)) return CRYPT_FAIL_TESTVECTOR;
229 if ((err = chacha20_prng_done(&st)) != CRYPT_OK) return err;
230 if ((err = chacha20_prng_import(dmp, dmplen, &st)) != CRYPT_OK) return err;
231 if ((err = chacha20_prng_ready(&st)) != CRYPT_OK) return err;
232 if (chacha20_prng_read(out, 500, &st) != 500) return CRYPT_ERROR_READPRNG; /* skip 500 bytes */
233 if (chacha20_prng_read(out, 10, &st) != 10) return CRYPT_ERROR_READPRNG; /* 10 bytes for testing */
234 if (compare_testvector(out, 10, t3, sizeof(t3), "CHACHA-PRNG", 3)) return CRYPT_FAIL_TESTVECTOR;
235 if ((err = chacha20_prng_done(&st)) != CRYPT_OK) return err;
219236
220237 return CRYPT_OK;
221238 #endif
44 *
55 * The library is free for all purposes without any express
66 * guarantee it works.
7 *
8 * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
97 */
108 #include "tomcrypt.h"
119
3735 #endif
3836
3937 const struct ltc_prng_descriptor fortuna_desc = {
40 "fortuna", 1024,
38 "fortuna",
39 (32 * LTC_FORTUNA_POOLS), /* default: 1024 */
4140 &fortuna_start,
4241 &fortuna_add_entropy,
4342 &fortuna_ready,
132131 unsigned char tmp[MAXBLOCKSIZE];
133132
134133 LTC_ARGCHK(prng != NULL);
134 prng->ready = 0;
135135
136136 /* initialize the pools */
137137 for (x = 0; x < LTC_FORTUNA_POOLS; x++) {
155155 }
156156 zeromem(prng->fortuna.IV, 16);
157157
158 LTC_MUTEX_INIT(&prng->fortuna.prng_lock)
158 LTC_MUTEX_INIT(&prng->lock)
159159
160160 return CRYPT_OK;
161161 }
172172 unsigned char tmp[2];
173173 int err;
174174
175 LTC_ARGCHK(in != NULL);
176175 LTC_ARGCHK(prng != NULL);
177
178 LTC_MUTEX_LOCK(&prng->fortuna.prng_lock);
176 LTC_ARGCHK(in != NULL);
177 LTC_ARGCHK(inlen > 0);
179178
180179 /* ensure inlen <= 32 */
181180 if (inlen > 32) {
182 LTC_MUTEX_UNLOCK(&prng->fortuna.prng_lock);
183 return CRYPT_INVALID_ARG;
181 inlen = 32;
184182 }
185183
186184 /* add s || length(in) || in to pool[pool_idx] */
187185 tmp[0] = 0;
188186 tmp[1] = (unsigned char)inlen;
187
188 LTC_MUTEX_LOCK(&prng->lock);
189189 if ((err = sha256_process(&prng->fortuna.pool[prng->fortuna.pool_idx], tmp, 2)) != CRYPT_OK) {
190 LTC_MUTEX_UNLOCK(&prng->fortuna.prng_lock);
191 return err;
190 goto LBL_UNLOCK;
192191 }
193192 if ((err = sha256_process(&prng->fortuna.pool[prng->fortuna.pool_idx], in, inlen)) != CRYPT_OK) {
194 LTC_MUTEX_UNLOCK(&prng->fortuna.prng_lock);
195 return err;
193 goto LBL_UNLOCK;
196194 }
197195 if (prng->fortuna.pool_idx == 0) {
198196 prng->fortuna.pool0_len += inlen;
200198 if (++(prng->fortuna.pool_idx) == LTC_FORTUNA_POOLS) {
201199 prng->fortuna.pool_idx = 0;
202200 }
203
204 LTC_MUTEX_UNLOCK(&prng->fortuna.prng_lock);
205 return CRYPT_OK;
201 err = CRYPT_OK; /* success */
202
203 LBL_UNLOCK:
204 LTC_MUTEX_UNLOCK(&prng->lock);
205 return err;
206206 }
207207
208208 /**
212212 */
213213 int fortuna_ready(prng_state *prng)
214214 {
215 return fortuna_reseed(prng);
215 int err;
216 LTC_ARGCHK(prng != NULL);
217
218 LTC_MUTEX_LOCK(&prng->lock);
219 err = fortuna_reseed(prng);
220 prng->ready = (err == CRYPT_OK) ? 1 : 0;
221
222 LTC_MUTEX_UNLOCK(&prng->lock);
223 return err;
216224 }
217225
218226 /**
225233 unsigned long fortuna_read(unsigned char *out, unsigned long outlen, prng_state *prng)
226234 {
227235 unsigned char tmp[16];
228 unsigned long tlen;
229
230 LTC_ARGCHK(out != NULL);
231 LTC_ARGCHK(prng != NULL);
232
233 LTC_MUTEX_LOCK(&prng->fortuna.prng_lock);
236 unsigned long tlen = 0;
237
238 if (outlen == 0 || prng == NULL || out == NULL) return 0;
239
240 LTC_MUTEX_LOCK(&prng->lock);
241
242 if (!prng->ready) {
243 goto LBL_UNLOCK;
244 }
234245
235246 /* do we have to reseed? */
236247 if (++prng->fortuna.wd == LTC_FORTUNA_WD || prng->fortuna.pool0_len >= 64) {
237248 if (fortuna_reseed(prng) != CRYPT_OK) {
238 LTC_MUTEX_UNLOCK(&prng->fortuna.prng_lock);
239 return 0;
249 goto LBL_UNLOCK;
240250 }
241251 }
242252
267277 fortuna_update_iv(prng);
268278
269279 if (rijndael_setup(prng->fortuna.K, 32, 0, &prng->fortuna.skey) != CRYPT_OK) {
270 LTC_MUTEX_UNLOCK(&prng->fortuna.prng_lock);
271 return 0;
272 }
273
280 tlen = 0;
281 }
282
283 LBL_UNLOCK:
274284 #ifdef LTC_CLEAN_STACK
275285 zeromem(tmp, sizeof(tmp));
276286 #endif
277 LTC_MUTEX_UNLOCK(&prng->fortuna.prng_lock);
287 LTC_MUTEX_UNLOCK(&prng->lock);
278288 return tlen;
279289 }
280290
289299 unsigned char tmp[32];
290300
291301 LTC_ARGCHK(prng != NULL);
292 LTC_MUTEX_LOCK(&prng->fortuna.prng_lock);
302
303 LTC_MUTEX_LOCK(&prng->lock);
304 prng->ready = 0;
293305
294306 /* terminate all the hashes */
295307 for (x = 0; x < LTC_FORTUNA_POOLS; x++) {
296308 if ((err = sha256_done(&(prng->fortuna.pool[x]), tmp)) != CRYPT_OK) {
297 LTC_MUTEX_UNLOCK(&prng->fortuna.prng_lock);
298 return err;
309 goto LBL_UNLOCK;
299310 }
300311 }
301312 /* call cipher done when we invent one ;-) */
302
313 err = CRYPT_OK; /* success */
314
315 LBL_UNLOCK:
303316 #ifdef LTC_CLEAN_STACK
304317 zeromem(tmp, sizeof(tmp));
305318 #endif
306
307 LTC_MUTEX_UNLOCK(&prng->fortuna.prng_lock);
308 return CRYPT_OK;
319 LTC_MUTEX_UNLOCK(&prng->lock);
320 return err;
309321 }
310322
311323 /**
319331 {
320332 int x, err;
321333 hash_state *md;
334 unsigned long len = fortuna_desc.export_size;
322335
323336 LTC_ARGCHK(out != NULL);
324337 LTC_ARGCHK(outlen != NULL);
325338 LTC_ARGCHK(prng != NULL);
326339
327 LTC_MUTEX_LOCK(&prng->fortuna.prng_lock);
340 LTC_MUTEX_LOCK(&prng->lock);
341
342 if (!prng->ready) {
343 err = CRYPT_ERROR;
344 goto LBL_UNLOCK;
345 }
328346
329347 /* we'll write bytes for s&g's */
330 if (*outlen < 32*LTC_FORTUNA_POOLS) {
331 LTC_MUTEX_UNLOCK(&prng->fortuna.prng_lock);
332 *outlen = 32*LTC_FORTUNA_POOLS;
333 return CRYPT_BUFFER_OVERFLOW;
348 if (*outlen < len) {
349 *outlen = len;
350 err = CRYPT_BUFFER_OVERFLOW;
351 goto LBL_UNLOCK;
334352 }
335353
336354 md = XMALLOC(sizeof(hash_state));
337355 if (md == NULL) {
338 LTC_MUTEX_UNLOCK(&prng->fortuna.prng_lock);
339 return CRYPT_MEM;
356 err = CRYPT_MEM;
357 goto LBL_UNLOCK;
340358 }
341359
342360 /* to emit the state we copy each pool, terminate it then hash it again so
362380 goto LBL_ERR;
363381 }
364382 }
365 *outlen = 32*LTC_FORTUNA_POOLS;
383 *outlen = len;
366384 err = CRYPT_OK;
367385
368386 LBL_ERR:
370388 zeromem(md, sizeof(*md));
371389 #endif
372390 XFREE(md);
373 LTC_MUTEX_UNLOCK(&prng->fortuna.prng_lock);
391 LBL_UNLOCK:
392 LTC_MUTEX_UNLOCK(&prng->lock);
374393 return err;
375394 }
376395
388407 LTC_ARGCHK(in != NULL);
389408 LTC_ARGCHK(prng != NULL);
390409
391 if (inlen != 32*LTC_FORTUNA_POOLS) {
410 if (inlen < (unsigned long)fortuna_desc.export_size) {
392411 return CRYPT_INVALID_ARG;
393412 }
394413
400419 return err;
401420 }
402421 }
403 return err;
422 return CRYPT_OK;
404423 }
405424
406425 /**
44 *
55 * The library is free for all purposes without any express
66 * guarantee it works.
7 *
8 * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
97 */
108 #include "tomcrypt.h"
119
1210 /**
1311 @file rc4.c
14 LTC_RC4 PRNG, Tom St Denis
12 RC4 PRNG, Tom St Denis
1513 */
1614
1715 #ifdef LTC_RC4
1816
19 const struct ltc_prng_descriptor rc4_prng_desc =
17 const struct ltc_prng_descriptor rc4_desc =
2018 {
2119 "rc4",
22 sizeof(rc4_state),
23 &rc4_prng_start,
24 &rc4_prng_add_entropy,
25 &rc4_prng_ready,
26 &rc4_prng_read,
27 &rc4_prng_done,
28 &rc4_prng_export,
29 &rc4_prng_import,
30 &rc4_prng_test
20 32,
21 &rc4_start,
22 &rc4_add_entropy,
23 &rc4_ready,
24 &rc4_read,
25 &rc4_done,
26 &rc4_export,
27 &rc4_import,
28 &rc4_test
3129 };
3230
3331 /**
3533 @param prng [out] The PRNG state to initialize
3634 @return CRYPT_OK if successful
3735 */
38 int rc4_prng_start(prng_state *prng)
39 {
40 LTC_ARGCHK(prng != NULL);
41 prng->rc4.ready = 0;
42
36 int rc4_start(prng_state *prng)
37 {
38 LTC_ARGCHK(prng != NULL);
39 prng->ready = 0;
4340 /* set entropy (key) size to zero */
4441 prng->rc4.s.x = 0;
4542 /* clear entropy (key) buffer */
46 XMEMSET(&prng->rc4.s.buf, 0, 256);
47
43 XMEMSET(&prng->rc4.s.buf, 0, sizeof(prng->rc4.s.buf));
44 LTC_MUTEX_INIT(&prng->lock)
4845 return CRYPT_OK;
4946 }
5047
5552 @param prng PRNG state to update
5653 @return CRYPT_OK if successful
5754 */
58 int rc4_prng_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng)
55 int rc4_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng)
5956 {
6057 unsigned char buf[256];
6158 unsigned long i;
6562 LTC_ARGCHK(in != NULL);
6663 LTC_ARGCHK(inlen > 0);
6764
68 if (prng->rc4.ready) {
69 /* rc4_prng_ready() was already called, do "rekey" operation */
70 if ((err = rc4_keystream(&prng->rc4.s, buf, 256)) != CRYPT_OK) return err;
71 for(i = 0; i < inlen; i++) buf[i % 256] ^= in[i];
65 LTC_MUTEX_LOCK(&prng->lock);
66 if (prng->ready) {
67 /* rc4_ready() was already called, do "rekey" operation */
68 if ((err = rc4_stream_keystream(&prng->rc4.s, buf, sizeof(buf))) != CRYPT_OK) goto LBL_UNLOCK;
69 for(i = 0; i < inlen; i++) buf[i % sizeof(buf)] ^= in[i];
7270 /* initialize RC4 */
73 if ((err = rc4_setup(&prng->rc4.s, buf, 256)) != CRYPT_OK) return err;
71 if ((err = rc4_stream_setup(&prng->rc4.s, buf, sizeof(buf))) != CRYPT_OK) goto LBL_UNLOCK;
7472 /* drop first 3072 bytes - https://en.wikipedia.org/wiki/RC4#Fluhrer.2C_Mantin_and_Shamir_attack */
75 for (i = 0; i < 12; i++) rc4_keystream(&prng->rc4.s, buf, 256);
73 for (i = 0; i < 12; i++) rc4_stream_keystream(&prng->rc4.s, buf, sizeof(buf));
7674 }
7775 else {
78 /* rc4_prng_ready() was not called yet, add entropy to the buffer */
79 while (inlen--) prng->rc4.s.buf[prng->rc4.s.x++ % 256] ^= *in++;
80 }
81
82 return CRYPT_OK;
76 /* rc4_ready() was not called yet, add entropy to the buffer */
77 while (inlen--) prng->rc4.s.buf[prng->rc4.s.x++ % sizeof(prng->rc4.s.buf)] ^= *in++;
78 }
79 err = CRYPT_OK;
80 LBL_UNLOCK:
81 LTC_MUTEX_UNLOCK(&prng->lock);
82 return err;
8383 }
8484
8585 /**
8787 @param prng The PRNG to make active
8888 @return CRYPT_OK if successful
8989 */
90 int rc4_prng_ready(prng_state *prng)
91 {
92 unsigned char buf[256];
90 int rc4_ready(prng_state *prng)
91 {
92 unsigned char buf[256] = { 0 };
9393 unsigned long len;
9494 int err, i;
9595
9696 LTC_ARGCHK(prng != NULL);
97 if (prng->rc4.ready) return CRYPT_OK;
98
99 len = MIN(prng->rc4.s.x, 256);
100 if (len < 5) return CRYPT_ERROR;
101
102 XMEMCPY(buf, prng->rc4.s.buf, len);
97
98 LTC_MUTEX_LOCK(&prng->lock);
99 if (prng->ready) { err = CRYPT_OK; goto LBL_UNLOCK; }
100 XMEMCPY(buf, prng->rc4.s.buf, sizeof(buf));
103101 /* initialize RC4 */
104 if ((err = rc4_setup(&prng->rc4.s, buf, len)) != CRYPT_OK) return err;
102 len = MIN(prng->rc4.s.x, 256); /* TODO: we can perhaps always use all 256 bytes */
103 if ((err = rc4_stream_setup(&prng->rc4.s, buf, len)) != CRYPT_OK) goto LBL_UNLOCK;
105104 /* drop first 3072 bytes - https://en.wikipedia.org/wiki/RC4#Fluhrer.2C_Mantin_and_Shamir_attack */
106 for (i = 0; i < 12; i++) rc4_keystream(&prng->rc4.s, buf, 256);
107 prng->rc4.ready = 1;
108 return CRYPT_OK;
105 for (i = 0; i < 12; i++) rc4_stream_keystream(&prng->rc4.s, buf, sizeof(buf));
106 prng->ready = 1;
107 LBL_UNLOCK:
108 LTC_MUTEX_UNLOCK(&prng->lock);
109 return err;
109110 }
110111
111112 /**
115116 @param prng The active PRNG to read from
116117 @return Number of octets read
117118 */
118 unsigned long rc4_prng_read(unsigned char *out, unsigned long outlen, prng_state *prng)
119 {
120 LTC_ARGCHK(prng != NULL);
121 if (!prng->rc4.ready) return 0;
122 if (rc4_keystream(&prng->rc4.s, out, outlen) != CRYPT_OK) return 0;
119 unsigned long rc4_read(unsigned char *out, unsigned long outlen, prng_state *prng)
120 {
121 if (outlen == 0 || prng == NULL || out == NULL) return 0;
122 LTC_MUTEX_LOCK(&prng->lock);
123 if (!prng->ready) { outlen = 0; goto LBL_UNLOCK; }
124 if (rc4_stream_keystream(&prng->rc4.s, out, outlen) != CRYPT_OK) outlen = 0;
125 LBL_UNLOCK:
126 LTC_MUTEX_UNLOCK(&prng->lock);
123127 return outlen;
124128 }
125129
128132 @param prng The PRNG to terminate
129133 @return CRYPT_OK if successful
130134 */
131 int rc4_prng_done(prng_state *prng)
132 {
133 int err;
134
135 LTC_ARGCHK(prng != NULL);
136 if ((err = rc4_done(&prng->rc4.s)) != CRYPT_OK) return err;
137 prng->rc4.ready = 0;
138 return CRYPT_OK;
135 int rc4_done(prng_state *prng)
136 {
137 int err;
138 LTC_ARGCHK(prng != NULL);
139 LTC_MUTEX_LOCK(&prng->lock);
140 prng->ready = 0;
141 err = rc4_stream_done(&prng->rc4.s);
142 LTC_MUTEX_UNLOCK(&prng->lock);
143 return err;
139144 }
140145
141146 /**
145150 @param prng The PRNG to export
146151 @return CRYPT_OK if successful
147152 */
148 int rc4_prng_export(unsigned char *out, unsigned long *outlen, prng_state *prng)
149 {
150 unsigned long len = sizeof(rc4_state);
151
153 int rc4_export(unsigned char *out, unsigned long *outlen, prng_state *prng)
154 {
155 unsigned long len = rc4_desc.export_size;
156
157 LTC_ARGCHK(prng != NULL);
158 LTC_ARGCHK(out != NULL);
152159 LTC_ARGCHK(outlen != NULL);
153 LTC_ARGCHK(out != NULL);
154 LTC_ARGCHK(prng != NULL);
155
156 if (!prng->rc4.ready) return CRYPT_ERROR;
157160
158161 if (*outlen < len) {
159162 *outlen = len;
160163 return CRYPT_BUFFER_OVERFLOW;
161164 }
162 XMEMCPY(out, &prng->rc4.s, len);
165
166 if (rc4_read(out, len, prng) != len) {
167 return CRYPT_ERROR_READPRNG;
168 }
169
163170 *outlen = len;
164171 return CRYPT_OK;
165172 }
171178 @param prng The PRNG to import
172179 @return CRYPT_OK if successful
173180 */
174 int rc4_prng_import(const unsigned char *in, unsigned long inlen, prng_state *prng)
175 {
181 int rc4_import(const unsigned char *in, unsigned long inlen, prng_state *prng)
182 {
183 int err;
184
185 LTC_ARGCHK(prng != NULL);
176186 LTC_ARGCHK(in != NULL);
177 LTC_ARGCHK(prng != NULL);
178
179 if (inlen != sizeof(rc4_state)) return CRYPT_INVALID_ARG;
180
181 XMEMCPY(&prng->rc4.s, in, inlen);
182 prng->rc4.ready = 1;
187 if (inlen < (unsigned long)rc4_desc.export_size) return CRYPT_INVALID_ARG;
188
189 if ((err = rc4_start(prng)) != CRYPT_OK) return err;
190 if ((err = rc4_add_entropy(in, inlen, prng)) != CRYPT_OK) return err;
183191 return CRYPT_OK;
184192 }
185193
187195 PRNG self-test
188196 @return CRYPT_OK if successful, CRYPT_NOP if self-testing has been disabled
189197 */
190 int rc4_prng_test(void)
198 int rc4_test(void)
191199 {
192200 #ifndef LTC_TEST
193201 return CRYPT_NOP;
202210 unsigned long dmplen = sizeof(dmp);
203211 unsigned char out[1000];
204212 unsigned char t1[] = { 0xE0, 0x4D, 0x9A, 0xF6, 0xA8, 0x9D, 0x77, 0x53, 0xAE, 0x09 };
205 unsigned char t2[] = { 0xEC, 0x66, 0x32, 0xAF, 0xD8, 0xBD, 0x4C, 0x42, 0x1F, 0xCB };
206
207 rc4_prng_start(&st);
208 rc4_prng_add_entropy(en, sizeof(en), &st);
209 rc4_prng_ready(&st);
210 rc4_prng_read(out, 10, &st); /* 10 bytes for testing */
211 if (compare_testvector(out, 10, t1, sizeof(t1), "RC4-PRNG", 1) != 0) return CRYPT_FAIL_TESTVECTOR;
212 rc4_prng_read(out, 500, &st);
213 rc4_prng_export(dmp, &dmplen, &st);
214 rc4_prng_read(out, 500, &st); /* skip 500 bytes */
215 rc4_prng_read(out, 10, &st); /* 10 bytes for testing */
216 if (compare_testvector(out, 10, t2, sizeof(t2), "RC4-PRNG", 2) != 0) return CRYPT_FAIL_TESTVECTOR;
217 rc4_prng_done(&st);
218
219 XMEMSET(&st, 0xFF, sizeof(st)); /* just to be sure */
220 rc4_prng_import(dmp, dmplen, &st);
221 rc4_prng_read(out, 500, &st); /* skip 500 bytes */
222 rc4_prng_read(out, 10, &st); /* 10 bytes for testing */
223 if (compare_testvector(out, 10, t2, sizeof(t2), "RC4-PRNG", 3) != 0) return CRYPT_FAIL_TESTVECTOR;
224 rc4_prng_done(&st);
213 unsigned char t2[] = { 0xEF, 0x80, 0xA2, 0xE6, 0x50, 0x91, 0xF3, 0x17, 0x4A, 0x8A };
214 unsigned char t3[] = { 0x4B, 0xD6, 0x5C, 0x67, 0x99, 0x03, 0x56, 0x12, 0x80, 0x48 };
215 int err;
216
217 if ((err = rc4_start(&st)) != CRYPT_OK) return err;
218 /* add entropy to uninitialized prng */
219 if ((err = rc4_add_entropy(en, sizeof(en), &st)) != CRYPT_OK) return err;
220 if ((err = rc4_ready(&st)) != CRYPT_OK) return err;
221 if (rc4_read(out, 10, &st) != 10) return CRYPT_ERROR_READPRNG; /* 10 bytes for testing */
222 if (compare_testvector(out, 10, t1, sizeof(t1), "RC4-PRNG", 1)) return CRYPT_FAIL_TESTVECTOR;
223 if (rc4_read(out, 500, &st) != 500) return CRYPT_ERROR_READPRNG; /* skip 500 bytes */
224 /* add entropy to already initialized prng */
225 if ((err = rc4_add_entropy(en, sizeof(en), &st)) != CRYPT_OK) return err;
226 if (rc4_read(out, 500, &st) != 500) return CRYPT_ERROR_READPRNG; /* skip 500 bytes */
227 if ((err = rc4_export(dmp, &dmplen, &st)) != CRYPT_OK) return err;
228 if (rc4_read(out, 500, &st) != 500) return CRYPT_ERROR_READPRNG; /* skip 500 bytes */
229 if (rc4_read(out, 10, &st) != 10) return CRYPT_ERROR_READPRNG; /* 10 bytes for testing */
230 if (compare_testvector(out, 10, t2, sizeof(t2), "RC4-PRNG", 2)) return CRYPT_FAIL_TESTVECTOR;
231 if ((err = rc4_done(&st)) != CRYPT_OK) return err;
232 if ((err = rc4_import(dmp, dmplen, &st)) != CRYPT_OK) return err;
233 if ((err = rc4_ready(&st)) != CRYPT_OK) return err;
234 if (rc4_read(out, 500, &st) != 500) return CRYPT_ERROR_READPRNG; /* skip 500 bytes */
235 if (rc4_read(out, 10, &st) != 10) return CRYPT_ERROR_READPRNG; /* 10 bytes for testing */
236 if (compare_testvector(out, 10, t3, sizeof(t3), "RC4-PRNG", 3)) return CRYPT_FAIL_TESTVECTOR;
237 if ((err = rc4_done(&st)) != CRYPT_OK) return err;
225238
226239 return CRYPT_OK;
227240 #endif
44 *
55 * The library is free for all purposes without any express
66 * guarantee it works.
7 *
8 * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
97 */
108 #include "tomcrypt.h"
119
44 *
55 * The library is free for all purposes without any express
66 * guarantee it works.
7 *
8 * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
97 */
108 #include "tomcrypt.h"
119
1616
1717 #ifdef LTC_SOBER128
1818
19 const struct ltc_prng_descriptor sober128_prng_desc =
19 const struct ltc_prng_descriptor sober128_desc =
2020 {
2121 "sober128",
22 sizeof(sober128_state),
23 &sober128_prng_start,
24 &sober128_prng_add_entropy,
25 &sober128_prng_ready,
26 &sober128_prng_read,
27 &sober128_prng_done,
28 &sober128_prng_export,
29 &sober128_prng_import,
30 &sober128_prng_test
22 40,
23 &sober128_start,
24 &sober128_add_entropy,
25 &sober128_ready,
26 &sober128_read,
27 &sober128_done,
28 &sober128_export,
29 &sober128_import,
30 &sober128_test
3131 };
3232
3333 /**
3535 @param prng [out] The PRNG state to initialize
3636 @return CRYPT_OK if successful
3737 */
38 int sober128_prng_start(prng_state *prng)
39 {
40 LTC_ARGCHK(prng != NULL);
41 prng->sober128.ready = 0;
42 XMEMSET(&prng->sober128.ent, 0, 40);
38 int sober128_start(prng_state *prng)
39 {
40 LTC_ARGCHK(prng != NULL);
41 prng->ready = 0;
42 XMEMSET(&prng->sober128.ent, 0, sizeof(prng->sober128.ent));
4343 prng->sober128.idx = 0;
44 LTC_MUTEX_INIT(&prng->lock)
4445 return CRYPT_OK;
4546 }
4647
5152 @param prng PRNG state to update
5253 @return CRYPT_OK if successful
5354 */
54 int sober128_prng_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng)
55 int sober128_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng)
5556 {
5657 unsigned char buf[40];
5758 unsigned long i;
6162 LTC_ARGCHK(in != NULL);
6263 LTC_ARGCHK(inlen > 0);
6364
64 if (prng->sober128.ready) {
65 /* sober128_prng_ready() was already called, do "rekey" operation */
66 if ((err = sober128_keystream(&prng->sober128.s, buf, 40)) != CRYPT_OK) return err;
67 for(i = 0; i < inlen; i++) buf[i % 40] ^= in[i];
65 LTC_MUTEX_LOCK(&prng->lock);
66 if (prng->ready) {
67 /* sober128_ready() was already called, do "rekey" operation */
68 if ((err = sober128_stream_keystream(&prng->sober128.s, buf, sizeof(buf))) != CRYPT_OK) goto LBL_UNLOCK;
69 for(i = 0; i < inlen; i++) buf[i % sizeof(buf)] ^= in[i];
6870 /* key 32 bytes, 20 rounds */
69 if ((err = sober128_setup(&prng->sober128.s, buf, 32)) != CRYPT_OK) return err;
71 if ((err = sober128_stream_setup(&prng->sober128.s, buf, 32)) != CRYPT_OK) goto LBL_UNLOCK;
7072 /* iv 8 bytes */
71 if ((err = sober128_setiv(&prng->sober128.s, buf + 32, 8)) != CRYPT_OK) return err;
73 if ((err = sober128_stream_setiv(&prng->sober128.s, buf + 32, 8)) != CRYPT_OK) goto LBL_UNLOCK;
7274 /* clear KEY + IV */
73 XMEMSET(buf, 0, 40);
75 XMEMSET(buf, 0, sizeof(buf));
7476 }
7577 else {
76 /* sober128_prng_ready() was not called yet, add entropy to ent buffer */
77 while (inlen--) prng->sober128.ent[prng->sober128.idx++ % 40] ^= *in++;
78 }
79
80 return CRYPT_OK;
78 /* sober128_ready() was not called yet, add entropy to ent buffer */
79 while (inlen--) prng->sober128.ent[prng->sober128.idx++ % sizeof(prng->sober128.ent)] ^= *in++;
80 }
81 err = CRYPT_OK;
82 LBL_UNLOCK:
83 LTC_MUTEX_UNLOCK(&prng->lock);
84 return err;
8185 }
8286
8387 /**
8589 @param prng The PRNG to make active
8690 @return CRYPT_OK if successful
8791 */
88 int sober128_prng_ready(prng_state *prng)
89 {
90 int err;
91
92 LTC_ARGCHK(prng != NULL);
93 if (prng->sober128.ready) return CRYPT_OK;
94
92 int sober128_ready(prng_state *prng)
93 {
94 int err;
95
96 LTC_ARGCHK(prng != NULL);
97
98 LTC_MUTEX_LOCK(&prng->lock);
99 if (prng->ready) { err = CRYPT_OK; goto LBL_UNLOCK; }
95100 /* key 32 bytes, 20 rounds */
96 if ((err = sober128_setup(&prng->sober128.s, prng->sober128.ent, 32)) != CRYPT_OK) return err;
101 if ((err = sober128_stream_setup(&prng->sober128.s, prng->sober128.ent, 32)) != CRYPT_OK) goto LBL_UNLOCK;
97102 /* iv 8 bytes */
98 if ((err = sober128_setiv(&prng->sober128.s, prng->sober128.ent + 32, 8)) != CRYPT_OK) return err;
99 XMEMSET(&prng->sober128.ent, 0, 40);
100 prng->sober128.ready = 1;
103 if ((err = sober128_stream_setiv(&prng->sober128.s, prng->sober128.ent + 32, 8)) != CRYPT_OK) goto LBL_UNLOCK;
104 XMEMSET(&prng->sober128.ent, 0, sizeof(prng->sober128.ent));
101105 prng->sober128.idx = 0;
102 return CRYPT_OK;
106 prng->ready = 1;
107 LBL_UNLOCK:
108 LTC_MUTEX_UNLOCK(&prng->lock);
109 return err;
103110 }
104111
105112 /**
109116 @param prng The active PRNG to read from
110117 @return Number of octets read
111118 */
112 unsigned long sober128_prng_read(unsigned char *out, unsigned long outlen, prng_state *prng)
113 {
114 LTC_ARGCHK(prng != NULL);
115 if (!prng->sober128.ready) return 0;
116 if (sober128_keystream(&prng->sober128.s, out, outlen) != CRYPT_OK) return 0;
119 unsigned long sober128_read(unsigned char *out, unsigned long outlen, prng_state *prng)
120 {
121 if (outlen == 0 || prng == NULL || out == NULL) return 0;
122 LTC_MUTEX_LOCK(&prng->lock);
123 if (!prng->ready) { outlen = 0; goto LBL_UNLOCK; }
124 if (sober128_stream_keystream(&prng->sober128.s, out, outlen) != CRYPT_OK) outlen = 0;
125 LBL_UNLOCK:
126 LTC_MUTEX_UNLOCK(&prng->lock);
117127 return outlen;
118128 }
119129
122132 @param prng The PRNG to terminate
123133 @return CRYPT_OK if successful
124134 */
125 int sober128_prng_done(prng_state *prng)
126 {
127 int err;
128
129 LTC_ARGCHK(prng != NULL);
130 if ((err = sober128_done(&prng->sober128.s)) != CRYPT_OK) return err;
131 prng->sober128.ready = 0;
132 return CRYPT_OK;
135 int sober128_done(prng_state *prng)
136 {
137 int err;
138 LTC_ARGCHK(prng != NULL);
139 LTC_MUTEX_LOCK(&prng->lock);
140 prng->ready = 0;
141 err = sober128_stream_done(&prng->sober128.s);
142 LTC_MUTEX_UNLOCK(&prng->lock);
143 return err;
133144 }
134145
135146 /**
139150 @param prng The PRNG to export
140151 @return CRYPT_OK if successful
141152 */
142 int sober128_prng_export(unsigned char *out, unsigned long *outlen, prng_state *prng)
143 {
144 unsigned long len = sizeof(sober128_state);
153 int sober128_export(unsigned char *out, unsigned long *outlen, prng_state *prng)
154 {
155 unsigned long len = sober128_desc.export_size;
156
157 LTC_ARGCHK(prng != NULL);
158 LTC_ARGCHK(out != NULL);
145159 LTC_ARGCHK(outlen != NULL);
146 LTC_ARGCHK(out != NULL);
147 LTC_ARGCHK(prng != NULL);
148
149 if (!prng->sober128.ready) {
150 return CRYPT_ERROR;
151 }
160
152161 if (*outlen < len) {
153162 *outlen = len;
154163 return CRYPT_BUFFER_OVERFLOW;
155164 }
156 XMEMCPY(out, &prng->sober128.s, len);
165
166 if (sober128_read(out, len, prng) != len) {
167 return CRYPT_ERROR_READPRNG;
168 }
169
157170 *outlen = len;
158171 return CRYPT_OK;
159172 }
165178 @param prng The PRNG to import
166179 @return CRYPT_OK if successful
167180 */
168 int sober128_prng_import(const unsigned char *in, unsigned long inlen, prng_state *prng)
169 {
170 unsigned long len = sizeof(sober128_state);
181 int sober128_import(const unsigned char *in, unsigned long inlen, prng_state *prng)
182 {
183 int err;
184
185 LTC_ARGCHK(prng != NULL);
171186 LTC_ARGCHK(in != NULL);
172 LTC_ARGCHK(prng != NULL);
173
174 if (inlen != len) return CRYPT_INVALID_ARG;
175 XMEMCPY(&prng->sober128.s, in, inlen);
176 prng->sober128.ready = 1;
187 if (inlen < (unsigned long)sober128_desc.export_size) return CRYPT_INVALID_ARG;
188
189 if ((err = sober128_start(prng)) != CRYPT_OK) return err;
190 if ((err = sober128_add_entropy(in, sober128_desc.export_size, prng)) != CRYPT_OK) return err;
177191 return CRYPT_OK;
178192 }
179193
181195 PRNG self-test
182196 @return CRYPT_OK if successful, CRYPT_NOP if self-testing has been disabled
183197 */
184 int sober128_prng_test(void)
198 int sober128_test(void)
185199 {
186200 #ifndef LTC_TEST
187201 return CRYPT_NOP;
196210 unsigned long dmplen = sizeof(dmp);
197211 unsigned char out[500];
198212 unsigned char t1[] = { 0x31, 0x82, 0xA7, 0xA5, 0x8B, 0xD7, 0xCB, 0x39, 0x86, 0x1A };
199 unsigned char t2[] = { 0x5C, 0xD6, 0x92, 0x4E, 0xE9, 0x2F, 0xD4, 0x82, 0x16, 0xD4 };
200
201 sober128_prng_start(&st);
202 sober128_prng_add_entropy(en, sizeof(en), &st); /* add entropy to uninitialized prng */
203 sober128_prng_ready(&st);
204 sober128_prng_read(out, 10, &st); /* 10 bytes for testing */
205 if (compare_testvector(out, 10, t1, sizeof(t1), "SOBER128-PRNG", 1) != 0) return CRYPT_FAIL_TESTVECTOR;
206 sober128_prng_read(out, 500, &st);
207 sober128_prng_add_entropy(en, sizeof(en), &st); /* add entropy to already initialized prng */
208 sober128_prng_read(out, 500, &st);
209 sober128_prng_export(dmp, &dmplen, &st);
210 sober128_prng_read(out, 500, &st); /* skip 500 bytes */
211 sober128_prng_read(out, 10, &st); /* 10 bytes for testing */
212 if (compare_testvector(out, 10, t2, sizeof(t2), "SOBER128-PRNG", 2) != 0) return CRYPT_FAIL_TESTVECTOR;
213 sober128_prng_done(&st);
214
215 XMEMSET(&st, 0xFF, sizeof(st)); /* just to be sure */
216 sober128_prng_import(dmp, dmplen, &st);
217 sober128_prng_read(out, 500, &st); /* skip 500 bytes */
218 sober128_prng_read(out, 10, &st); /* 10 bytes for testing */
219 if (compare_testvector(out, 10, t2, sizeof(t2), "SOBER128-PRNG", 3) != 0) return CRYPT_FAIL_TESTVECTOR;
220 sober128_prng_done(&st);
213 unsigned char t2[] = { 0x6B, 0x43, 0x9E, 0xBC, 0xE7, 0x62, 0x9B, 0xE6, 0x9B, 0x83 };
214 unsigned char t3[] = { 0x4A, 0x0E, 0x6C, 0xC1, 0xCF, 0xB4, 0x73, 0x49, 0x99, 0x05 };
215 int err;
216
217 if ((err = sober128_start(&st)) != CRYPT_OK) return err;
218 /* add entropy to uninitialized prng */
219 if ((err = sober128_add_entropy(en, sizeof(en), &st)) != CRYPT_OK) return err;
220 if ((err = sober128_ready(&st)) != CRYPT_OK) return err;
221 if (sober128_read(out, 10, &st) != 10) return CRYPT_ERROR_READPRNG; /* 10 bytes for testing */
222 if (compare_testvector(out, 10, t1, sizeof(t1), "SOBER128-PRNG", 1)) return CRYPT_FAIL_TESTVECTOR;
223 if (sober128_read(out, 500, &st) != 500) return CRYPT_ERROR_READPRNG; /* skip 500 bytes */
224 /* add entropy to already initialized prng */
225 if ((err = sober128_add_entropy(en, sizeof(en), &st)) != CRYPT_OK) return err;
226 if (sober128_read(out, 500, &st) != 500) return CRYPT_ERROR_READPRNG; /* skip 500 bytes */
227 if ((err = sober128_export(dmp, &dmplen, &st)) != CRYPT_OK) return err;
228 if (sober128_read(out, 500, &st) != 500) return CRYPT_ERROR_READPRNG; /* skip 500 bytes */
229 if (sober128_read(out, 10, &st) != 10) return CRYPT_ERROR_READPRNG; /* 10 bytes for testing */
230 if (compare_testvector(out, 10, t2, sizeof(t2), "SOBER128-PRNG", 2)) return CRYPT_FAIL_TESTVECTOR;
231 if ((err = sober128_done(&st)) != CRYPT_OK) return err;
232 if ((err = sober128_import(dmp, dmplen, &st)) != CRYPT_OK) return err;
233 if ((err = sober128_ready(&st)) != CRYPT_OK) return err;
234 if (sober128_read(out, 500, &st) != 500) return CRYPT_ERROR_READPRNG; /* skip 500 bytes */
235 if (sober128_read(out, 10, &st) != 10) return CRYPT_ERROR_READPRNG; /* 10 bytes for testing */
236 if (compare_testvector(out, 10, t3, sizeof(t3), "SOBER128-PRNG", 3)) return CRYPT_FAIL_TESTVECTOR;
237 if ((err = sober128_done(&st)) != CRYPT_OK) return err;
221238
222239 return CRYPT_OK;
223240 #endif
44 *
55 * The library is free for all purposes without any express
66 * guarantee it works.
7 *
8 * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
97 */
108 #include "tomcrypt.h"
119
134132 */
135133 int sprng_test(void)
136134 {
135 #ifndef LTC_TEST
136 return CRYPT_NOP;
137 #else
138 prng_state st;
139 unsigned char en[] = { 0x01, 0x02, 0x03, 0x04 };
140 unsigned char out[1000];
141 int err;
142
143 if ((err = sprng_start(&st)) != CRYPT_OK) return err;
144 if ((err = sprng_add_entropy(en, sizeof(en), &st)) != CRYPT_OK) return err;
145 if ((err = sprng_ready(&st)) != CRYPT_OK) return err;
146 if (sprng_read(out, 500, &st) != 500) return CRYPT_ERROR_READPRNG; /* skip 500 bytes */
147 if ((err = sprng_done(&st)) != CRYPT_OK) return err;
148
137149 return CRYPT_OK;
150 #endif
138151 }
139152
140153 #endif
44 *
55 * The library is free for all purposes without any express
66 * guarantee it works.
7 *
8 * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
97 */
108 #include "tomcrypt.h"
119
3937 int err;
4038
4139 LTC_ARGCHK(prng != NULL);
40 prng->ready = 0;
4241
4342 /* these are the default hash/cipher combo used */
4443 #ifdef LTC_RIJNDAEL
119118
120119 /* zero the memory used */
121120 zeromem(prng->yarrow.pool, sizeof(prng->yarrow.pool));
122 LTC_MUTEX_INIT(&prng->yarrow.prng_lock)
121 LTC_MUTEX_INIT(&prng->lock)
123122
124123 return CRYPT_OK;
125124 }
136135 hash_state md;
137136 int err;
138137
139 LTC_ARGCHK(in != NULL);
140 LTC_ARGCHK(prng != NULL);
141
142 LTC_MUTEX_LOCK(&prng->yarrow.prng_lock);
138 LTC_ARGCHK(prng != NULL);
139 LTC_ARGCHK(in != NULL);
140 LTC_ARGCHK(inlen > 0);
141
142 LTC_MUTEX_LOCK(&prng->lock);
143143
144144 if ((err = hash_is_valid(prng->yarrow.hash)) != CRYPT_OK) {
145 LTC_MUTEX_UNLOCK(&prng->yarrow.prng_lock);
146 return err;
145 goto LBL_UNLOCK;
147146 }
148147
149148 /* start the hash */
150149 if ((err = hash_descriptor[prng->yarrow.hash].init(&md)) != CRYPT_OK) {
151 LTC_MUTEX_UNLOCK(&prng->yarrow.prng_lock);
152 return err;
150 goto LBL_UNLOCK;
153151 }
154152
155153 /* hash the current pool */
156154 if ((err = hash_descriptor[prng->yarrow.hash].process(&md, prng->yarrow.pool,
157155 hash_descriptor[prng->yarrow.hash].hashsize)) != CRYPT_OK) {
158 LTC_MUTEX_UNLOCK(&prng->yarrow.prng_lock);
159 return err;
156 goto LBL_UNLOCK;
160157 }
161158
162159 /* add the new entropy */
163160 if ((err = hash_descriptor[prng->yarrow.hash].process(&md, in, inlen)) != CRYPT_OK) {
164 LTC_MUTEX_UNLOCK(&prng->yarrow.prng_lock);
165 return err;
161 goto LBL_UNLOCK;
166162 }
167163
168164 /* store result */
169 if ((err = hash_descriptor[prng->yarrow.hash].done(&md, prng->yarrow.pool)) != CRYPT_OK) {
170 LTC_MUTEX_UNLOCK(&prng->yarrow.prng_lock);
171 return err;
172 }
173
174 LTC_MUTEX_UNLOCK(&prng->yarrow.prng_lock);
175 return CRYPT_OK;
165 err = hash_descriptor[prng->yarrow.hash].done(&md, prng->yarrow.pool);
166
167 LBL_UNLOCK:
168 LTC_MUTEX_UNLOCK(&prng->lock);
169 return err;
176170 }
177171
178172 /**
185179 int ks, err;
186180
187181 LTC_ARGCHK(prng != NULL);
188 LTC_MUTEX_LOCK(&prng->yarrow.prng_lock);
182
183 LTC_MUTEX_LOCK(&prng->lock);
189184
190185 if ((err = hash_is_valid(prng->yarrow.hash)) != CRYPT_OK) {
191 LTC_MUTEX_UNLOCK(&prng->yarrow.prng_lock);
192 return err;
186 goto LBL_UNLOCK;
193187 }
194188
195189 if ((err = cipher_is_valid(prng->yarrow.cipher)) != CRYPT_OK) {
196 LTC_MUTEX_UNLOCK(&prng->yarrow.prng_lock);
197 return err;
190 goto LBL_UNLOCK;
198191 }
199192
200193 /* setup CTR mode using the "pool" as the key */
201194 ks = (int)hash_descriptor[prng->yarrow.hash].hashsize;
202195 if ((err = cipher_descriptor[prng->yarrow.cipher].keysize(&ks)) != CRYPT_OK) {
203 LTC_MUTEX_UNLOCK(&prng->yarrow.prng_lock);
204 return err;
196 goto LBL_UNLOCK;
205197 }
206198
207199 if ((err = ctr_start(prng->yarrow.cipher, /* what cipher to use */
210202 0, /* number of rounds */
211203 CTR_COUNTER_LITTLE_ENDIAN, /* little endian counter */
212204 &prng->yarrow.ctr)) != CRYPT_OK) {
213 LTC_MUTEX_UNLOCK(&prng->yarrow.prng_lock);
214 return err;
215 }
216 LTC_MUTEX_UNLOCK(&prng->yarrow.prng_lock);
217 return CRYPT_OK;
205 goto LBL_UNLOCK;
206 }
207 prng->ready = 1;
208
209 LBL_UNLOCK:
210 LTC_MUTEX_UNLOCK(&prng->lock);
211 return err;
218212 }
219213
220214 /**
226220 */
227221 unsigned long yarrow_read(unsigned char *out, unsigned long outlen, prng_state *prng)
228222 {
229 LTC_ARGCHK(out != NULL);
230 LTC_ARGCHK(prng != NULL);
231
232 LTC_MUTEX_LOCK(&prng->yarrow.prng_lock);
223 if (outlen == 0 || prng == NULL || out == NULL) return 0;
224
225 LTC_MUTEX_LOCK(&prng->lock);
226
227 if (!prng->ready) {
228 outlen = 0;
229 goto LBL_UNLOCK;
230 }
233231
234232 /* put out in predictable state first */
235233 zeromem(out, outlen);
236234
237235 /* now randomize it */
238236 if (ctr_encrypt(out, out, outlen, &prng->yarrow.ctr) != CRYPT_OK) {
239 LTC_MUTEX_UNLOCK(&prng->yarrow.prng_lock);
240 return 0;
241 }
242 LTC_MUTEX_UNLOCK(&prng->yarrow.prng_lock);
237 outlen = 0;
238 }
239
240 LBL_UNLOCK:
241 LTC_MUTEX_UNLOCK(&prng->lock);
243242 return outlen;
244243 }
245244
253252 int err;
254253 LTC_ARGCHK(prng != NULL);
255254
256 LTC_MUTEX_LOCK(&prng->yarrow.prng_lock);
255 LTC_MUTEX_LOCK(&prng->lock);
256 prng->ready = 0;
257257
258258 /* call cipher done when we invent one ;-) */
259259
260260 /* we invented one */
261261 err = ctr_done(&prng->yarrow.ctr);
262262
263 LTC_MUTEX_UNLOCK(&prng->yarrow.prng_lock);
263 LTC_MUTEX_UNLOCK(&prng->lock);
264264 return err;
265265 }
266266
273273 */
274274 int yarrow_export(unsigned char *out, unsigned long *outlen, prng_state *prng)
275275 {
276 unsigned long len = yarrow_desc.export_size;
277
276278 LTC_ARGCHK(out != NULL);
277279 LTC_ARGCHK(outlen != NULL);
278280 LTC_ARGCHK(prng != NULL);
279281
280 LTC_MUTEX_LOCK(&prng->yarrow.prng_lock);
281
282 /* we'll write 64 bytes for s&g's */
283 if (*outlen < 64) {
284 LTC_MUTEX_UNLOCK(&prng->yarrow.prng_lock);
285 *outlen = 64;
282 if (*outlen < len) {
283 *outlen = len;
286284 return CRYPT_BUFFER_OVERFLOW;
287285 }
288286
289 if (yarrow_read(out, 64, prng) != 64) {
290 LTC_MUTEX_UNLOCK(&prng->yarrow.prng_lock);
287 if (yarrow_read(out, len, prng) != len) {
291288 return CRYPT_ERROR_READPRNG;
292289 }
293 *outlen = 64;
294
290
291 *outlen = len;
295292 return CRYPT_OK;
296293 }
297294
308305
309306 LTC_ARGCHK(in != NULL);
310307 LTC_ARGCHK(prng != NULL);
311
312 LTC_MUTEX_LOCK(&prng->yarrow.prng_lock);
313
314 if (inlen != 64) {
315 LTC_MUTEX_UNLOCK(&prng->yarrow.prng_lock);
316 return CRYPT_INVALID_ARG;
317 }
318
319 if ((err = yarrow_start(prng)) != CRYPT_OK) {
320 LTC_MUTEX_UNLOCK(&prng->yarrow.prng_lock);
321 return err;
322 }
323 err = yarrow_add_entropy(in, 64, prng);
324 LTC_MUTEX_UNLOCK(&prng->yarrow.prng_lock);
325 return err;
308 if (inlen < (unsigned long)yarrow_desc.export_size) return CRYPT_INVALID_ARG;
309
310 if ((err = yarrow_start(prng)) != CRYPT_OK) return err;
311 if ((err = yarrow_add_entropy(in, inlen, prng)) != CRYPT_OK) return err;
312 return CRYPT_OK;
326313 }
327314
328315 /**
7070 }
7171 for (;;) {
7272 _chacha_block(buf, st->input, st->rounds);
73 /* increment the counter */
74 if (!++st->input[12] && !++st->input[13] && !++st->input[14]) { ++st->input[15]; }
73 if (st->ivlen == 8) {
74 /* IV-64bit, increment 64bit counter */
75 if (0 == ++st->input[12] && 0 == ++st->input[13]) return CRYPT_OVERFLOW;
76 }
77 else {
78 /* IV-96bit, increment 32bit counter */
79 if (0 == ++st->input[12]) return CRYPT_OVERFLOW;
80 }
7581 if (inlen <= 64) {
7682 for (i = 0; i < inlen; ++i) out[i] = in[i] ^ buf[i];
7783 st->ksleft = 64 - inlen;
8389 out += 64;
8490 in += 64;
8591 }
86 return CRYPT_OK;
87 };
92 }
8893
8994 #endif
2020 LTC_ARGCHK(st != NULL);
2121 XMEMSET(st, 0, sizeof(chacha_state));
2222 return CRYPT_OK;
23 };
23 }
2424
2525 #endif
3737 st->ksleft = 0;
3838 st->ivlen = ivlen;
3939 return CRYPT_OK;
40 };
40 }
4141
4242 #endif
3737 st->ksleft = 0;
3838 st->ivlen = ivlen;
3939 return CRYPT_OK;
40 };
40 }
4141
4242 #endif
1515
1616 #ifdef LTC_CHACHA
1717
18 static const char sigma[16] = "expand 32-byte k";
19 static const char tau[16] = "expand 16-byte k";
18 static const char * const sigma = "expand 32-byte k";
19 static const char * const tau = "expand 16-byte k";
2020
2121 /**
2222 Initialize an ChaCha context (only the key)
5252 LOAD32L(st->input[1], constants + 4);
5353 LOAD32L(st->input[2], constants + 8);
5454 LOAD32L(st->input[3], constants + 12);
55 st->rounds = rounds; /* e.g. 20 for chacha20 */
55 st->rounds = rounds; /* e.g. 20 for chacha20 */
56 st->ivlen = 0; /* will be set later by chacha_ivctr(32|64) */
5657 return CRYPT_OK;
57 };
58 }
5859
5960 #endif
88
99 #include "tomcrypt.h"
1010
11 #ifdef LTC_RC4
11 #ifdef LTC_RC4_STREAM
1212
1313 /**
1414 Initialize an RC4 context (only the key)
1717 @param keylen The length of the secret key (8 - 256 bytes)
1818 @return CRYPT_OK if successful
1919 */
20 int rc4_setup(rc4_state *st, const unsigned char *key, unsigned long keylen)
20 int rc4_stream_setup(rc4_state *st, const unsigned char *key, unsigned long keylen)
2121 {
2222 unsigned char tmp, *s;
2323 int x, y;
5353 @param out [out] The ciphertext (or plaintext), length inlen
5454 @return CRYPT_OK if successful
5555 */
56 int rc4_crypt(rc4_state *st, const unsigned char *in, unsigned long inlen, unsigned char *out)
56 int rc4_stream_crypt(rc4_state *st, const unsigned char *in, unsigned long inlen, unsigned char *out)
5757 {
5858 unsigned char x, y, *s, tmp;
5959
8383 @param outlen The output length
8484 @return CRYPT_OK on success
8585 */
86 int rc4_keystream(rc4_state *st, unsigned char *out, unsigned long outlen)
86 int rc4_stream_keystream(rc4_state *st, unsigned char *out, unsigned long outlen)
8787 {
8888 if (outlen == 0) return CRYPT_OK; /* nothing to do */
8989 LTC_ARGCHK(out != NULL);
9090 XMEMSET(out, 0, outlen);
91 return rc4_crypt(st, out, outlen, out);
91 return rc4_stream_crypt(st, out, outlen, out);
9292 }
9393
9494 /**
9696 @param st The RC4 state
9797 @return CRYPT_OK on success
9898 */
99 int rc4_done(rc4_state *st)
99 int rc4_stream_done(rc4_state *st)
100100 {
101101 LTC_ARGCHK(st != NULL);
102102 XMEMSET(st, 0, sizeof(rc4_state));
160160 @param keylen The length of the secret key (octets)
161161 @return CRYPT_OK if successful
162162 */
163 int sober128_setup(sober128_state *c, const unsigned char *key, unsigned long keylen)
163 int sober128_stream_setup(sober128_state *c, const unsigned char *key, unsigned long keylen)
164164 {
165165 ulong32 i, k;
166166
207207 @param inlen The length of the IV (must be 12)
208208 @return CRYPT_OK on success
209209 */
210 int sober128_setiv(sober128_state *c, const unsigned char *iv, unsigned long ivlen)
210 int sober128_stream_setiv(sober128_state *c, const unsigned char *iv, unsigned long ivlen)
211211 {
212212 ulong32 i, k;
213213
252252 @param out [out] The ciphertext (or plaintext), length inlen
253253 @return CRYPT_OK if successful
254254 */
255 int sober128_crypt(sober128_state *c, const unsigned char *in, unsigned long inlen, unsigned char *out)
255 int sober128_stream_crypt(sober128_state *c, const unsigned char *in, unsigned long inlen, unsigned char *out)
256256 {
257257 ulong32 t;
258258
320320 return CRYPT_OK;
321321 }
322322
323 int sober128_keystream(sober128_state *c, unsigned char *out, unsigned long outlen)
323 int sober128_stream_keystream(sober128_state *c, unsigned char *out, unsigned long outlen)
324324 {
325325 if (outlen == 0) return CRYPT_OK; /* nothing to do */
326326 LTC_ARGCHK(out != NULL);
327327 XMEMSET(out, 0, outlen);
328 return sober128_crypt(c, out, outlen, out);
328 return sober128_stream_crypt(c, out, outlen, out);
329329 }
330330
331331 /**
333333 @param c The Sober128 state
334334 @return CRYPT_OK on success
335335 */
336 int sober128_done(sober128_state *c)
336 int sober128_stream_done(sober128_state *c)
337337 {
338338 LTC_ARGCHK(c != NULL);
339339 XMEMSET(c, 0, sizeof(sober128_state));