Mercurial > hg > ucis.core
annotate NaCl/crypto_hash/sha512.cs @ 78:1a10ca0f662e
FBGUI updates
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Sun, 16 Feb 2014 14:59:52 +0100 |
parents | b7d981ccd434 |
children |
rev | line source |
---|---|
20 | 1 ???using System; |
2 | |
3 namespace UCIS.NaCl.crypto_hash { | |
4 public static class sha512 { | |
5 public static int BYTES = 64; | |
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 | 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 | 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 | 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 | 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 | 80 } |
81 } | |
82 } |