1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
/*
* crypto_stream/try.c version 20090118
* D. J. Bernstein
* Public domain.
*/
#include <stdlib.h>
#include "crypto_stream.h"
extern unsigned char *alignedcalloc(unsigned long long);
const char *primitiveimplementation = crypto_stream_IMPLEMENTATION;
#define MAXTEST_BYTES 10000
#define CHECKSUM_BYTES 4096
#define TUNE_BYTES 1536
static unsigned char *k;
static unsigned char *n;
static unsigned char *m;
static unsigned char *c;
static unsigned char *s;
static unsigned char *k2;
static unsigned char *n2;
static unsigned char *m2;
static unsigned char *c2;
static unsigned char *s2;
static unsigned char *ka;
static unsigned char *na;
static unsigned char *ma;
static unsigned char *ca;
void preallocate(void)
{
}
void allocate(void)
{
k = alignedcalloc(crypto_stream_KEYBYTES);
n = alignedcalloc(crypto_stream_NONCEBYTES);
m = alignedcalloc(MAXTEST_BYTES);
c = alignedcalloc(MAXTEST_BYTES);
s = alignedcalloc(MAXTEST_BYTES);
k2 = alignedcalloc(crypto_stream_KEYBYTES);
n2 = alignedcalloc(crypto_stream_NONCEBYTES);
m2 = alignedcalloc(MAXTEST_BYTES);
c2 = alignedcalloc(MAXTEST_BYTES);
s2 = alignedcalloc(MAXTEST_BYTES);
ka = alignedcalloc(crypto_stream_KEYBYTES + 16);
na = alignedcalloc(crypto_stream_NONCEBYTES + 16);
ma = alignedcalloc(MAXTEST_BYTES + 16);
ca = alignedcalloc(MAXTEST_BYTES + 16);
}
void predoit(void)
{
}
void doit(void)
{
crypto_stream_xor(c,m,TUNE_BYTES,n,k);
}
char checksum[crypto_stream_KEYBYTES * 2 + 1];
const char *checksum_compute(void)
{
long long i;
long long j;
/* alignment check */
for (j = 0;j < 16;++j) crypto_stream_xor(ca + j,ma + j,MAXTEST_BYTES,na + j,ka + j);
for (j = 0;j < 16;++j) crypto_stream(ma + j,MAXTEST_BYTES,na + j,ka + j);
for (i = 0;i < CHECKSUM_BYTES;++i) {
long long mlen = i;
long long clen = i;
long long slen = i;
long long klen = crypto_stream_KEYBYTES;
long long nlen = crypto_stream_NONCEBYTES;
for (j = -16;j < 0;++j) m[j] = random();
for (j = -16;j < 0;++j) c[j] = random();
for (j = -16;j < 0;++j) s[j] = random();
for (j = -16;j < 0;++j) n[j] = random();
for (j = -16;j < 0;++j) k[j] = random();
for (j = mlen;j < mlen + 16;++j) m[j] = random();
for (j = clen;j < clen + 16;++j) c[j] = random();
for (j = slen;j < slen + 16;++j) s[j] = random();
for (j = nlen;j < nlen + 16;++j) n[j] = random();
for (j = klen;j < klen + 16;++j) k[j] = random();
for (j = -16;j < mlen + 16;++j) m2[j] = m[j];
for (j = -16;j < clen + 16;++j) c2[j] = c[j];
for (j = -16;j < slen + 16;++j) s2[j] = s[j];
for (j = -16;j < nlen + 16;++j) n2[j] = n[j];
for (j = -16;j < klen + 16;++j) k2[j] = k[j];
crypto_stream_xor(c,m,mlen,n,k);
for (j = -16;j < mlen + 16;++j) if (m[j] != m2[j]) return "crypto_stream_xor overwrites m";
for (j = -16;j < slen + 16;++j) if (s[j] != s2[j]) return "crypto_stream_xor overwrites s";
for (j = -16;j < nlen + 16;++j) if (n[j] != n2[j]) return "crypto_stream_xor overwrites n";
for (j = -16;j < klen + 16;++j) if (k[j] != k2[j]) return "crypto_stream_xor overwrites k";
for (j = -16;j < 0;++j) if (c[j] != c2[j]) return "crypto_stream_xor writes before output";
for (j = clen;j < clen + 16;++j) if (c[j] != c2[j]) return "crypto_stream_xor writes after output";
for (j = -16;j < clen + 16;++j) c2[j] = c[j];
crypto_stream(s,slen,n,k);
for (j = -16;j < mlen + 16;++j) if (m[j] != m2[j]) return "crypto_stream overwrites m";
for (j = -16;j < clen + 16;++j) if (c[j] != c2[j]) return "crypto_stream overwrites c";
for (j = -16;j < nlen + 16;++j) if (n[j] != n2[j]) return "crypto_stream overwrites n";
for (j = -16;j < klen + 16;++j) if (k[j] != k2[j]) return "crypto_stream overwrites k";
for (j = -16;j < 0;++j) if (s[j] != s2[j]) return "crypto_stream writes before output";
for (j = slen;j < slen + 16;++j) if (s[j] != s2[j]) return "crypto_stream writes after output";
for (j = 0;j < mlen;++j)
if ((s[j] ^ m[j]) != c[j]) return "crypto_stream_xor does not match crypto_stream";
for (j = 0;j < clen;++j) k[j % klen] ^= c[j];
crypto_stream_xor(m,c,clen,n,k);
crypto_stream(s,slen,n,k);
for (j = 0;j < mlen;++j)
if ((s[j] ^ m[j]) != c[j]) return "crypto_stream_xor does not match crypto_stream";
for (j = 0;j < mlen;++j) n[j % nlen] ^= m[j];
m[mlen] = 0;
}
for (i = 0;i < crypto_stream_KEYBYTES;++i) {
checksum[2 * i] = "0123456789abcdef"[15 & (k[i] >> 4)];
checksum[2 * i + 1] = "0123456789abcdef"[15 & k[i]];
}
checksum[2 * i] = 0;
return 0;
}
|