annotate NaCl/APIv2.cs @ 80:4714531734b3

NaCl: fixed signature bounds check
author Ivo Smits <Ivo@UCIS.nl>
date Sun, 16 Feb 2014 15:05:31 +0100
parents 6aca18ee4ec6
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;
43
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
2 using System.Globalization;
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
3 using UCIS.Util;
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
4 using curve25519xsalsa20poly1305impl = UCIS.NaCl.crypto_box.curve25519xsalsa20poly1305;
80
4714531734b3 NaCl: fixed signature bounds check
Ivo Smits <Ivo@UCIS.nl>
parents: 73
diff changeset
5 using ed25519impl = UCIS.NaCl.crypto_sign.ed25519;
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
6 using edwards25519sha512batchimpl = UCIS.NaCl.crypto_sign.edwards25519sha512batch;
80
4714531734b3 NaCl: fixed signature bounds check
Ivo Smits <Ivo@UCIS.nl>
parents: 73
diff changeset
7 using sha512impl = UCIS.NaCl.crypto_hash.sha512;
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
8 using xsalsa20poly1305impl = UCIS.NaCl.crypto_secretbox.xsalsa20poly1305;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
9
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
10 namespace UCIS.NaCl.v2 {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
11 public class curve25519keypair {
43
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
12 private Byte[] secretkey;
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
13 private Byte[] publickey = null;
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
14
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
15 public curve25519keypair() {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
16 curve25519xsalsa20poly1305impl.crypto_box_keypair(out publickey, out secretkey);
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
17 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
18 public curve25519keypair(Byte[] secretkey) {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
19 this.secretkey = secretkey;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
20 }
43
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
21 public curve25519keypair(String secretkey) {
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
22 this.secretkey = DecodeHexString(secretkey, curve25519xsalsa20poly1305impl.SECRETKEYBYTES);
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
23 }
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
24 public curve25519keypair(Byte[] secretkey, Byte[] publickey) {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
25 if (publickey.Length != curve25519xsalsa20poly1305impl.PUBLICKEYBYTES) throw new ArgumentOutOfRangeException("publickey");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
26 if (secretkey.Length != curve25519xsalsa20poly1305impl.SECRETKEYBYTES) throw new ArgumentOutOfRangeException("secretkey");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
27 this.secretkey = secretkey;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
28 this.publickey = publickey;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
29 }
43
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
30 public Byte[] PublicKey {
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
31 get {
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
32 if (publickey == null) publickey = curve25519xsalsa20poly1305impl.crypto_box_getpublickey(secretkey);
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
33 return publickey;
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
34 }
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
35 }
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
36 public Byte[] SecretKey { get { return secretkey; } }
43
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
37 internal static Byte[] DecodeHexString(String str, int length) {
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
38 if (str.Length != length * 2) throw new ArgumentException("str", "Incorrect key length");
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
39 Byte[] bytes = new Byte[length];
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
40 for (int i = 0; i < length; i++) bytes[i] = Byte.Parse(str.Substring(i * 2, 2), NumberStyles.HexNumber);
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
41 return bytes;
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
42 }
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
43 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
44 public class curve25519xsalsa20poly1305 : xsalsa20poly1305 {
43
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
45 public Byte[] PublicKey { get; private set; }
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
46 public curve25519keypair SecretKey { get; private set; }
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
47 public curve25519xsalsa20poly1305(String publickey, String secretkey)
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
48 : this(curve25519keypair.DecodeHexString(publickey, curve25519xsalsa20poly1305impl.PUBLICKEYBYTES), new curve25519keypair(secretkey)) {
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
49 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
50 public curve25519xsalsa20poly1305(Byte[] publickey, Byte[] secretkey)
43
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
51 : this(publickey, new curve25519keypair(secretkey)) {
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
52 }
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
53 public curve25519xsalsa20poly1305(Byte[] publickey, curve25519keypair secretkey)
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
54 : base(curve25519xsalsa20poly1305impl.crypto_box_beforenm(publickey, secretkey.SecretKey)) {
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
55 this.PublicKey = publickey;
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
56 this.SecretKey = secretkey;
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
57 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
58 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
59 public class xsalsa20poly1305 {
43
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
60 protected Byte[] sharedkey = new Byte[xsalsa20poly1305impl.KEYBYTES];
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
61 Byte[] nonce = new Byte[xsalsa20poly1305impl.NONCEBYTES];
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
62
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
63 public int SharedKeySize { get { return xsalsa20poly1305impl.KEYBYTES; } }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
64
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
65 public xsalsa20poly1305(Byte[] sharedkey) : this(sharedkey, null) { }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
66 public xsalsa20poly1305(Byte[] sharedkey, Byte[] nonce) {
43
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
67 if (sharedkey == null) throw new ArgumentNullException("secretkey");
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
68 if (sharedkey.Length != xsalsa20poly1305impl.KEYBYTES) throw new ArgumentOutOfRangeException("secretkey", "The key size does not match the expected key length");
43
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
69 sharedkey.CopyTo(this.sharedkey, 0);
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
70 if (nonce != null) this.Nonce = nonce;
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
71 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
72
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
73 public Byte[] Nonce {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
74 get { return this.nonce; }
43
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
75 set { NonceValue = value; }
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
76 }
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
77 public Byte[] NonceValue {
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
78 get { return ArrayUtil.ToArray(nonce); }
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
79 set {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
80 if (ReferenceEquals(value, null)) throw new ArgumentNullException("value");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
81 if (value.Length > xsalsa20poly1305impl.NONCEBYTES) throw new ArgumentOutOfRangeException("value", "Nonce is too big");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
82 value.CopyTo(nonce, 0);
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
83 Array.Clear(this.nonce, value.Length, this.nonce.Length - value.Length);
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
84 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
85 }
43
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
86 public Byte[] NonceBuffer {
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
87 get { return this.nonce; }
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
88 set {
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
89 if (ReferenceEquals(value, null)) throw new ArgumentNullException("value");
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
90 if (value.Length > xsalsa20poly1305impl.NONCEBYTES) throw new ArgumentOutOfRangeException("value", "Incorrect nonce length");
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
91 this.nonce = value;
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
92 }
29cf42a12c34 Added convenience functions in NaCl API and ArrayUtils
Ivo Smits <Ivo@UCIS.nl>
parents: 20
diff changeset
93 }
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
94
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
95 public Byte[] SharedKey {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
96 get { return sharedkey; }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
97 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
98
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
99 public unsafe Byte[] Encrypt(Byte[] data) {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
100 return Encrypt(data, 0, data.Length);
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
101 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
102 public unsafe Byte[] Encrypt(Byte[] data, int offset, int count) {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
103 if (ReferenceEquals(data, null)) throw new ArgumentNullException("data");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
104 if (offset < 0) throw new ArgumentOutOfRangeException("offset", "Offset can not be negative");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
105 if (data.Length < offset + count) throw new ArgumentOutOfRangeException("count", "The specified range is outside of the array");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
106 Byte[] ret = new Byte[GetEncryptedSize(count)];
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
107 fixed (Byte* mp = data, cp = ret, np = nonce, kp = sharedkey) {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
108 if (xsalsa20poly1305impl.crypto_secretbox_nopad(cp, mp + offset, (ulong)count, np, kp) != 0) throw new InvalidOperationException("Encryption failed");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
109 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
110 return ret;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
111 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
112 public unsafe int EncryptTo(Byte[] data, int offset, int count, Byte[] outdata, int outoffset, int outcount) {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
113 if (ReferenceEquals(data, null)) throw new ArgumentNullException("data");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
114 if (offset < 0) throw new ArgumentOutOfRangeException("offset", "Offset can not be negative");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
115 if (data.Length < offset + count) throw new ArgumentOutOfRangeException("count", "The specified range is outside of the array");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
116 if (ReferenceEquals(outdata, null)) throw new ArgumentNullException("outdata");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
117 if (outoffset < 0) throw new ArgumentOutOfRangeException("outoffset", "Offset can not be negative");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
118 if (outdata.Length < outoffset + outcount) throw new ArgumentOutOfRangeException("outcount", "The specified range is outside of the array");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
119 int retcount = GetEncryptedSize(count);
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
120 if (outcount < retcount) throw new ArgumentOutOfRangeException("outcount", "The output buffer is too small");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
121 fixed (Byte* mp = data, cp = outdata, np = nonce, kp = sharedkey) {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
122 if (xsalsa20poly1305impl.crypto_secretbox_nopad(cp + outoffset, mp + offset, (ulong)count, np, kp) != 0) throw new InvalidOperationException("Encryption failed");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
123 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
124 return outcount;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
125 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
126 /*public unsafe void EncryptInplace(Byte[] data, int offset, int count) {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
127 if (ReferenceEquals(data, null)) throw new ArgumentNullException("data");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
128 if (offset < 0) throw new ArgumentOutOfRangeException("offset", "Offset can not be negative");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
129 if (data.Length < offset + count) throw new ArgumentOutOfRangeException("count", "The specified range is outside of the array");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
130 if (count < 16) throw new ArgumentOutOfRangeException("count", "count should be at least 16");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
131 fixed (Byte* mp = data, np = nonce, kp = sharedkey) {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
132 if (xsalsa20poly1305impl.crypto_secretbox_inplace_nopad(mp + offset, (ulong)count, np, kp) != 0) throw new InvalidOperationException("Encryption failed");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
133 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
134 }*/
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
135 public int GetEncryptedSize(int size) {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
136 return size + 16;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
137 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
138
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
139 public unsafe Byte[] Decrypt(Byte[] data) {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
140 return Decrypt(data, 0, data.Length);
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
141 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
142 public unsafe Byte[] Decrypt(Byte[] data, int offset, int count) {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
143 if (ReferenceEquals(data, null)) throw new ArgumentNullException("data");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
144 if (offset < 0) throw new ArgumentOutOfRangeException("offset", "Offset can not be negative");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
145 if (data.Length < offset + count) throw new ArgumentOutOfRangeException("count", "The specified range is outside of the array");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
146 if (count < 16) return null;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
147 Byte[] ret = new Byte[GetDecryptedSize(count)];
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
148 fixed (Byte* cp = data, mp = ret, np = nonce, kp = sharedkey) {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
149 if (xsalsa20poly1305impl.crypto_secretbox_open_nopad(mp, cp + offset, (ulong)count, np, kp) != 0) return null;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
150 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
151 return ret;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
152 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
153 public unsafe int? DecryptTo(Byte[] data, int offset, int count, Byte[] outdata, int outoffset, int outcount) {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
154 if (ReferenceEquals(data, null)) throw new ArgumentNullException("data");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
155 if (offset < 0) throw new ArgumentOutOfRangeException("offset", "Offset can not be negative");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
156 if (data.Length < offset + count) throw new ArgumentOutOfRangeException("count", "The specified range is outside of the array");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
157 if (count < 16) return null;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
158 if (ReferenceEquals(outdata, null)) throw new ArgumentNullException("outdata");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
159 if (outoffset < 0) throw new ArgumentOutOfRangeException("outoffset", "Offset can not be negative");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
160 if (outdata.Length < outoffset + outcount) throw new ArgumentOutOfRangeException("outcount", "The specified range is outside of the array");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
161 int retcount = GetDecryptedSize(count);
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
162 if (outcount < retcount) throw new ArgumentOutOfRangeException("outcount", "The output buffer is too small");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
163 fixed (Byte* cp = data, mp = outdata, np = nonce, kp = sharedkey) {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
164 if (xsalsa20poly1305impl.crypto_secretbox_open_nopad(mp + outoffset, cp + offset, (ulong)count, np, kp) != 0) return null;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
165 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
166 return retcount;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
167 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
168 public unsafe ArraySegment<Byte>? DecryptInplace(Byte[] data, int offset, int count) {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
169 if (ReferenceEquals(data, null)) throw new ArgumentNullException("data");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
170 if (offset < 0) throw new ArgumentOutOfRangeException("offset", "Offset can not be negative");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
171 if (data.Length < offset + count) throw new ArgumentOutOfRangeException("count", "The specified range is outside of the array");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
172 if (count < 16) return null;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
173 fixed (Byte* cp = data, np = nonce, kp = sharedkey) {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
174 if (xsalsa20poly1305impl.crypto_secretbox_open_inplace_nopad(cp + offset, (ulong)count, np, kp) != 0) return null;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
175 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
176 return new ArraySegment<byte>(data, offset + 16, count - 16);
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
177 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
178 public int GetDecryptedSize(int size) {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
179 if (size < 16) return -1;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
180 return size - 16;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
181 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
182
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
183 public Boolean Verify(Byte[] data) {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
184 return Verify(data, 0, data.Length);
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
185 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
186 public unsafe Boolean Verify(Byte[] data, int offset, int count) {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
187 if (ReferenceEquals(data, null)) throw new ArgumentNullException("data");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
188 if (offset < 0) throw new ArgumentOutOfRangeException("offset", "Offset can not be negative");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
189 if (data.Length < offset + count) throw new ArgumentOutOfRangeException("count", "The specified range is outside of the array");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
190 if (count < 16) return false;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
191 Byte[] ret = new Byte[GetDecryptedSize(count)];
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
192 fixed (Byte* cp = data, np = nonce, kp = sharedkey) {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
193 return xsalsa20poly1305impl.crypto_secretbox_verify(cp + offset, (ulong)count, np, kp);
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
194 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
195 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
196
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
197 public Byte[] GenerateRandomNonce() {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
198 randombytes.generate(nonce);
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
199 return nonce;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
200 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
201 public void IncrementNonceLE() {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
202 for (int i = 0; i < nonce.Length && ++nonce[i] == 0; i++) ;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
203 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
204 public void IncrementNonceBE() {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
205 for (int i = nonce.Length - 1; i >= 0 && ++nonce[i] == 0; i--) ;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
206 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
207
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
208 public xsalsa20poly1305 Clone() {
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
209 return new xsalsa20poly1305(sharedkey, nonce);
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
210 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
211 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
212 public class edwards25519sha512batch {
73
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
213 public static Byte[] Sign(Byte[] message, Byte[] secretkey) {
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
214 return edwards25519sha512batchimpl.crypto_sign(message, secretkey);
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
215 }
73
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
216 public static int GetSignedSize(int size) {
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
217 return size + 64;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
218 }
73
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
219 public static Byte[] Open(Byte[] signed, Byte[] publickey) {
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
220 return edwards25519sha512batchimpl.crypto_sign_open(signed, publickey);
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
221 }
73
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
222 public static unsafe Boolean Verify(Byte[] signed, Byte[] publickey) {
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
223 if (publickey.Length != edwards25519sha512batchimpl.PUBLICKEYBYTES) throw new ArgumentException("publickey.Length != PUBLICKEYBYTES");
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
224 UInt64 mlen;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
225 fixed (Byte* smp = signed, pkp = publickey) return edwards25519sha512batchimpl.crypto_sign_open(null, out mlen, smp, (ulong)signed.Length, pkp) == 0;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
226 }
73
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
227 public static Byte[] Extract(Byte[] signed) {
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
228 if (signed.Length < 64) return null;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
229 Byte[] ret = new Byte[signed.Length - 64];
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
230 Buffer.BlockCopy(signed, 32, ret, 0, ret.Length);
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
231 return ret;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
232 }
73
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
233 public static int GetExtractedSize(int size) {
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
234 if (size < 64) return -1;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
235 return size - 64;
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
236 }
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
237 }
73
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
238 public class sha512 {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
239 sha512impl.sha512state state = new sha512impl.sha512state();
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
240 public sha512() {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
241 state.init();
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
242 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
243 public unsafe void Process(Byte[] buffer, int offset, int count) {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
244 if (offset < 0 || count < 0 || offset + count > buffer.Length) throw new ArgumentException("buffer");
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
245 fixed (Byte* p = buffer) state.process(p + offset, count);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
246 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
247 public unsafe void GetHash(Byte[] hash, int offset) {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
248 if (offset < 0 || offset + 64 > hash.Length) throw new ArgumentException("hash");
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
249 fixed (Byte* p = hash) state.finish(p + offset);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
250 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
251 public unsafe Byte[] GetHash() {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
252 Byte[] hash = new Byte[64];
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
253 GetHash(hash, 0);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
254 return hash;
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
255 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
256 public static unsafe void GetHash(Byte[] buffer, int offset, int count, Byte[] hash, int hashoffset) {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
257 if (offset < 0 || offset + count > buffer.Length) throw new ArgumentException("buffer");
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
258 if (offset < 0 || offset + 64 > hash.Length) throw new ArgumentException("hash");
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
259 sha512impl.sha512state state = new sha512impl.sha512state();
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
260 state.init();
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
261 fixed (Byte* p = buffer) state.process(p + offset, count);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
262 fixed (Byte* p = hash) state.finish(p + offset);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
263 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
264 public static unsafe Byte[] GetHash(Byte[] buffer, int offset, int count) {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
265 Byte[] hash = new Byte[64];
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
266 GetHash(buffer,offset,count,hash,0);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
267 return hash;
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
268 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
269 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
270 public class ed25519keypair {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
271 internal Byte[] key;
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
272
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
273 public ed25519keypair() {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
274 Byte[] pk;
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
275 ed25519impl.crypto_sign_keypair(out pk, out key);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
276 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
277 public ed25519keypair(Byte[] key) {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
278 if (key.Length == 64) {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
279 this.key = ArrayUtil.ToArray(key);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
280 }else {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
281 Byte[] pk;
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
282 ed25519impl.crypto_sign_seed_keypair(out pk, out this.key, key);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
283 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
284 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
285 public ed25519keypair(String key) : this(curve25519keypair.DecodeHexString(key, key.Length)) { }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
286 public Byte[] PublicKey { get { return ArrayUtil.Slice(key, 32, 32); } }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
287 public Byte[] SecretKey { get { return ArrayUtil.Slice(key, 0, 32); } }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
288 public Byte[] ExpandedKey { get { return ArrayUtil.ToArray(key); } }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
289
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
290 public Byte[] GetSignature(Byte[] message) {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
291 return ed25519.GetSignature(message, key);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
292 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
293 public Byte[] GetSignature(Byte[] message, int offset, int count) {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
294 return ed25519.GetSignature(new ArraySegment<Byte>(message, offset, count), key);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
295 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
296 public Byte[] SignMessage(Byte[] message) {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
297 return ed25519.SignMessage(message, key);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
298 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
299 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
300 public class ed25519 {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
301 public static unsafe Byte[] GetSignature(Byte[] message, Byte[] key) {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
302 if (message == null) throw new ArgumentNullException("message");
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
303 if (key.Length != 64) throw new ArgumentException("key");
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
304 Byte[] sig = new Byte[64];
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
305 fixed (Byte* sigp = sig, msgp = message, kp = key) ed25519impl.crypto_getsignature(sigp, msgp, message.Length, kp);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
306 return sig;
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
307 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
308 public static unsafe Byte[] GetSignature(ArraySegment<Byte> message, Byte[] key) {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
309 if (message == null) throw new ArgumentNullException("message");
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
310 if (key.Length != 64) throw new ArgumentException("key");
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
311 if (message.Offset < 0 || message.Count < 0 || message.Offset + message.Count > message.Array.Length) throw new ArgumentException("message");
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
312 Byte[] sig = new Byte[64];
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
313 fixed (Byte* sigp = sig, msgp = message.Array, kp = key) ed25519impl.crypto_getsignature(sigp, msgp + message.Offset, message.Count, kp);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
314 return sig;
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
315 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
316 public static unsafe Byte[] SignMessage(Byte[] message, Byte[] key) {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
317 if (key.Length != 64) throw new ArgumentException("key");
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
318 Byte[] ret = new Byte[message.Length + 64];
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
319 int smlen;
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
320 fixed (Byte* sm = ret, msgp = message, kp = key) ed25519impl.crypto_sign(sm, out smlen, msgp, message.Length, kp);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
321 return ret;
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
322 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
323 public static unsafe Boolean VerifySignature(Byte[] message, Byte[] signature, Byte[] pk) {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
324 if (signature.Length < 64) throw new ArgumentException("signature");
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
325 if (pk.Length < 32) throw new ArgumentException("pk");
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
326 fixed (Byte* sp = signature, mp = message, kp = pk) return ed25519impl.crypto_sign_verify(sp, mp, message.Length, kp);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
327 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
328 public static unsafe Boolean VerifySignature(ArraySegment<Byte> message, ArraySegment<Byte> signature, Byte[] pk) {
80
4714531734b3 NaCl: fixed signature bounds check
Ivo Smits <Ivo@UCIS.nl>
parents: 73
diff changeset
329 if (signature.Offset < 0 || signature.Count < 64 || signature.Offset + signature.Count > signature.Array.Length) throw new ArgumentException("signature");
4714531734b3 NaCl: fixed signature bounds check
Ivo Smits <Ivo@UCIS.nl>
parents: 73
diff changeset
330 if (message.Offset < 0 || message.Count < 0 || message.Offset + message.Count > message.Array.Length) throw new ArgumentException("message");
73
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
331 if (pk.Length < 32) throw new ArgumentException("pk");
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
332 fixed (Byte* sp = signature.Array, mp = message.Array, kp = pk) return ed25519impl.crypto_sign_verify(sp + signature.Offset, mp + message.Offset, message.Count, kp);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
333 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
334 public static unsafe Boolean VerifySignedMessage(Byte[] signedmessage, Byte[] pk) {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
335 if (signedmessage.Length < 64) throw new ArgumentException("signedmessage");
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
336 if (pk.Length < 32) throw new ArgumentException("pk");
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
337 fixed (Byte* mp = signedmessage, kp = pk) return ed25519impl.crypto_sign_verify(mp, mp + 64, signedmessage.Length - 64, kp);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
338 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
339 public static Byte[] ExtractSignedMessage(Byte[] signedmessage) {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
340 return ArrayUtil.Slice(signedmessage, 64);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
341 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
342 public static Byte[] ExtractSignedMessage(ArraySegment<Byte> signedmessage) {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
343 return ArrayUtil.Slice(signedmessage.Array, signedmessage.Offset + 64, signedmessage.Count - 64);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
344 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
345 public static ArraySegment<Byte> ExtractSignedMessageFast(Byte[] signedmessage) {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
346 return new ArraySegment<Byte>(signedmessage, 64, signedmessage.Length - 64);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
347 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
348 public static ArraySegment<Byte> ExtractSignedMessageFast(ArraySegment<Byte> signedmessage) {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
349 return new ArraySegment<Byte>(signedmessage.Array, signedmessage.Offset + 64, signedmessage.Count - 64);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
350 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
351 public static Byte[] OpenSignedMessage(Byte[] signedmessage, Byte[] pk) {
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
352 if (!VerifySignedMessage(signedmessage, pk)) return null;
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
353 return ExtractSignedMessage(signedmessage);
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
354 }
6aca18ee4ec6 NaCl: improved ed25519 implementation, added simple API for ed25519 and sha512
Ivo Smits <Ivo@UCIS.nl>
parents: 43
diff changeset
355 }
20
c873e3dd73fe Added NaCl cryptography code
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
356 }