diff options
author | Leah Neukirchen <leah@vuxu.org> | 2020-04-19 16:09:31 +0200 |
---|---|---|
committer | Leah Neukirchen <leah@vuxu.org> | 2020-04-19 16:09:31 +0200 |
commit | bbe81e6c871e9556ce224a9039c7d8eb507276b2 (patch) | |
tree | 828058ec18346010474e59c2a0d59d8e05b4ae8b /rdd.c | |
parent | 91a136ea9bfbffe691540becd67a4efba5cec16d (diff) | |
download | rdd-bbe81e6c871e9556ce224a9039c7d8eb507276b2.tar.gz rdd-bbe81e6c871e9556ce224a9039c7d8eb507276b2.tar.xz rdd-bbe81e6c871e9556ce224a9039c7d8eb507276b2.zip |
This is actually even faster (and comparable in speed with the reference implementation), and also has received substantial cryptanalysis.
Diffstat (limited to 'rdd.c')
-rw-r--r-- | rdd.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/rdd.c b/rdd.c index c1ed8d6..8f0af11 100644 --- a/rdd.c +++ b/rdd.c @@ -5,16 +5,17 @@ #include <stdlib.h> #include <unistd.h> -#include "sosemanuk.h" +#include "chacha.h" #define fail(i, s) write(2, "rdd: " s, 5+(sizeof s)-1), exit(i); int main(int argc, char *argv[]) { - unsigned char key[32], iv[16], buf[120*512]; - sosemanuk_key_context kc; - sosemanuk_run_context rc; + chacha_state state; + chacha_key key; + chacha_iv iv; + unsigned char buf[16*4096]; int fd, c, v = 0; long i, r = 4; @@ -33,28 +34,31 @@ usage: if (argc > optind) goto usage; + if (chacha_startup() != 0) + fail(255, "self-test failed\n"); + if (isatty(1)) fail(5, "cowardly not dumping random data to tty\n"); if ((fd = open(src, O_RDONLY)) < 0) fail(2, "failed to open random source\n"); - if (read(fd, key, sizeof key) != sizeof key) - fail(3, "failed to read key from random source\n"); - sosemanuk_schedule(&kc, key, sizeof key); + if (read(fd, iv.b, sizeof iv.b) != sizeof iv.b) + fail(3, "failed to read iv from random source\n"); while (1) { - if (read(fd, iv, sizeof iv) != sizeof iv) - fail(3, "failed to read iv from random source\n"); - sosemanuk_init(&rc, &kc, iv, sizeof iv); + if (read(fd, key.b, sizeof key.b) != sizeof key.b) + fail(3, "failed to read key from random source\n"); + chacha_init(&state, &key, &iv, 8); + if (v) write(2, ".", 1); for (i = 0; r < 0 || i < r*1024*1024; i += sizeof buf) { - sosemanuk_prng(&rc, buf, sizeof buf); + chacha_update(&state, 0, buf, sizeof buf); while (write(1, buf, sizeof buf) != sizeof buf) if (errno) { - if (errno == ENOSPC) + if (errno == ENOSPC || errno == EPIPE) exit(0); if (errno != EINTR) fail(4, "write error\n"); |