annotate NaCl/crypto_hash/sha512.cs @ 72:b7d981ccd434

NaCl: improved sha512 implementation
author Ivo Smits <Ivo@UCIS.nl>
date Sat, 02 Nov 2013 15:59:51 +0100
parents 7e9d1cfcc562
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1 ???using System;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
3 namespace UCIS.NaCl.crypto_hash {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
4 public static class sha512 {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
5 public static int BYTES = 64;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
6
71
7e9d1cfcc562 NaCl: added ed25519 public key message signing implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
7 public static unsafe void crypto_hash(Byte[] outv, Byte[] inv, int inlen) {
7e9d1cfcc562 NaCl: added ed25519 public key message signing implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
8 if (outv.Length < 64) throw new ArgumentException("outv.Length < 64");
7e9d1cfcc562 NaCl: added ed25519 public key message signing implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
9 if (inv.Length < inlen) throw new ArgumentException("inv.Length < inlen");
7e9d1cfcc562 NaCl: added ed25519 public key message signing implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
10 fixed (Byte* outp = outv, inp = inv) crypto_hash(outp, inp, (UInt64)inlen);
7e9d1cfcc562 NaCl: added ed25519 public key message signing implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
11 }
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
12 public static unsafe void crypto_hash(Byte* outp, Byte* inp, UInt64 inlen) {
72
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
13 sha512state state = new sha512state();
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
14 state.init();
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
15 state.process(inp, (int)inlen);
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
16 state.finish(outp);
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
17 }
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
18
72
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
19 public unsafe struct sha512state {
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
20 fixed UInt64 state[8];
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
21 fixed Byte input[128];
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
22 int offset;
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
23 int length;
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
24
72
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
25 public unsafe void init() {
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
26 fixed (UInt64* s = state) {
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
27 s[0] = 0x6a09e667f3bcc908; s[1] = 0xbb67ae8584caa73b; s[2] = 0x3c6ef372fe94f82b; s[3] = 0xa54ff53a5f1d36f1;
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
28 s[4] = 0x510e527fade682d1; s[5] = 0x9b05688c2b3e6c1f; s[6] = 0x1f83d9abfb41bd6b; s[7] = 0x5be0cd19137e2179;
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
29 }
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
30 offset = 0;
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
31 length = 0;
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
32 }
72
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
33 public unsafe void process(Byte* inp, int inlen) {
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
34 fixed (sha512state* pthis = &this) {
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
35 length += inlen;
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
36 if (offset > 0) {
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
37 int blen = 128 - offset;
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
38 if (blen > inlen) blen = inlen;
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
39 for (int i = 0; i < blen; i++) pthis->input[offset++] = *inp++;
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
40 inlen -= blen;
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
41 }
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
42 if (offset == 128) {
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
43 crypto_hashblocks.sha512.crypto_hashblocks(pthis->state, pthis->input, (UInt64)offset);
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
44 offset = 0;
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
45 }
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
46 if (inlen >= 128) {
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
47 crypto_hashblocks.sha512.crypto_hashblocks(pthis->state, inp, (UInt64)inlen);
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
48 inp += inlen;
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
49 inlen &= 127;
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
50 inp -= inlen;
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
51 }
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
52 if (inlen > 0) {
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
53 for (int i = 0; i < inlen; i++) pthis->input[offset++] = *inp++;
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
54 }
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
55 }
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
56 }
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
57 public unsafe void finish(Byte* outp) {
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
58 fixed (sha512state* s = &this) {
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
59 s->input[offset++] = 0x80;
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
60 if (offset > 112) {
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
61 for (int i = offset; i < 128; i++) s->input[i] = 0;
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
62 crypto_hashblocks.sha512.crypto_hashblocks(s->state, s->input, 128);
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
63 offset = 0;
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
64 }
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
65 for (int i = offset; i < 119; i++) s->input[i] = 0;
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
66 UInt64 bytes = (UInt64)length;
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
67 s->input[119] = (Byte)(bytes >> 61);
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
68 s->input[120] = (Byte)(bytes >> 53);
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
69 s->input[121] = (Byte)(bytes >> 45);
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
70 s->input[122] = (Byte)(bytes >> 37);
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
71 s->input[123] = (Byte)(bytes >> 29);
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
72 s->input[124] = (Byte)(bytes >> 21);
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
73 s->input[125] = (Byte)(bytes >> 13);
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
74 s->input[126] = (Byte)(bytes >> 5);
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
75 s->input[127] = (Byte)(bytes << 3);
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
76 crypto_hashblocks.sha512.crypto_hashblocks(s->state, s->input, 128);
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
77 crypto_hashblocks.sha512.crypto_hashblocks_state_pack(outp, s->state);
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
78 }
b7d981ccd434 NaCl: improved sha512 implementation
Ivo Smits <Ivo@UCIS.nl>
parents: 71
diff changeset
79 }
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
80 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
81 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
82 }