dualcone 0.0.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +12 -18
- data/README.md +10 -17
- data/ext/dualcone/dualcone.c +45 -5
- data/ext/dualcone/extconf.rb +9 -8
- data/lib/dualcone/version.rb +1 -1
- data/vendor/libhydrogen/LICENSE +1 -1
- data/vendor/libhydrogen/Makefile +1 -1
- data/vendor/libhydrogen/README.md +3 -1
- data/vendor/libhydrogen/hydrogen.c +2 -1
- data/vendor/libhydrogen/hydrogen.h +24 -24
- data/vendor/libhydrogen/impl/common.h +3 -3
- data/vendor/libhydrogen/impl/core.h +2 -4
- data/vendor/libhydrogen/impl/gimli-core/sse2.h +1 -1
- data/vendor/libhydrogen/impl/hash.h +6 -6
- data/vendor/libhydrogen/impl/hydrogen_p.h +12 -12
- data/vendor/libhydrogen/impl/pwhash.h +6 -6
- data/vendor/libhydrogen/impl/random/avr.h +61 -0
- data/vendor/libhydrogen/impl/random/esp32.h +32 -0
- data/vendor/libhydrogen/impl/random/mbed.h +44 -0
- data/vendor/libhydrogen/impl/random/nrf52832.h +41 -0
- data/vendor/libhydrogen/impl/random/particle.h +26 -0
- data/vendor/libhydrogen/impl/random/riot.h +10 -0
- data/vendor/libhydrogen/impl/random/rtthread.h +37 -0
- data/vendor/libhydrogen/impl/random/stm32.h +47 -0
- data/vendor/libhydrogen/impl/random/unix.h +85 -0
- data/vendor/libhydrogen/impl/random/wasi.h +12 -0
- data/vendor/libhydrogen/impl/random/windows.h +20 -0
- data/vendor/libhydrogen/impl/random.h +19 -337
- data/vendor/libhydrogen/impl/secretbox.h +1 -1
- data/vendor/libhydrogen/impl/sign.h +2 -2
- data/vendor/libhydrogen/impl/x25519.h +22 -20
- metadata +46 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1564ad34458b134926891c68315f545012a27caa1b32ede501914e8bbbc3399f
|
4
|
+
data.tar.gz: c6ec5c47094d1aad2b4e1c6395fa98032e190bcda498dc1c8018065ce65a3d59
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8c3774ca0f84a1d9863b907d361b7b1c5c13f6e60c31b42748af0096141d72a66256ddfeb77924ba01bad6e3fa76402d4083fc72492ee86d618f8de90c24158
|
7
|
+
data.tar.gz: a9d39de78eba10857b0a457f5dec3a61dfc73d3c07051bafc27ffd0c6e4c9402d35cb475e1ed5486da619af347717ca1b6aa283399db363466bc12860d6964e1
|
data/LICENSE.txt
CHANGED
@@ -1,21 +1,15 @@
|
|
1
|
-
|
1
|
+
ISC License
|
2
2
|
|
3
3
|
Copyright (c) 2020 Tom Richards
|
4
4
|
|
5
|
-
Permission
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
-
THE SOFTWARE.
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
6
|
+
purpose with or without fee is hereby granted, provided that the above
|
7
|
+
copyright notice and this permission notice appear in all copies.
|
8
|
+
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
10
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
11
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
12
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
13
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
14
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
15
|
+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Dualcone
|
2
2
|
|
3
|
-
|
3
|
+

|
4
4
|
|
5
5
|
Dualcone is a Ruby source code protection system. Dualcone uses symmetric encryption to protect your source code.
|
6
6
|
|
@@ -8,20 +8,6 @@ Dualcone is a self-contained gem. It brings along its own copy of the lightweigh
|
|
8
8
|
|
9
9
|
Dualcone supports GNU + Linux and other Unix-like operating systems. Windows is not supported.
|
10
10
|
|
11
|
-
## Roadmap
|
12
|
-
|
13
|
-
### Part 1
|
14
|
-
- [x] Key generation: `Dualcone.generate_key`
|
15
|
-
- [x] Encrypted code running: `Dualcone.run(code)`
|
16
|
-
- [x] Encrypted code generation: `Dualcone.encrypt(path)`
|
17
|
-
- [x] Specs passing
|
18
|
-
|
19
|
-
### Part 2
|
20
|
-
- [x] Runnable trivial ruby script
|
21
|
-
- [ ] Runnable non-trivial ruby script
|
22
|
-
- [ ] Runnable sinatra app
|
23
|
-
- [ ] Runnable rails app
|
24
|
-
|
25
11
|
## Installation
|
26
12
|
|
27
13
|
Add this gem to your application's Gemfile:
|
@@ -103,14 +89,21 @@ You can also run `bin/console` for an interactive prompt that will allow you to
|
|
103
89
|
|
104
90
|
To install this gem onto your local machine, run `bin/rake install`. To release a new version, update the version number in `version.rb`, and then run `bin/rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org][rubygems].
|
105
91
|
|
92
|
+
## Roadmap
|
93
|
+
|
94
|
+
- [x] Runnable trivial ruby script
|
95
|
+
- [ ] Runnable non-trivial ruby script
|
96
|
+
- [ ] Runnable sinatra app
|
97
|
+
- [ ] Runnable rails app
|
98
|
+
|
106
99
|
## Contributing
|
107
100
|
|
108
101
|
Bug reports and pull requests are welcome on GitHub at https://github.com/t-richards/dualcone.
|
109
102
|
|
110
103
|
## License
|
111
104
|
|
112
|
-
The gem is available as open source under the terms of the [
|
105
|
+
The gem is available as open source under the terms of the [ISC License][isc-license].
|
113
106
|
|
114
107
|
[libhydrogen]: https://github.com/jedisct1/libhydrogen
|
115
|
-
[
|
108
|
+
[isc-license]: LICENSE.txt
|
116
109
|
[rubygems]: https://rubygems.org
|
data/ext/dualcone/dualcone.c
CHANGED
@@ -2,7 +2,8 @@
|
|
2
2
|
|
3
3
|
VALUE rb_mDualcone;
|
4
4
|
|
5
|
-
void
|
5
|
+
static void
|
6
|
+
rb_dualcone_cleanup(DualconeContext *ctx) {
|
6
7
|
if (ctx->input_path != NULL) {
|
7
8
|
free(ctx->input_path);
|
8
9
|
}
|
@@ -31,7 +32,8 @@ void rb_dualcone_cleanup(DualconeContext *ctx) {
|
|
31
32
|
hydro_memzero(ctx, sizeof(DualconeContext));
|
32
33
|
}
|
33
34
|
|
34
|
-
void
|
35
|
+
static void
|
36
|
+
rb_dualcone_get_key(DualconeContext *ctx) {
|
35
37
|
int result = 0;
|
36
38
|
int errno_sv = 0;
|
37
39
|
|
@@ -51,7 +53,22 @@ void rb_dualcone_get_key(DualconeContext *ctx) {
|
|
51
53
|
}
|
52
54
|
}
|
53
55
|
|
54
|
-
|
56
|
+
/*
|
57
|
+
* call-seq:
|
58
|
+
* Dualcone.run(code) -> nil
|
59
|
+
*
|
60
|
+
* Executes the encrypted +code+.
|
61
|
+
*
|
62
|
+
* If successful, this method returns nil.
|
63
|
+
* Otherwise, it raises a fatal error.
|
64
|
+
*
|
65
|
+
* ENV['DUALCONE_HEX_KEY'] = '7240adfda679de86902864bc4e05864fda6e06cd24256885e0cda1ac02d03dd8'
|
66
|
+
* Dualcone.run('d4d745de7437d7d66fb78b5d16b41de0eb716d26b282226e3e3d5b826f4704cc0e19d1fee990d059c198')
|
67
|
+
* "a"
|
68
|
+
* => nil
|
69
|
+
*/
|
70
|
+
static VALUE
|
71
|
+
rb_dualcone_run(VALUE _self, VALUE code) {
|
55
72
|
int result = 0;
|
56
73
|
int errno_sv = 0;
|
57
74
|
|
@@ -117,7 +134,17 @@ VALUE rb_dualcone_run(VALUE _self, VALUE code) {
|
|
117
134
|
return Qnil;
|
118
135
|
}
|
119
136
|
|
120
|
-
|
137
|
+
/*
|
138
|
+
* call-seq:
|
139
|
+
* Dualcone.generate_key -> string
|
140
|
+
*
|
141
|
+
* Returns a new secret encryption key in hex-encoded format.
|
142
|
+
*
|
143
|
+
* Dualcone.generate_key
|
144
|
+
* => "7240adfda679de86902864bc4e05864fda6e06cd24256885e0cda1ac02d03dd8"
|
145
|
+
*/
|
146
|
+
static VALUE
|
147
|
+
rb_dualcone_generate_key(VALUE _self) {
|
121
148
|
uint8_t key[hydro_secretbox_KEYBYTES];
|
122
149
|
char hex[hydro_secretbox_KEYBYTES * 2 + 1];
|
123
150
|
|
@@ -131,7 +158,20 @@ VALUE rb_dualcone_generate_key(VALUE _self) {
|
|
131
158
|
return rb_str_new_cstr(hex);
|
132
159
|
}
|
133
160
|
|
134
|
-
|
161
|
+
/*
|
162
|
+
* call-seq:
|
163
|
+
* Dualcone.encrypt(path) -> nil
|
164
|
+
*
|
165
|
+
* Encrypts (and overwrites!) the Ruby code file specified by +path+.
|
166
|
+
*
|
167
|
+
* If successful, this method returns nil.
|
168
|
+
* Otherwise, it raises a fatal error.
|
169
|
+
*
|
170
|
+
* Dualcone.encrypt('hello.rb')
|
171
|
+
* => nil
|
172
|
+
*/
|
173
|
+
static VALUE
|
174
|
+
rb_dualcone_encrypt(VALUE _self, VALUE path) {
|
135
175
|
int result = 0;
|
136
176
|
int errno_sv = 0;
|
137
177
|
|
data/ext/dualcone/extconf.rb
CHANGED
@@ -2,33 +2,34 @@
|
|
2
2
|
|
3
3
|
require 'mkmf'
|
4
4
|
|
5
|
+
# :stopdoc:
|
6
|
+
|
5
7
|
cflags = %w[
|
6
|
-
-march=native -
|
7
|
-
-fstack-protector-strong -fPIC
|
8
|
-
-Wno-missing-braces
|
8
|
+
-march=native -mtune=generic -pipe -fno-plt
|
9
|
+
-fstack-protector-strong -fPIC
|
9
10
|
]
|
10
11
|
|
11
12
|
if ENV['DEBUG']
|
12
13
|
cflags.unshift('-O0', '-g')
|
13
14
|
else
|
14
|
-
cflags.unshift('-
|
15
|
+
cflags.unshift('-O2')
|
15
16
|
end
|
16
17
|
|
17
|
-
|
18
|
+
libhydrogen_dir = File.join(__dir__, '..', '..', 'vendor', 'libhydrogen')
|
18
19
|
|
19
20
|
abort 'ERROR: make is required to build libhydrogen.' unless find_executable('make')
|
20
21
|
|
21
22
|
append_cflags(cflags)
|
22
23
|
|
23
24
|
# Build the bundled version of libhydrogen in vendor
|
24
|
-
Dir.chdir(
|
25
|
+
Dir.chdir(libhydrogen_dir) do
|
25
26
|
system('make clean')
|
26
27
|
system("export CFLAGS='#{cflags.join(' ')}'; make")
|
27
28
|
system('PREFIX=. make install')
|
28
29
|
|
29
30
|
# Ensure that our bundled version of libhydrogen is always used
|
30
|
-
$DEFLIBPATH.unshift("#{
|
31
|
-
dir_config('hydrogen', "#{
|
31
|
+
$DEFLIBPATH.unshift("#{libhydrogen_dir}/lib")
|
32
|
+
dir_config('hydrogen', "#{libhydrogen_dir}/include", "#{libhydrogen_dir}/lib")
|
32
33
|
end
|
33
34
|
|
34
35
|
abort 'ERROR: Failed to build libhydrogen.' unless have_library('hydrogen') && have_header('hydrogen.h')
|
data/lib/dualcone/version.rb
CHANGED
data/vendor/libhydrogen/LICENSE
CHANGED
data/vendor/libhydrogen/Makefile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
PREFIX ?= /usr/local
|
2
2
|
WFLAGS ?= -Wall -Wextra -Wmissing-prototypes -Wdiv-by-zero -Wbad-function-cast -Wcast-align -Wcast-qual -Wfloat-equal -Wmissing-declarations -Wnested-externs -Wno-unknown-pragmas -Wpointer-arith -Wredundant-decls -Wstrict-prototypes -Wswitch-enum -Wno-type-limits
|
3
|
-
CFLAGS ?= -Os -
|
3
|
+
CFLAGS ?= -Os -mcpu=native -fno-exceptions $(WFLAGS)
|
4
4
|
CFLAGS += -I.
|
5
5
|
OBJ = hydrogen.o
|
6
6
|
AR ?= ar
|
@@ -1,5 +1,7 @@
|
|
1
|
-
[](https://travis-ci.org/jedisct1/libhydrogen?branch=master)
|
2
|
+

|
2
3
|
[](https://opencollective.com/libhydrogen) [](https://scan.coverity.com/projects/13315)
|
4
|
+
[](https://ci.trust-in-soft.com/projects/jedisct1/libhydrogen)
|
3
5
|
|
4
6
|

|
5
7
|
==============
|
@@ -17,12 +17,12 @@ extern "C" {
|
|
17
17
|
#else
|
18
18
|
#define _hydro_attr_(X)
|
19
19
|
#endif
|
20
|
-
#define _hydro_attr_deprecated_
|
21
|
-
#define _hydro_attr_malloc_
|
22
|
-
#define _hydro_attr_noinline_
|
23
|
-
#define _hydro_attr_noreturn_
|
20
|
+
#define _hydro_attr_deprecated_ _hydro_attr_((deprecated))
|
21
|
+
#define _hydro_attr_malloc_ _hydro_attr_((malloc))
|
22
|
+
#define _hydro_attr_noinline_ _hydro_attr_((noinline))
|
23
|
+
#define _hydro_attr_noreturn_ _hydro_attr_((noreturn))
|
24
24
|
#define _hydro_attr_warn_unused_result_ _hydro_attr_((warn_unused_result))
|
25
|
-
#define _hydro_attr_weak_
|
25
|
+
#define _hydro_attr_weak_ _hydro_attr_((weak))
|
26
26
|
|
27
27
|
#if defined(__INTEL_COMPILER) || defined(_MSC_VER)
|
28
28
|
#define _hydro_attr_aligned_(X) __declspec(align(X))
|
@@ -56,11 +56,11 @@ void hydro_random_reseed(void);
|
|
56
56
|
|
57
57
|
/* ---------------- */
|
58
58
|
|
59
|
-
#define hydro_hash_BYTES
|
60
|
-
#define hydro_hash_BYTES_MAX
|
61
|
-
#define hydro_hash_BYTES_MIN
|
59
|
+
#define hydro_hash_BYTES 32
|
60
|
+
#define hydro_hash_BYTES_MAX 65535
|
61
|
+
#define hydro_hash_BYTES_MIN 16
|
62
62
|
#define hydro_hash_CONTEXTBYTES 8
|
63
|
-
#define hydro_hash_KEYBYTES
|
63
|
+
#define hydro_hash_KEYBYTES 32
|
64
64
|
|
65
65
|
typedef struct hydro_hash_state {
|
66
66
|
uint32_t state[12];
|
@@ -84,9 +84,9 @@ int hydro_hash_hash(uint8_t *out, size_t out_len, const void *in_, size_t in_len
|
|
84
84
|
/* ---------------- */
|
85
85
|
|
86
86
|
#define hydro_secretbox_CONTEXTBYTES 8
|
87
|
-
#define hydro_secretbox_HEADERBYTES
|
88
|
-
#define hydro_secretbox_KEYBYTES
|
89
|
-
#define hydro_secretbox_PROBEBYTES
|
87
|
+
#define hydro_secretbox_HEADERBYTES (20 + 16)
|
88
|
+
#define hydro_secretbox_KEYBYTES 32
|
89
|
+
#define hydro_secretbox_PROBEBYTES 16
|
90
90
|
|
91
91
|
void hydro_secretbox_keygen(uint8_t key[hydro_secretbox_KEYBYTES]);
|
92
92
|
|
@@ -111,9 +111,9 @@ int hydro_secretbox_probe_verify(const uint8_t probe[hydro_secretbox_PROBEBYTES]
|
|
111
111
|
/* ---------------- */
|
112
112
|
|
113
113
|
#define hydro_kdf_CONTEXTBYTES 8
|
114
|
-
#define hydro_kdf_KEYBYTES
|
115
|
-
#define hydro_kdf_BYTES_MAX
|
116
|
-
#define hydro_kdf_BYTES_MIN
|
114
|
+
#define hydro_kdf_KEYBYTES 32
|
115
|
+
#define hydro_kdf_BYTES_MAX 65535
|
116
|
+
#define hydro_kdf_BYTES_MIN 16
|
117
117
|
|
118
118
|
void hydro_kdf_keygen(uint8_t key[hydro_kdf_KEYBYTES]);
|
119
119
|
|
@@ -123,11 +123,11 @@ int hydro_kdf_derive_from_key(uint8_t *subkey, size_t subkey_len, uint64_t subke
|
|
123
123
|
|
124
124
|
/* ---------------- */
|
125
125
|
|
126
|
-
#define hydro_sign_BYTES
|
127
|
-
#define hydro_sign_CONTEXTBYTES
|
126
|
+
#define hydro_sign_BYTES 64
|
127
|
+
#define hydro_sign_CONTEXTBYTES 8
|
128
128
|
#define hydro_sign_PUBLICKEYBYTES 32
|
129
129
|
#define hydro_sign_SECRETKEYBYTES 64
|
130
|
-
#define hydro_sign_SEEDBYTES
|
130
|
+
#define hydro_sign_SEEDBYTES 32
|
131
131
|
|
132
132
|
typedef struct hydro_sign_state {
|
133
133
|
hydro_hash_state hash_st;
|
@@ -165,10 +165,10 @@ int hydro_sign_verify(const uint8_t csig[hydro_sign_BYTES], const void *m_, size
|
|
165
165
|
/* ---------------- */
|
166
166
|
|
167
167
|
#define hydro_kx_SESSIONKEYBYTES 32
|
168
|
-
#define hydro_kx_PUBLICKEYBYTES
|
169
|
-
#define hydro_kx_SECRETKEYBYTES
|
170
|
-
#define hydro_kx_PSKBYTES
|
171
|
-
#define hydro_kx_SEEDBYTES
|
168
|
+
#define hydro_kx_PUBLICKEYBYTES 32
|
169
|
+
#define hydro_kx_SECRETKEYBYTES 32
|
170
|
+
#define hydro_kx_PSKBYTES 32
|
171
|
+
#define hydro_kx_SEEDBYTES 32
|
172
172
|
|
173
173
|
typedef struct hydro_kx_keypair {
|
174
174
|
uint8_t pk[hydro_kx_PUBLICKEYBYTES];
|
@@ -261,9 +261,9 @@ int hydro_kx_nk_3(hydro_kx_state *state, hydro_kx_session_keypair *kp,
|
|
261
261
|
|
262
262
|
/* ---------------- */
|
263
263
|
|
264
|
-
#define hydro_pwhash_CONTEXTBYTES
|
264
|
+
#define hydro_pwhash_CONTEXTBYTES 8
|
265
265
|
#define hydro_pwhash_MASTERKEYBYTES 32
|
266
|
-
#define hydro_pwhash_STOREDBYTES
|
266
|
+
#define hydro_pwhash_STOREDBYTES 128
|
267
267
|
|
268
268
|
void hydro_pwhash_keygen(uint8_t master_key[hydro_pwhash_MASTERKEYBYTES]);
|
269
269
|
|
@@ -93,7 +93,7 @@ store64_le(uint8_t dst[8], uint64_t w)
|
|
93
93
|
w >>= 8;
|
94
94
|
dst[6] = (uint8_t) w;
|
95
95
|
w >>= 8;
|
96
|
-
dst[7]
|
96
|
+
dst[7] = (uint8_t) w;
|
97
97
|
#endif
|
98
98
|
}
|
99
99
|
|
@@ -127,7 +127,7 @@ store32_le(uint8_t dst[4], uint32_t w)
|
|
127
127
|
w >>= 8;
|
128
128
|
dst[2] = (uint8_t) w;
|
129
129
|
w >>= 8;
|
130
|
-
dst[3]
|
130
|
+
dst[3] = (uint8_t) w;
|
131
131
|
#endif
|
132
132
|
}
|
133
133
|
|
@@ -203,7 +203,7 @@ store64_be(uint8_t dst[8], uint64_t w)
|
|
203
203
|
w >>= 8;
|
204
204
|
dst[1] = (uint8_t) w;
|
205
205
|
w >>= 8;
|
206
|
-
dst[0]
|
206
|
+
dst[0] = (uint8_t) w;
|
207
207
|
#endif
|
208
208
|
}
|
209
209
|
|
@@ -1,9 +1,7 @@
|
|
1
1
|
int
|
2
2
|
hydro_init(void)
|
3
3
|
{
|
4
|
-
|
5
|
-
abort();
|
6
|
-
}
|
4
|
+
hydro_random_ensure_initialized();
|
7
5
|
return 0;
|
8
6
|
}
|
9
7
|
|
@@ -88,7 +86,7 @@ hydro_hex2bin(uint8_t *bin, size_t bin_maxlen, const char *hex, size_t hex_len,
|
|
88
86
|
}
|
89
87
|
break;
|
90
88
|
}
|
91
|
-
c_val = (uint8_t)((c_num0 & c_num) | (c_alpha0 & c_alpha));
|
89
|
+
c_val = (uint8_t) ((c_num0 & c_num) | (c_alpha0 & c_alpha));
|
92
90
|
if (bin_pos >= bin_maxlen) {
|
93
91
|
ret = -1;
|
94
92
|
errno = ERANGE;
|
@@ -40,7 +40,7 @@ rotate24(__m128i x)
|
|
40
40
|
}
|
41
41
|
#endif
|
42
42
|
|
43
|
-
static const uint32_t coeffs[24]
|
43
|
+
static const uint32_t _hydro_attr_aligned_(16) coeffs[24] = {
|
44
44
|
0x9e377904, 0, 0, 0, 0x9e377908, 0, 0, 0, 0x9e37790c, 0, 0, 0,
|
45
45
|
0x9e377910, 0, 0, 0, 0x9e377914, 0, 0, 0, 0x9e377918, 0, 0, 0,
|
46
46
|
};
|
@@ -43,10 +43,10 @@ hydro_hash_init(hydro_hash_state *state, const char ctx[hydro_hash_CONTEXTBYTES]
|
|
43
43
|
if (key != NULL) {
|
44
44
|
block[gimli_RATE] = (uint8_t) hydro_hash_KEYBYTES;
|
45
45
|
memcpy(block + gimli_RATE + 1, key, hydro_hash_KEYBYTES);
|
46
|
-
p = (gimli_RATE + 1 + hydro_hash_KEYBYTES + (gimli_RATE - 1)) & ~(size_t)(gimli_RATE - 1);
|
46
|
+
p = (gimli_RATE + 1 + hydro_hash_KEYBYTES + (gimli_RATE - 1)) & ~(size_t) (gimli_RATE - 1);
|
47
47
|
} else {
|
48
48
|
block[gimli_RATE] = (uint8_t) 0;
|
49
|
-
p
|
49
|
+
p = (gimli_RATE + 1 + 0 + (gimli_RATE - 1)) & ~(size_t) (gimli_RATE - 1);
|
50
50
|
}
|
51
51
|
mem_zero(state, sizeof *state);
|
52
52
|
hydro_hash_update(state, block, p);
|
@@ -71,10 +71,10 @@ hydro_hash_init_with_tweak(hydro_hash_state *state, const char ctx[hydro_hash_CO
|
|
71
71
|
if (key != NULL) {
|
72
72
|
block[gimli_RATE] = (uint8_t) hydro_hash_KEYBYTES;
|
73
73
|
memcpy(block + gimli_RATE + 1, key, hydro_hash_KEYBYTES);
|
74
|
-
p = (gimli_RATE + 1 + hydro_hash_KEYBYTES + (gimli_RATE - 1)) & ~(size_t)(gimli_RATE - 1);
|
74
|
+
p = (gimli_RATE + 1 + hydro_hash_KEYBYTES + (gimli_RATE - 1)) & ~(size_t) (gimli_RATE - 1);
|
75
75
|
} else {
|
76
76
|
block[gimli_RATE] = (uint8_t) 0;
|
77
|
-
p
|
77
|
+
p = (gimli_RATE + 1 + 0 + (gimli_RATE - 1)) & ~(size_t) (gimli_RATE - 1);
|
78
78
|
}
|
79
79
|
block[p] = (uint8_t) sizeof tweak;
|
80
80
|
STORE64_LE(&block[p + 1], tweak);
|
@@ -99,9 +99,9 @@ hydro_hash_final(hydro_hash_state *state, uint8_t *out, size_t out_len)
|
|
99
99
|
}
|
100
100
|
COMPILER_ASSERT(hydro_hash_BYTES_MAX <= 0xffff);
|
101
101
|
lc[1] = (uint8_t) out_len;
|
102
|
-
lc[2] = (uint8_t)(out_len >> 8);
|
102
|
+
lc[2] = (uint8_t) (out_len >> 8);
|
103
103
|
lc[3] = 0;
|
104
|
-
lc_len = (size_t)(1 + (lc[2] != 0));
|
104
|
+
lc_len = (size_t) (1 + (lc[2] != 0));
|
105
105
|
lc[0] = (uint8_t) lc_len;
|
106
106
|
hydro_hash_update(state, lc, 1 + lc_len + 1);
|
107
107
|
gimli_pad_u8(buf, state->buf_off, gimli_DOMAIN_XOF);
|
@@ -3,18 +3,18 @@ static int hydro_random_init(void);
|
|
3
3
|
/* ---------------- */
|
4
4
|
|
5
5
|
#define gimli_BLOCKBYTES 48
|
6
|
-
#define gimli_CAPACITY
|
7
|
-
#define gimli_RATE
|
6
|
+
#define gimli_CAPACITY 32
|
7
|
+
#define gimli_RATE 16
|
8
8
|
|
9
|
-
#define gimli_TAG_HEADER
|
9
|
+
#define gimli_TAG_HEADER 0x01
|
10
10
|
#define gimli_TAG_PAYLOAD 0x02
|
11
|
-
#define gimli_TAG_FINAL
|
12
|
-
#define gimli_TAG_FINAL0
|
13
|
-
#define gimli_TAG_KEY0
|
14
|
-
#define gimli_TAG_KEY
|
11
|
+
#define gimli_TAG_FINAL 0x08
|
12
|
+
#define gimli_TAG_FINAL0 0xf8
|
13
|
+
#define gimli_TAG_KEY0 0xfe
|
14
|
+
#define gimli_TAG_KEY 0xff
|
15
15
|
|
16
16
|
#define gimli_DOMAIN_AEAD 0x0
|
17
|
-
#define gimli_DOMAIN_XOF
|
17
|
+
#define gimli_DOMAIN_XOF 0xf
|
18
18
|
|
19
19
|
static void gimli_core_u8(uint8_t state_u8[gimli_BLOCKBYTES], uint8_t tag);
|
20
20
|
|
@@ -28,7 +28,7 @@ gimli_pad_u8(uint8_t buf[gimli_BLOCKBYTES], size_t pos, uint8_t domain)
|
|
28
28
|
static inline void
|
29
29
|
hydro_mem_ct_zero_u32(uint32_t *dst_, size_t n)
|
30
30
|
{
|
31
|
-
volatile uint32_t *volatile dst = (volatile uint32_t *
|
31
|
+
volatile uint32_t *volatile dst = (volatile uint32_t *volatile) (void *) dst_;
|
32
32
|
size_t i;
|
33
33
|
|
34
34
|
for (i = 0; i < n; i++) {
|
@@ -42,7 +42,7 @@ static inline uint32_t hydro_mem_ct_cmp_u32(const uint32_t *b1_, const uint32_t
|
|
42
42
|
static inline uint32_t
|
43
43
|
hydro_mem_ct_cmp_u32(const uint32_t *b1_, const uint32_t *b2, size_t n)
|
44
44
|
{
|
45
|
-
const volatile uint32_t *volatile b1 = (const volatile uint32_t *volatile)(const void *) b1_;
|
45
|
+
const volatile uint32_t *volatile b1 = (const volatile uint32_t *volatile) (const void *) b1_;
|
46
46
|
size_t i;
|
47
47
|
uint32_t cv = 0;
|
48
48
|
|
@@ -61,11 +61,11 @@ static int hydro_hash_init_with_tweak(hydro_hash_state *state,
|
|
61
61
|
/* ---------------- */
|
62
62
|
|
63
63
|
#define hydro_secretbox_NONCEBYTES 20
|
64
|
-
#define hydro_secretbox_MACBYTES
|
64
|
+
#define hydro_secretbox_MACBYTES 16
|
65
65
|
|
66
66
|
/* ---------------- */
|
67
67
|
|
68
|
-
#define hydro_x25519_BYTES
|
68
|
+
#define hydro_x25519_BYTES 32
|
69
69
|
#define hydro_x25519_PUBLICKEYBYTES 32
|
70
70
|
#define hydro_x25519_SECRETKEYBYTES 32
|
71
71
|
|
@@ -1,16 +1,16 @@
|
|
1
|
-
#define hydro_pwhash_ENC_ALGBYTES
|
1
|
+
#define hydro_pwhash_ENC_ALGBYTES 1
|
2
2
|
#define hydro_pwhash_HASH_ALGBYTES 1
|
3
|
-
#define hydro_pwhash_THREADSBYTES
|
3
|
+
#define hydro_pwhash_THREADSBYTES 1
|
4
4
|
#define hydro_pwhash_OPSLIMITBYTES 8
|
5
5
|
#define hydro_pwhash_MEMLIMITBYTES 8
|
6
|
-
#define hydro_pwhash_HASHBYTES
|
7
|
-
#define hydro_pwhash_SALTBYTES
|
6
|
+
#define hydro_pwhash_HASHBYTES 32
|
7
|
+
#define hydro_pwhash_SALTBYTES 16
|
8
8
|
#define hydro_pwhash_PARAMSBYTES \
|
9
9
|
(hydro_pwhash_HASH_ALGBYTES + hydro_pwhash_THREADSBYTES + hydro_pwhash_OPSLIMITBYTES + \
|
10
10
|
hydro_pwhash_MEMLIMITBYTES + hydro_pwhash_SALTBYTES + hydro_pwhash_HASHBYTES)
|
11
|
-
#define hydro_pwhash_ENC_ALG
|
11
|
+
#define hydro_pwhash_ENC_ALG 0x01
|
12
12
|
#define hydro_pwhash_HASH_ALG 0x01
|
13
|
-
#define hydro_pwhash_CONTEXT
|
13
|
+
#define hydro_pwhash_CONTEXT "hydro_pw"
|
14
14
|
|
15
15
|
static int
|
16
16
|
_hydro_pwhash_hash(uint8_t out[hydro_random_SEEDBYTES], size_t h_len,
|
@@ -0,0 +1,61 @@
|
|
1
|
+
#include <Arduino.h>
|
2
|
+
|
3
|
+
static bool
|
4
|
+
hydro_random_rbit(uint16_t x)
|
5
|
+
{
|
6
|
+
uint8_t x8;
|
7
|
+
|
8
|
+
x8 = ((uint8_t) (x >> 8)) ^ (uint8_t) x;
|
9
|
+
x8 = (x8 >> 4) ^ (x8 & 0xf);
|
10
|
+
x8 = (x8 >> 2) ^ (x8 & 0x3);
|
11
|
+
x8 = (x8 >> 1) ^ x8;
|
12
|
+
|
13
|
+
return (bool) (x8 & 1);
|
14
|
+
}
|
15
|
+
|
16
|
+
static int
|
17
|
+
hydro_random_init(void)
|
18
|
+
{
|
19
|
+
const char ctx[hydro_hash_CONTEXTBYTES] = { 'h', 'y', 'd', 'r', 'o', 'P', 'R', 'G' };
|
20
|
+
hydro_hash_state st;
|
21
|
+
uint16_t ebits = 0;
|
22
|
+
uint16_t tc;
|
23
|
+
bool a, b;
|
24
|
+
|
25
|
+
cli();
|
26
|
+
MCUSR = 0;
|
27
|
+
WDTCSR |= _BV(WDCE) | _BV(WDE);
|
28
|
+
WDTCSR = _BV(WDIE);
|
29
|
+
sei();
|
30
|
+
|
31
|
+
hydro_hash_init(&st, ctx, NULL);
|
32
|
+
|
33
|
+
while (ebits < 256) {
|
34
|
+
delay(1);
|
35
|
+
tc = TCNT1;
|
36
|
+
hydro_hash_update(&st, (const uint8_t *) &tc, sizeof tc);
|
37
|
+
a = hydro_random_rbit(tc);
|
38
|
+
delay(1);
|
39
|
+
tc = TCNT1;
|
40
|
+
b = hydro_random_rbit(tc);
|
41
|
+
hydro_hash_update(&st, (const uint8_t *) &tc, sizeof tc);
|
42
|
+
if (a == b) {
|
43
|
+
continue;
|
44
|
+
}
|
45
|
+
hydro_hash_update(&st, (const uint8_t *) &b, sizeof b);
|
46
|
+
ebits++;
|
47
|
+
}
|
48
|
+
|
49
|
+
cli();
|
50
|
+
MCUSR = 0;
|
51
|
+
WDTCSR |= _BV(WDCE) | _BV(WDE);
|
52
|
+
WDTCSR = 0;
|
53
|
+
sei();
|
54
|
+
|
55
|
+
hydro_hash_final(&st, hydro_random_context.state, sizeof hydro_random_context.state);
|
56
|
+
hydro_random_context.counter = ~LOAD64_LE(hydro_random_context.state);
|
57
|
+
|
58
|
+
return 0;
|
59
|
+
}
|
60
|
+
|
61
|
+
ISR(WDT_vect) { }
|
@@ -0,0 +1,32 @@
|
|
1
|
+
// Important: RF *must* be activated on ESP board
|
2
|
+
// https://techtutorialsx.com/2017/12/22/esp32-arduino-random-number-generation/
|
3
|
+
#ifdef ESP32
|
4
|
+
#include <esp_system.h>
|
5
|
+
#endif
|
6
|
+
|
7
|
+
#ifdef ARDUINO
|
8
|
+
#include <Arduino.h>
|
9
|
+
#endif
|
10
|
+
|
11
|
+
static int
|
12
|
+
hydro_random_init(void)
|
13
|
+
{
|
14
|
+
const char ctx[hydro_hash_CONTEXTBYTES] = { 'h', 'y', 'd', 'r', 'o', 'P', 'R', 'G' };
|
15
|
+
hydro_hash_state st;
|
16
|
+
uint16_t ebits = 0;
|
17
|
+
|
18
|
+
hydro_hash_init(&st, ctx, NULL);
|
19
|
+
|
20
|
+
while (ebits < 256) {
|
21
|
+
uint32_t r = esp_random();
|
22
|
+
|
23
|
+
delay(10);
|
24
|
+
hydro_hash_update(&st, (const uint32_t *) &r, sizeof r);
|
25
|
+
ebits += 32;
|
26
|
+
}
|
27
|
+
|
28
|
+
hydro_hash_final(&st, hydro_random_context.state, sizeof hydro_random_context.state);
|
29
|
+
hydro_random_context.counter = ~LOAD64_LE(hydro_random_context.state);
|
30
|
+
|
31
|
+
return 0;
|
32
|
+
}
|