ruby_olm 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/ext/ruby_olm/ext_lib_olm/ext_account.c +274 -0
- data/ext/ruby_olm/ext_lib_olm/ext_lib_olm.c +51 -0
- data/ext/ruby_olm/ext_lib_olm/ext_lib_olm.h +13 -0
- data/ext/ruby_olm/ext_lib_olm/ext_session.c +363 -0
- data/ext/ruby_olm/ext_lib_olm/ext_utility.c +69 -0
- data/ext/ruby_olm/ext_lib_olm/extconf.rb +69 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_account.cpp +695 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_account.h +56 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_inbound_group_session.cpp +654 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_inbound_group_session.h +51 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_jni.h +81 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_jni_helper.cpp +224 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_jni_helper.h +30 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_manager.cpp +35 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_manager.h +36 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_outbound_group_session.cpp +563 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_outbound_group_session.h +49 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_pk.cpp +716 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_pk.h +48 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_session.cpp +977 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_session.h +59 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_utility.cpp +236 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_utility.h +40 -0
- data/ext/ruby_olm/ext_lib_olm/olm/fuzzers/fuzz_decode_message.cpp +14 -0
- data/ext/ruby_olm/ext_lib_olm/olm/fuzzers/fuzz_decrypt.cpp +65 -0
- data/ext/ruby_olm/ext_lib_olm/olm/fuzzers/fuzz_group_decrypt.cpp +73 -0
- data/ext/ruby_olm/ext_lib_olm/olm/fuzzers/fuzz_unpickle_account.cpp +14 -0
- data/ext/ruby_olm/ext_lib_olm/olm/fuzzers/fuzz_unpickle_session.cpp +14 -0
- data/ext/ruby_olm/ext_lib_olm/olm/fuzzers/include/fuzzing.hh +82 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/account.hh +160 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/base64.h +77 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/base64.hh +63 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/cipher.h +138 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/crypto.h +202 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/error.h +72 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/inbound_group_session.h +235 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/list.hh +119 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/megolm.h +95 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/memory.h +41 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/memory.hh +90 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/message.h +93 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/message.hh +138 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/olm.h +451 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/olm.hh +4 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/outbound_group_session.h +181 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/pickle.h +90 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/pickle.hh +149 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/pickle_encoding.h +76 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/pk.h +214 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/ratchet.hh +184 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/session.hh +156 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/utility.hh +61 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/aes.c +1073 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/aes.h +123 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/aes_test.c +276 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/arcfour.c +45 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/arcfour.h +30 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/arcfour_test.c +47 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/base64.c +135 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/base64.h +27 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/base64_test.c +54 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/blowfish.c +269 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/blowfish.h +32 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/blowfish_test.c +68 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/des.c +269 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/des.h +37 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/des_test.c +83 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/md2.c +104 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/md2.h +33 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/md2_test.c +58 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/md5.c +189 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/md5.h +34 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/md5_test.c +60 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/rot-13.c +35 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/rot-13.h +20 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/rot-13_test.c +44 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/sha1.c +149 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/sha1.h +35 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/sha1_test.c +58 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/sha256.c +159 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/sha256.h +34 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/sha256_test.c +61 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/contrib/Curve25519Donna.c +118 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/contrib/Curve25519Donna.h +53 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/curve25519-donna-c64.c +449 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/curve25519-donna.c +860 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/python-src/curve25519/curve25519module.c +105 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/speed-curve25519.c +50 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/test-curve25519.c +54 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/test-noncanon.c +39 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/test-sc-curve25519.c +72 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna.h +18 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/add_scalar.c +56 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/ed25519.h +38 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/fe.c +1493 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/fe.h +41 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/fixedint.h +72 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/ge.c +467 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/ge.h +74 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/key_exchange.c +79 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/keypair.c +16 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/precomp_data.h +1391 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/sc.c +814 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/sc.h +12 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/seed.c +40 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/sha512.c +275 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/sha512.h +21 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/sign.c +31 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/verify.c +77 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/test.c +150 -0
- data/ext/ruby_olm/ext_lib_olm/olm/python/dummy/stddef.h +0 -0
- data/ext/ruby_olm/ext_lib_olm/olm/python/dummy/stdint.h +0 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/account.cpp +380 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/base64.cpp +167 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/cipher.cpp +152 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/crypto.cpp +299 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/ed25519.c +22 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/error.c +44 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/inbound_group_session.c +524 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/megolm.c +150 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/memory.cpp +45 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/message.cpp +401 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/olm.cpp +738 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/outbound_group_session.c +363 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/pickle.cpp +242 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/pickle_encoding.c +92 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/pk.cpp +412 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/ratchet.cpp +625 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/session.cpp +462 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/utility.cpp +57 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/include/unittest.hh +107 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_base64.cpp +70 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_crypto.cpp +246 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_group_session.cpp +329 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_list.cpp +92 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_megolm.cpp +134 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_message.cpp +112 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_olm.cpp +405 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_olm_decrypt.cpp +90 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_olm_sha256.cpp +20 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_olm_signature.cpp +81 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_olm_using_malloc.cpp +210 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_pk.cpp +166 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_ratchet.cpp +221 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_session.cpp +144 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMAccount.h +51 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMAccount_Private.h +25 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMInboundGroupSession.h +38 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMKit.h +37 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMMessage.h +38 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMOutboundGroupSession.h +32 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMPkDecryption.h +71 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMPkEncryption.h +42 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMPkMessage.h +31 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMSerializable.h +29 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMSession.h +44 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMSession_Private.h +26 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMUtility.h +49 -0
- data/ext/ruby_olm/ext_lib_olm/staging/account.cpp +380 -0
- data/ext/ruby_olm/ext_lib_olm/staging/aes.c +1073 -0
- data/ext/ruby_olm/ext_lib_olm/staging/base64.cpp +167 -0
- data/ext/ruby_olm/ext_lib_olm/staging/cipher.cpp +152 -0
- data/ext/ruby_olm/ext_lib_olm/staging/crypto.cpp +299 -0
- data/ext/ruby_olm/ext_lib_olm/staging/curve25519-donna.c +860 -0
- data/ext/ruby_olm/ext_lib_olm/staging/ed25519.c +22 -0
- data/ext/ruby_olm/ext_lib_olm/staging/error.c +44 -0
- data/ext/ruby_olm/ext_lib_olm/staging/inbound_group_session.c +524 -0
- data/ext/ruby_olm/ext_lib_olm/staging/megolm.c +150 -0
- data/ext/ruby_olm/ext_lib_olm/staging/memory.cpp +45 -0
- data/ext/ruby_olm/ext_lib_olm/staging/message.cpp +401 -0
- data/ext/ruby_olm/ext_lib_olm/staging/olm.cpp +738 -0
- data/ext/ruby_olm/ext_lib_olm/staging/outbound_group_session.c +363 -0
- data/ext/ruby_olm/ext_lib_olm/staging/pickle.cpp +242 -0
- data/ext/ruby_olm/ext_lib_olm/staging/pickle_encoding.c +92 -0
- data/ext/ruby_olm/ext_lib_olm/staging/pk.cpp +412 -0
- data/ext/ruby_olm/ext_lib_olm/staging/ratchet.cpp +625 -0
- data/ext/ruby_olm/ext_lib_olm/staging/session.cpp +461 -0
- data/ext/ruby_olm/ext_lib_olm/staging/sha256.c +159 -0
- data/ext/ruby_olm/ext_lib_olm/staging/utility.cpp +57 -0
- data/lib/ruby_olm/account.rb +42 -0
- data/lib/ruby_olm/message.rb +6 -0
- data/lib/ruby_olm/olm_error.rb +70 -0
- data/lib/ruby_olm/olm_message.rb +25 -0
- data/lib/ruby_olm/pre_key_message.rb +6 -0
- data/lib/ruby_olm/session.rb +16 -0
- data/lib/ruby_olm/version.rb +5 -0
- data/lib/ruby_olm.rb +10 -0
- data/rakefile +18 -0
- data/test/examples/test_bob_no_answer.rb +62 -0
- data/test/examples/test_exchange.rb +60 -0
- data/test/spec/test_account.rb +152 -0
- data/test/unit/test_account_methods.rb +85 -0
- metadata +282 -0
@@ -0,0 +1,12 @@
|
|
1
|
+
#ifndef SC_H
|
2
|
+
#define SC_H
|
3
|
+
|
4
|
+
/*
|
5
|
+
The set of scalars is \Z/l
|
6
|
+
where l = 2^252 + 27742317777372353535851937790883648493.
|
7
|
+
*/
|
8
|
+
|
9
|
+
void sc_reduce(unsigned char *s);
|
10
|
+
void sc_muladd(unsigned char *s, const unsigned char *a, const unsigned char *b, const unsigned char *c);
|
11
|
+
|
12
|
+
#endif
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#include "ed25519.h"
|
2
|
+
|
3
|
+
#ifndef ED25519_NO_SEED
|
4
|
+
|
5
|
+
#ifdef _WIN32
|
6
|
+
#include <Windows.h>
|
7
|
+
#include <Wincrypt.h>
|
8
|
+
#else
|
9
|
+
#include <stdio.h>
|
10
|
+
#endif
|
11
|
+
|
12
|
+
int ed25519_create_seed(unsigned char *seed) {
|
13
|
+
#ifdef _WIN32
|
14
|
+
HCRYPTPROV prov;
|
15
|
+
|
16
|
+
if (!CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {
|
17
|
+
return 1;
|
18
|
+
}
|
19
|
+
|
20
|
+
if (!CryptGenRandom(prov, 32, seed)) {
|
21
|
+
CryptReleaseContext(prov, 0);
|
22
|
+
return 1;
|
23
|
+
}
|
24
|
+
|
25
|
+
CryptReleaseContext(prov, 0);
|
26
|
+
#else
|
27
|
+
FILE *f = fopen("/dev/urandom", "rb");
|
28
|
+
|
29
|
+
if (f == NULL) {
|
30
|
+
return 1;
|
31
|
+
}
|
32
|
+
|
33
|
+
fread(seed, 1, 32, f);
|
34
|
+
fclose(f);
|
35
|
+
#endif
|
36
|
+
|
37
|
+
return 0;
|
38
|
+
}
|
39
|
+
|
40
|
+
#endif
|
@@ -0,0 +1,275 @@
|
|
1
|
+
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
|
2
|
+
*
|
3
|
+
* LibTomCrypt is a library that provides various cryptographic
|
4
|
+
* algorithms in a highly modular and flexible manner.
|
5
|
+
*
|
6
|
+
* The library is free for all purposes without any express
|
7
|
+
* guarantee it works.
|
8
|
+
*
|
9
|
+
* Tom St Denis, tomstdenis@gmail.com, http://libtom.org
|
10
|
+
*/
|
11
|
+
|
12
|
+
#include "fixedint.h"
|
13
|
+
#include "sha512.h"
|
14
|
+
|
15
|
+
/* the K array */
|
16
|
+
static const uint64_t K[80] = {
|
17
|
+
UINT64_C(0x428a2f98d728ae22), UINT64_C(0x7137449123ef65cd),
|
18
|
+
UINT64_C(0xb5c0fbcfec4d3b2f), UINT64_C(0xe9b5dba58189dbbc),
|
19
|
+
UINT64_C(0x3956c25bf348b538), UINT64_C(0x59f111f1b605d019),
|
20
|
+
UINT64_C(0x923f82a4af194f9b), UINT64_C(0xab1c5ed5da6d8118),
|
21
|
+
UINT64_C(0xd807aa98a3030242), UINT64_C(0x12835b0145706fbe),
|
22
|
+
UINT64_C(0x243185be4ee4b28c), UINT64_C(0x550c7dc3d5ffb4e2),
|
23
|
+
UINT64_C(0x72be5d74f27b896f), UINT64_C(0x80deb1fe3b1696b1),
|
24
|
+
UINT64_C(0x9bdc06a725c71235), UINT64_C(0xc19bf174cf692694),
|
25
|
+
UINT64_C(0xe49b69c19ef14ad2), UINT64_C(0xefbe4786384f25e3),
|
26
|
+
UINT64_C(0x0fc19dc68b8cd5b5), UINT64_C(0x240ca1cc77ac9c65),
|
27
|
+
UINT64_C(0x2de92c6f592b0275), UINT64_C(0x4a7484aa6ea6e483),
|
28
|
+
UINT64_C(0x5cb0a9dcbd41fbd4), UINT64_C(0x76f988da831153b5),
|
29
|
+
UINT64_C(0x983e5152ee66dfab), UINT64_C(0xa831c66d2db43210),
|
30
|
+
UINT64_C(0xb00327c898fb213f), UINT64_C(0xbf597fc7beef0ee4),
|
31
|
+
UINT64_C(0xc6e00bf33da88fc2), UINT64_C(0xd5a79147930aa725),
|
32
|
+
UINT64_C(0x06ca6351e003826f), UINT64_C(0x142929670a0e6e70),
|
33
|
+
UINT64_C(0x27b70a8546d22ffc), UINT64_C(0x2e1b21385c26c926),
|
34
|
+
UINT64_C(0x4d2c6dfc5ac42aed), UINT64_C(0x53380d139d95b3df),
|
35
|
+
UINT64_C(0x650a73548baf63de), UINT64_C(0x766a0abb3c77b2a8),
|
36
|
+
UINT64_C(0x81c2c92e47edaee6), UINT64_C(0x92722c851482353b),
|
37
|
+
UINT64_C(0xa2bfe8a14cf10364), UINT64_C(0xa81a664bbc423001),
|
38
|
+
UINT64_C(0xc24b8b70d0f89791), UINT64_C(0xc76c51a30654be30),
|
39
|
+
UINT64_C(0xd192e819d6ef5218), UINT64_C(0xd69906245565a910),
|
40
|
+
UINT64_C(0xf40e35855771202a), UINT64_C(0x106aa07032bbd1b8),
|
41
|
+
UINT64_C(0x19a4c116b8d2d0c8), UINT64_C(0x1e376c085141ab53),
|
42
|
+
UINT64_C(0x2748774cdf8eeb99), UINT64_C(0x34b0bcb5e19b48a8),
|
43
|
+
UINT64_C(0x391c0cb3c5c95a63), UINT64_C(0x4ed8aa4ae3418acb),
|
44
|
+
UINT64_C(0x5b9cca4f7763e373), UINT64_C(0x682e6ff3d6b2b8a3),
|
45
|
+
UINT64_C(0x748f82ee5defb2fc), UINT64_C(0x78a5636f43172f60),
|
46
|
+
UINT64_C(0x84c87814a1f0ab72), UINT64_C(0x8cc702081a6439ec),
|
47
|
+
UINT64_C(0x90befffa23631e28), UINT64_C(0xa4506cebde82bde9),
|
48
|
+
UINT64_C(0xbef9a3f7b2c67915), UINT64_C(0xc67178f2e372532b),
|
49
|
+
UINT64_C(0xca273eceea26619c), UINT64_C(0xd186b8c721c0c207),
|
50
|
+
UINT64_C(0xeada7dd6cde0eb1e), UINT64_C(0xf57d4f7fee6ed178),
|
51
|
+
UINT64_C(0x06f067aa72176fba), UINT64_C(0x0a637dc5a2c898a6),
|
52
|
+
UINT64_C(0x113f9804bef90dae), UINT64_C(0x1b710b35131c471b),
|
53
|
+
UINT64_C(0x28db77f523047d84), UINT64_C(0x32caab7b40c72493),
|
54
|
+
UINT64_C(0x3c9ebe0a15c9bebc), UINT64_C(0x431d67c49c100d4c),
|
55
|
+
UINT64_C(0x4cc5d4becb3e42b6), UINT64_C(0x597f299cfc657e2a),
|
56
|
+
UINT64_C(0x5fcb6fab3ad6faec), UINT64_C(0x6c44198c4a475817)
|
57
|
+
};
|
58
|
+
|
59
|
+
/* Various logical functions */
|
60
|
+
|
61
|
+
#define ROR64c(x, y) \
|
62
|
+
( ((((x)&UINT64_C(0xFFFFFFFFFFFFFFFF))>>((uint64_t)(y)&UINT64_C(63))) | \
|
63
|
+
((x)<<((uint64_t)(64-((y)&UINT64_C(63)))))) & UINT64_C(0xFFFFFFFFFFFFFFFF))
|
64
|
+
|
65
|
+
#define STORE64H(x, y) \
|
66
|
+
{ (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
|
67
|
+
(y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
|
68
|
+
(y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
|
69
|
+
(y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
|
70
|
+
|
71
|
+
#define LOAD64H(x, y) \
|
72
|
+
{ x = (((uint64_t)((y)[0] & 255))<<56)|(((uint64_t)((y)[1] & 255))<<48) | \
|
73
|
+
(((uint64_t)((y)[2] & 255))<<40)|(((uint64_t)((y)[3] & 255))<<32) | \
|
74
|
+
(((uint64_t)((y)[4] & 255))<<24)|(((uint64_t)((y)[5] & 255))<<16) | \
|
75
|
+
(((uint64_t)((y)[6] & 255))<<8)|(((uint64_t)((y)[7] & 255))); }
|
76
|
+
|
77
|
+
|
78
|
+
#define Ch(x,y,z) (z ^ (x & (y ^ z)))
|
79
|
+
#define Maj(x,y,z) (((x | y) & z) | (x & y))
|
80
|
+
#define S(x, n) ROR64c(x, n)
|
81
|
+
#define R(x, n) (((x) &UINT64_C(0xFFFFFFFFFFFFFFFF))>>((uint64_t)n))
|
82
|
+
#define Sigma0(x) (S(x, 28) ^ S(x, 34) ^ S(x, 39))
|
83
|
+
#define Sigma1(x) (S(x, 14) ^ S(x, 18) ^ S(x, 41))
|
84
|
+
#define Gamma0(x) (S(x, 1) ^ S(x, 8) ^ R(x, 7))
|
85
|
+
#define Gamma1(x) (S(x, 19) ^ S(x, 61) ^ R(x, 6))
|
86
|
+
#ifndef MIN
|
87
|
+
#define MIN(x, y) ( ((x)<(y))?(x):(y) )
|
88
|
+
#endif
|
89
|
+
|
90
|
+
/* compress 1024-bits */
|
91
|
+
static int sha512_compress(sha512_context *md, unsigned char *buf)
|
92
|
+
{
|
93
|
+
uint64_t S[8], W[80], t0, t1;
|
94
|
+
int i;
|
95
|
+
|
96
|
+
/* copy state into S */
|
97
|
+
for (i = 0; i < 8; i++) {
|
98
|
+
S[i] = md->state[i];
|
99
|
+
}
|
100
|
+
|
101
|
+
/* copy the state into 1024-bits into W[0..15] */
|
102
|
+
for (i = 0; i < 16; i++) {
|
103
|
+
LOAD64H(W[i], buf + (8*i));
|
104
|
+
}
|
105
|
+
|
106
|
+
/* fill W[16..79] */
|
107
|
+
for (i = 16; i < 80; i++) {
|
108
|
+
W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16];
|
109
|
+
}
|
110
|
+
|
111
|
+
/* Compress */
|
112
|
+
#define RND(a,b,c,d,e,f,g,h,i) \
|
113
|
+
t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \
|
114
|
+
t1 = Sigma0(a) + Maj(a, b, c);\
|
115
|
+
d += t0; \
|
116
|
+
h = t0 + t1;
|
117
|
+
|
118
|
+
for (i = 0; i < 80; i += 8) {
|
119
|
+
RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],i+0);
|
120
|
+
RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],i+1);
|
121
|
+
RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],i+2);
|
122
|
+
RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],i+3);
|
123
|
+
RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],i+4);
|
124
|
+
RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],i+5);
|
125
|
+
RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],i+6);
|
126
|
+
RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],i+7);
|
127
|
+
}
|
128
|
+
|
129
|
+
#undef RND
|
130
|
+
|
131
|
+
|
132
|
+
|
133
|
+
/* feedback */
|
134
|
+
for (i = 0; i < 8; i++) {
|
135
|
+
md->state[i] = md->state[i] + S[i];
|
136
|
+
}
|
137
|
+
|
138
|
+
return 0;
|
139
|
+
}
|
140
|
+
|
141
|
+
|
142
|
+
/**
|
143
|
+
Initialize the hash state
|
144
|
+
@param md The hash state you wish to initialize
|
145
|
+
@return 0 if successful
|
146
|
+
*/
|
147
|
+
int sha512_init(sha512_context * md) {
|
148
|
+
if (md == NULL) return 1;
|
149
|
+
|
150
|
+
md->curlen = 0;
|
151
|
+
md->length = 0;
|
152
|
+
md->state[0] = UINT64_C(0x6a09e667f3bcc908);
|
153
|
+
md->state[1] = UINT64_C(0xbb67ae8584caa73b);
|
154
|
+
md->state[2] = UINT64_C(0x3c6ef372fe94f82b);
|
155
|
+
md->state[3] = UINT64_C(0xa54ff53a5f1d36f1);
|
156
|
+
md->state[4] = UINT64_C(0x510e527fade682d1);
|
157
|
+
md->state[5] = UINT64_C(0x9b05688c2b3e6c1f);
|
158
|
+
md->state[6] = UINT64_C(0x1f83d9abfb41bd6b);
|
159
|
+
md->state[7] = UINT64_C(0x5be0cd19137e2179);
|
160
|
+
|
161
|
+
return 0;
|
162
|
+
}
|
163
|
+
|
164
|
+
/**
|
165
|
+
Process a block of memory though the hash
|
166
|
+
@param md The hash state
|
167
|
+
@param in The data to hash
|
168
|
+
@param inlen The length of the data (octets)
|
169
|
+
@return 0 if successful
|
170
|
+
*/
|
171
|
+
int sha512_update (sha512_context * md, const unsigned char *in, size_t inlen)
|
172
|
+
{
|
173
|
+
size_t n;
|
174
|
+
size_t i;
|
175
|
+
int err;
|
176
|
+
if (md == NULL) return 1;
|
177
|
+
if (in == NULL) return 1;
|
178
|
+
if (md->curlen > sizeof(md->buf)) {
|
179
|
+
return 1;
|
180
|
+
}
|
181
|
+
while (inlen > 0) {
|
182
|
+
if (md->curlen == 0 && inlen >= 128) {
|
183
|
+
if ((err = sha512_compress (md, (unsigned char *)in)) != 0) {
|
184
|
+
return err;
|
185
|
+
}
|
186
|
+
md->length += 128 * 8;
|
187
|
+
in += 128;
|
188
|
+
inlen -= 128;
|
189
|
+
} else {
|
190
|
+
n = MIN(inlen, (128 - md->curlen));
|
191
|
+
|
192
|
+
for (i = 0; i < n; i++) {
|
193
|
+
md->buf[i + md->curlen] = in[i];
|
194
|
+
}
|
195
|
+
|
196
|
+
|
197
|
+
md->curlen += n;
|
198
|
+
in += n;
|
199
|
+
inlen -= n;
|
200
|
+
if (md->curlen == 128) {
|
201
|
+
if ((err = sha512_compress (md, md->buf)) != 0) {
|
202
|
+
return err;
|
203
|
+
}
|
204
|
+
md->length += 8*128;
|
205
|
+
md->curlen = 0;
|
206
|
+
}
|
207
|
+
}
|
208
|
+
}
|
209
|
+
return 0;
|
210
|
+
}
|
211
|
+
|
212
|
+
/**
|
213
|
+
Terminate the hash to get the digest
|
214
|
+
@param md The hash state
|
215
|
+
@param out [out] The destination of the hash (64 bytes)
|
216
|
+
@return 0 if successful
|
217
|
+
*/
|
218
|
+
int sha512_final(sha512_context * md, unsigned char *out)
|
219
|
+
{
|
220
|
+
int i;
|
221
|
+
|
222
|
+
if (md == NULL) return 1;
|
223
|
+
if (out == NULL) return 1;
|
224
|
+
|
225
|
+
if (md->curlen >= sizeof(md->buf)) {
|
226
|
+
return 1;
|
227
|
+
}
|
228
|
+
|
229
|
+
/* increase the length of the message */
|
230
|
+
md->length += md->curlen * UINT64_C(8);
|
231
|
+
|
232
|
+
/* append the '1' bit */
|
233
|
+
md->buf[md->curlen++] = (unsigned char)0x80;
|
234
|
+
|
235
|
+
/* if the length is currently above 112 bytes we append zeros
|
236
|
+
* then compress. Then we can fall back to padding zeros and length
|
237
|
+
* encoding like normal.
|
238
|
+
*/
|
239
|
+
if (md->curlen > 112) {
|
240
|
+
while (md->curlen < 128) {
|
241
|
+
md->buf[md->curlen++] = (unsigned char)0;
|
242
|
+
}
|
243
|
+
sha512_compress(md, md->buf);
|
244
|
+
md->curlen = 0;
|
245
|
+
}
|
246
|
+
|
247
|
+
/* pad upto 120 bytes of zeroes
|
248
|
+
* note: that from 112 to 120 is the 64 MSB of the length. We assume that you won't hash
|
249
|
+
* > 2^64 bits of data... :-)
|
250
|
+
*/
|
251
|
+
while (md->curlen < 120) {
|
252
|
+
md->buf[md->curlen++] = (unsigned char)0;
|
253
|
+
}
|
254
|
+
|
255
|
+
/* store length */
|
256
|
+
STORE64H(md->length, md->buf+120);
|
257
|
+
sha512_compress(md, md->buf);
|
258
|
+
|
259
|
+
/* copy output */
|
260
|
+
for (i = 0; i < 8; i++) {
|
261
|
+
STORE64H(md->state[i], out+(8*i));
|
262
|
+
}
|
263
|
+
|
264
|
+
return 0;
|
265
|
+
}
|
266
|
+
|
267
|
+
int sha512(const unsigned char *message, size_t message_len, unsigned char *out)
|
268
|
+
{
|
269
|
+
sha512_context ctx;
|
270
|
+
int ret;
|
271
|
+
if ((ret = sha512_init(&ctx))) return ret;
|
272
|
+
if ((ret = sha512_update(&ctx, message, message_len))) return ret;
|
273
|
+
if ((ret = sha512_final(&ctx, out))) return ret;
|
274
|
+
return 0;
|
275
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#ifndef SHA512_H
|
2
|
+
#define SHA512_H
|
3
|
+
|
4
|
+
#include <stddef.h>
|
5
|
+
|
6
|
+
#include "fixedint.h"
|
7
|
+
|
8
|
+
/* state */
|
9
|
+
typedef struct sha512_context_ {
|
10
|
+
uint64_t length, state[8];
|
11
|
+
size_t curlen;
|
12
|
+
unsigned char buf[128];
|
13
|
+
} sha512_context;
|
14
|
+
|
15
|
+
|
16
|
+
int sha512_init(sha512_context * md);
|
17
|
+
int sha512_final(sha512_context * md, unsigned char *out);
|
18
|
+
int sha512_update(sha512_context * md, const unsigned char *in, size_t inlen);
|
19
|
+
int sha512(const unsigned char *message, size_t message_len, unsigned char *out);
|
20
|
+
|
21
|
+
#endif
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#include "ed25519.h"
|
2
|
+
#include "sha512.h"
|
3
|
+
#include "ge.h"
|
4
|
+
#include "sc.h"
|
5
|
+
|
6
|
+
|
7
|
+
void ed25519_sign(unsigned char *signature, const unsigned char *message, size_t message_len, const unsigned char *public_key, const unsigned char *private_key) {
|
8
|
+
sha512_context hash;
|
9
|
+
unsigned char hram[64];
|
10
|
+
unsigned char r[64];
|
11
|
+
ge_p3 R;
|
12
|
+
|
13
|
+
|
14
|
+
sha512_init(&hash);
|
15
|
+
sha512_update(&hash, private_key + 32, 32);
|
16
|
+
sha512_update(&hash, message, message_len);
|
17
|
+
sha512_final(&hash, r);
|
18
|
+
|
19
|
+
sc_reduce(r);
|
20
|
+
ge_scalarmult_base(&R, r);
|
21
|
+
ge_p3_tobytes(signature, &R);
|
22
|
+
|
23
|
+
sha512_init(&hash);
|
24
|
+
sha512_update(&hash, signature, 32);
|
25
|
+
sha512_update(&hash, public_key, 32);
|
26
|
+
sha512_update(&hash, message, message_len);
|
27
|
+
sha512_final(&hash, hram);
|
28
|
+
|
29
|
+
sc_reduce(hram);
|
30
|
+
sc_muladd(signature + 32, hram, private_key, r);
|
31
|
+
}
|
@@ -0,0 +1,77 @@
|
|
1
|
+
#include "ed25519.h"
|
2
|
+
#include "sha512.h"
|
3
|
+
#include "ge.h"
|
4
|
+
#include "sc.h"
|
5
|
+
|
6
|
+
static int consttime_equal(const unsigned char *x, const unsigned char *y) {
|
7
|
+
unsigned char r = 0;
|
8
|
+
|
9
|
+
r = x[0] ^ y[0];
|
10
|
+
#define F(i) r |= x[i] ^ y[i]
|
11
|
+
F(1);
|
12
|
+
F(2);
|
13
|
+
F(3);
|
14
|
+
F(4);
|
15
|
+
F(5);
|
16
|
+
F(6);
|
17
|
+
F(7);
|
18
|
+
F(8);
|
19
|
+
F(9);
|
20
|
+
F(10);
|
21
|
+
F(11);
|
22
|
+
F(12);
|
23
|
+
F(13);
|
24
|
+
F(14);
|
25
|
+
F(15);
|
26
|
+
F(16);
|
27
|
+
F(17);
|
28
|
+
F(18);
|
29
|
+
F(19);
|
30
|
+
F(20);
|
31
|
+
F(21);
|
32
|
+
F(22);
|
33
|
+
F(23);
|
34
|
+
F(24);
|
35
|
+
F(25);
|
36
|
+
F(26);
|
37
|
+
F(27);
|
38
|
+
F(28);
|
39
|
+
F(29);
|
40
|
+
F(30);
|
41
|
+
F(31);
|
42
|
+
#undef F
|
43
|
+
|
44
|
+
return !r;
|
45
|
+
}
|
46
|
+
|
47
|
+
int ed25519_verify(const unsigned char *signature, const unsigned char *message, size_t message_len, const unsigned char *public_key) {
|
48
|
+
unsigned char h[64];
|
49
|
+
unsigned char checker[32];
|
50
|
+
sha512_context hash;
|
51
|
+
ge_p3 A;
|
52
|
+
ge_p2 R;
|
53
|
+
|
54
|
+
if (signature[63] & 224) {
|
55
|
+
return 0;
|
56
|
+
}
|
57
|
+
|
58
|
+
if (ge_frombytes_negate_vartime(&A, public_key) != 0) {
|
59
|
+
return 0;
|
60
|
+
}
|
61
|
+
|
62
|
+
sha512_init(&hash);
|
63
|
+
sha512_update(&hash, signature, 32);
|
64
|
+
sha512_update(&hash, public_key, 32);
|
65
|
+
sha512_update(&hash, message, message_len);
|
66
|
+
sha512_final(&hash, h);
|
67
|
+
|
68
|
+
sc_reduce(h);
|
69
|
+
ge_double_scalarmult_vartime(&R, h, &A, signature + 32);
|
70
|
+
ge_tobytes(checker, &R);
|
71
|
+
|
72
|
+
if (!consttime_equal(checker, signature)) {
|
73
|
+
return 0;
|
74
|
+
}
|
75
|
+
|
76
|
+
return 1;
|
77
|
+
}
|
@@ -0,0 +1,150 @@
|
|
1
|
+
#include <stdlib.h>
|
2
|
+
#include <stdio.h>
|
3
|
+
#include <string.h>
|
4
|
+
#include <time.h>
|
5
|
+
|
6
|
+
/* #define ED25519_DLL */
|
7
|
+
#include "src/ed25519.h"
|
8
|
+
|
9
|
+
#include "src/ge.h"
|
10
|
+
#include "src/sc.h"
|
11
|
+
|
12
|
+
|
13
|
+
int main() {
|
14
|
+
unsigned char public_key[32], private_key[64], seed[32], scalar[32];
|
15
|
+
unsigned char other_public_key[32], other_private_key[64];
|
16
|
+
unsigned char shared_secret[32], other_shared_secret[32];
|
17
|
+
unsigned char signature[64];
|
18
|
+
|
19
|
+
clock_t start;
|
20
|
+
clock_t end;
|
21
|
+
int i;
|
22
|
+
|
23
|
+
const unsigned char message[] = "Hello, world!";
|
24
|
+
const int message_len = strlen((char*) message);
|
25
|
+
|
26
|
+
/* create a random seed, and a keypair out of that seed */
|
27
|
+
ed25519_create_seed(seed);
|
28
|
+
ed25519_create_keypair(public_key, private_key, seed);
|
29
|
+
|
30
|
+
/* create signature on the message with the keypair */
|
31
|
+
ed25519_sign(signature, message, message_len, public_key, private_key);
|
32
|
+
|
33
|
+
/* verify the signature */
|
34
|
+
if (ed25519_verify(signature, message, message_len, public_key)) {
|
35
|
+
printf("valid signature\n");
|
36
|
+
} else {
|
37
|
+
printf("invalid signature\n");
|
38
|
+
}
|
39
|
+
|
40
|
+
/* create scalar and add it to the keypair */
|
41
|
+
ed25519_create_seed(scalar);
|
42
|
+
ed25519_add_scalar(public_key, private_key, scalar);
|
43
|
+
|
44
|
+
/* create signature with the new keypair */
|
45
|
+
ed25519_sign(signature, message, message_len, public_key, private_key);
|
46
|
+
|
47
|
+
/* verify the signature with the new keypair */
|
48
|
+
if (ed25519_verify(signature, message, message_len, public_key)) {
|
49
|
+
printf("valid signature\n");
|
50
|
+
} else {
|
51
|
+
printf("invalid signature\n");
|
52
|
+
}
|
53
|
+
|
54
|
+
/* make a slight adjustment and verify again */
|
55
|
+
signature[44] ^= 0x10;
|
56
|
+
if (ed25519_verify(signature, message, message_len, public_key)) {
|
57
|
+
printf("did not detect signature change\n");
|
58
|
+
} else {
|
59
|
+
printf("correctly detected signature change\n");
|
60
|
+
}
|
61
|
+
|
62
|
+
/* generate two keypairs for testing key exchange */
|
63
|
+
ed25519_create_seed(seed);
|
64
|
+
ed25519_create_keypair(public_key, private_key, seed);
|
65
|
+
ed25519_create_seed(seed);
|
66
|
+
ed25519_create_keypair(other_public_key, other_private_key, seed);
|
67
|
+
|
68
|
+
/* create two shared secrets - from both perspectives - and check if they're equal */
|
69
|
+
ed25519_key_exchange(shared_secret, other_public_key, private_key);
|
70
|
+
ed25519_key_exchange(other_shared_secret, public_key, other_private_key);
|
71
|
+
|
72
|
+
for (i = 0; i < 32; ++i) {
|
73
|
+
if (shared_secret[i] != other_shared_secret[i]) {
|
74
|
+
printf("key exchange was incorrect\n");
|
75
|
+
break;
|
76
|
+
}
|
77
|
+
}
|
78
|
+
|
79
|
+
if (i == 32) {
|
80
|
+
printf("key exchange was correct\n");
|
81
|
+
}
|
82
|
+
|
83
|
+
/* test performance */
|
84
|
+
printf("testing seed generation performance: ");
|
85
|
+
start = clock();
|
86
|
+
for (i = 0; i < 10000; ++i) {
|
87
|
+
ed25519_create_seed(seed);
|
88
|
+
}
|
89
|
+
end = clock();
|
90
|
+
|
91
|
+
printf("%fus per seed\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000);
|
92
|
+
|
93
|
+
|
94
|
+
printf("testing key generation performance: ");
|
95
|
+
start = clock();
|
96
|
+
for (i = 0; i < 10000; ++i) {
|
97
|
+
ed25519_create_keypair(public_key, private_key, seed);
|
98
|
+
}
|
99
|
+
end = clock();
|
100
|
+
|
101
|
+
printf("%fus per keypair\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000);
|
102
|
+
|
103
|
+
printf("testing sign performance: ");
|
104
|
+
start = clock();
|
105
|
+
for (i = 0; i < 10000; ++i) {
|
106
|
+
ed25519_sign(signature, message, message_len, public_key, private_key);
|
107
|
+
}
|
108
|
+
end = clock();
|
109
|
+
|
110
|
+
printf("%fus per signature\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000);
|
111
|
+
|
112
|
+
printf("testing verify performance: ");
|
113
|
+
start = clock();
|
114
|
+
for (i = 0; i < 10000; ++i) {
|
115
|
+
ed25519_verify(signature, message, message_len, public_key);
|
116
|
+
}
|
117
|
+
end = clock();
|
118
|
+
|
119
|
+
printf("%fus per signature\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000);
|
120
|
+
|
121
|
+
|
122
|
+
printf("testing keypair scalar addition performance: ");
|
123
|
+
start = clock();
|
124
|
+
for (i = 0; i < 10000; ++i) {
|
125
|
+
ed25519_add_scalar(public_key, private_key, scalar);
|
126
|
+
}
|
127
|
+
end = clock();
|
128
|
+
|
129
|
+
printf("%fus per keypair\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000);
|
130
|
+
|
131
|
+
printf("testing public key scalar addition performance: ");
|
132
|
+
start = clock();
|
133
|
+
for (i = 0; i < 10000; ++i) {
|
134
|
+
ed25519_add_scalar(public_key, NULL, scalar);
|
135
|
+
}
|
136
|
+
end = clock();
|
137
|
+
|
138
|
+
printf("%fus per key\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000);
|
139
|
+
|
140
|
+
printf("testing key exchange performance: ");
|
141
|
+
start = clock();
|
142
|
+
for (i = 0; i < 10000; ++i) {
|
143
|
+
ed25519_key_exchange(shared_secret, other_public_key, private_key);
|
144
|
+
}
|
145
|
+
end = clock();
|
146
|
+
|
147
|
+
printf("%fus per shared secret\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000);
|
148
|
+
|
149
|
+
return 0;
|
150
|
+
}
|
File without changes
|
File without changes
|