rbnacl-libsodium 1.0.15.1 → 1.0.16
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/.travis.yml +4 -6
- data/CHANGES.md +50 -42
- data/Gemfile +1 -1
- data/README.md +3 -1
- data/Rakefile +46 -0
- data/ext/rbnacl/extconf.rb +16 -1
- data/lib/rbnacl/libsodium.rb +16 -8
- data/lib/rbnacl/libsodium/version.rb +1 -1
- data/rbnacl-libsodium.gemspec +3 -0
- data/vendor/libsodium/AUTHORS +20 -5
- data/vendor/libsodium/ChangeLog +25 -0
- data/vendor/libsodium/Makefile.in +3 -1
- data/vendor/libsodium/README.markdown +2 -1
- data/vendor/libsodium/aclocal.m4 +1 -0
- data/vendor/libsodium/autom4te.cache/output.1 +836 -123
- data/vendor/libsodium/autom4te.cache/output.4 +21342 -0
- data/vendor/libsodium/autom4te.cache/requests +801 -554
- data/vendor/libsodium/autom4te.cache/traces.1 +717 -596
- data/vendor/libsodium/autom4te.cache/traces.4 +4355 -0
- data/vendor/libsodium/builds/Makefile.in +3 -1
- data/vendor/libsodium/builds/msvc/resource.h +1 -1
- data/vendor/libsodium/builds/msvc/resource.rc +2 -2
- data/vendor/libsodium/builds/msvc/version.h +2 -2
- data/vendor/libsodium/builds/msvc/vs2010/libsodium/libsodium.vcxproj +17 -8
- data/vendor/libsodium/builds/msvc/vs2010/libsodium/libsodium.vcxproj.filters +60 -24
- data/vendor/libsodium/builds/msvc/vs2012/libsodium/libsodium.vcxproj +17 -8
- data/vendor/libsodium/builds/msvc/vs2012/libsodium/libsodium.vcxproj.filters +60 -24
- data/vendor/libsodium/builds/msvc/vs2013/libsodium/libsodium.vcxproj +17 -8
- data/vendor/libsodium/builds/msvc/vs2013/libsodium/libsodium.vcxproj.filters +60 -24
- data/vendor/libsodium/builds/msvc/vs2015/libsodium/libsodium.vcxproj +17 -8
- data/vendor/libsodium/builds/msvc/vs2015/libsodium/libsodium.vcxproj.filters +60 -24
- data/vendor/libsodium/builds/msvc/vs2017/libsodium/libsodium.vcxproj +17 -8
- data/vendor/libsodium/builds/msvc/vs2017/libsodium/libsodium.vcxproj.filters +60 -24
- data/vendor/libsodium/configure +834 -121
- data/vendor/libsodium/configure.ac +55 -13
- data/vendor/libsodium/contrib/Findsodium.cmake +22 -3
- data/vendor/libsodium/contrib/Makefile.in +3 -1
- data/vendor/libsodium/dist-build/Makefile.in +3 -1
- data/vendor/libsodium/dist-build/android-build.sh +2 -2
- data/vendor/libsodium/dist-build/emscripten-symbols.def +38 -26
- data/vendor/libsodium/dist-build/emscripten.sh +23 -8
- data/vendor/libsodium/dist-build/msys2-win32.sh +1 -1
- data/vendor/libsodium/dist-build/msys2-win64.sh +1 -1
- data/vendor/libsodium/libsodium.vcxproj +17 -8
- data/vendor/libsodium/libsodium.vcxproj.filters +41 -14
- data/vendor/libsodium/m4/ax_tls.m4 +74 -0
- data/vendor/libsodium/msvc-scripts/Makefile.in +3 -1
- data/vendor/libsodium/msvc-scripts/process.bat +2 -2
- data/vendor/libsodium/packaging/dotnet-core/README.md +5 -5
- data/vendor/libsodium/packaging/dotnet-core/prepare.py +7 -7
- data/vendor/libsodium/packaging/nuget/package.config +1 -1
- data/vendor/libsodium/regen-msvc/libsodium.vcxproj +326 -0
- data/vendor/libsodium/regen-msvc/libsodium.vcxproj.filters +23 -0
- data/vendor/libsodium/regen-msvc/libsodium.vcxproj.filters.tpl +35 -0
- data/vendor/libsodium/regen-msvc/libsodium.vcxproj.tpl +93 -0
- data/vendor/libsodium/regen-msvc/regen-msvc.py +136 -0
- data/vendor/libsodium/regen-msvc/tl_libsodium.vcxproj.filters.tpl +23 -0
- data/vendor/libsodium/regen-msvc/tl_libsodium.vcxproj.tpl +331 -0
- data/vendor/libsodium/src/Makefile.in +3 -1
- data/vendor/libsodium/src/libsodium/Makefile.am +40 -24
- data/vendor/libsodium/src/libsodium/Makefile.in +238 -180
- data/vendor/libsodium/src/libsodium/crypto_aead/aes256gcm/aesni/aead_aes256gcm_aesni.c +10 -2
- data/vendor/libsodium/src/libsodium/crypto_core/ed25519/core_ed25519.c +79 -0
- data/vendor/libsodium/src/libsodium/crypto_core/ed25519/ref10/ed25519_ref10.c +2031 -0
- data/vendor/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_25_5/base.h +1344 -0
- data/vendor/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_25_5/base2.h +40 -0
- data/vendor/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_25_5/constants.h +20 -0
- data/vendor/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_25_5/fe.h +220 -0
- data/vendor/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_51/base.h +1344 -0
- data/vendor/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_51/base2.h +40 -0
- data/vendor/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_51/constants.h +21 -0
- data/vendor/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_51/fe.h +116 -0
- data/vendor/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2.h +1 -1
- data/vendor/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-ref.c +2 -1
- data/vendor/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-ref.c +14 -82
- data/vendor/libsodium/src/libsodium/crypto_generichash/blake2b/ref/generichash_blake2b.c +1 -0
- data/vendor/libsodium/src/libsodium/crypto_hash/sha256/cp/hash_sha256_cp.c +3 -3
- data/vendor/libsodium/src/libsodium/crypto_hash/sha512/cp/hash_sha512_cp.c +3 -3
- data/vendor/libsodium/src/libsodium/crypto_onetimeauth/poly1305/donna/poly1305_donna64.h +1 -7
- data/vendor/libsodium/src/libsodium/crypto_onetimeauth/poly1305/onetimeauth_poly1305.c +1 -0
- data/vendor/libsodium/src/libsodium/crypto_onetimeauth/poly1305/sse2/poly1305_sse2.c +0 -6
- data/vendor/libsodium/src/libsodium/crypto_pwhash/argon2/argon2-core.c +19 -92
- data/vendor/libsodium/src/libsodium/crypto_pwhash/argon2/argon2-core.h +72 -4
- data/vendor/libsodium/src/libsodium/crypto_pwhash/argon2/argon2.c +5 -1
- data/vendor/libsodium/src/libsodium/crypto_pwhash/argon2/argon2.h +1 -1
- data/vendor/libsodium/src/libsodium/crypto_pwhash/scryptsalsa208sha256/scrypt_platform.c +10 -7
- data/vendor/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/x25519_ref10.c +108 -231
- data/vendor/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/x25519_ref10.h +1 -1
- data/vendor/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/curve25519_sandy2x.c +27 -27
- data/vendor/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51_invert.c +2 -1
- data/vendor/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe_frombytes_sandy2x.c +6 -3
- data/vendor/libsodium/src/libsodium/crypto_scalarmult/curve25519/scalarmult_curve25519.c +3 -11
- data/vendor/libsodium/src/libsodium/crypto_scalarmult/ed25519/ref10/scalarmult_ed25519_ref10.c +86 -0
- data/vendor/libsodium/src/libsodium/crypto_sign/ed25519/ref10/keypair.c +28 -26
- data/vendor/libsodium/src/libsodium/crypto_sign/ed25519/ref10/obsolete.c +32 -30
- data/vendor/libsodium/src/libsodium/crypto_sign/ed25519/ref10/open.c +14 -115
- data/vendor/libsodium/src/libsodium/crypto_sign/ed25519/ref10/sign.c +56 -13
- data/vendor/libsodium/src/libsodium/crypto_sign/ed25519/ref10/{ed25519_ref10.h → sign_ed25519_ref10.h} +2 -5
- data/vendor/libsodium/src/libsodium/crypto_sign/ed25519/sign_ed25519.c +1 -1
- data/vendor/libsodium/src/libsodium/crypto_stream/chacha20/stream_chacha20.c +1 -0
- data/vendor/libsodium/src/libsodium/crypto_stream/salsa20/stream_salsa20.c +1 -0
- data/vendor/libsodium/src/libsodium/crypto_stream/salsa20/xmm6int/u8.h +1 -1
- data/vendor/libsodium/src/libsodium/include/Makefile.am +2 -0
- data/vendor/libsodium/src/libsodium/include/Makefile.in +13 -9
- data/vendor/libsodium/src/libsodium/include/sodium.h +2 -0
- data/vendor/libsodium/src/libsodium/include/sodium/crypto_core_ed25519.h +37 -0
- data/vendor/libsodium/src/libsodium/include/sodium/crypto_scalarmult.h +8 -0
- data/vendor/libsodium/src/libsodium/include/sodium/crypto_scalarmult_curve25519.h +8 -0
- data/vendor/libsodium/src/libsodium/include/sodium/crypto_scalarmult_ed25519.h +41 -0
- data/vendor/libsodium/src/libsodium/include/sodium/private/common.h +18 -0
- data/vendor/libsodium/src/libsodium/include/sodium/private/ed25519_ref10.h +125 -0
- data/vendor/libsodium/src/libsodium/include/sodium/private/ed25519_ref10_fe_25_5.h +1050 -0
- data/vendor/libsodium/src/libsodium/include/sodium/private/ed25519_ref10_fe_51.h +518 -0
- data/vendor/libsodium/src/libsodium/include/sodium/runtime.h +3 -0
- data/vendor/libsodium/src/libsodium/include/sodium/utils.h +3 -0
- data/vendor/libsodium/src/libsodium/randombytes/salsa20/randombytes_salsa20_random.c +182 -102
- data/vendor/libsodium/src/libsodium/sodium/core.c +30 -2
- data/vendor/libsodium/src/libsodium/sodium/runtime.c +14 -0
- data/vendor/libsodium/src/libsodium/sodium/utils.c +46 -0
- data/vendor/libsodium/test/Makefile.in +3 -1
- data/vendor/libsodium/test/default/Makefile.am +16 -0
- data/vendor/libsodium/test/default/Makefile.in +71 -23
- data/vendor/libsodium/test/default/aead_aes256gcm.c +1 -1
- data/vendor/libsodium/test/default/cmptest.h +4 -0
- data/vendor/libsodium/test/default/core3.c +44 -4
- data/vendor/libsodium/test/default/core3.exp +2 -0
- data/vendor/libsodium/test/default/core4.c +1 -1
- data/vendor/libsodium/test/default/core_ed25519.c +151 -0
- data/vendor/libsodium/test/default/core_ed25519.exp +1 -0
- data/vendor/libsodium/test/default/ed25519_convert.c +9 -1
- data/vendor/libsodium/test/default/index.html.tpl +17 -3
- data/vendor/libsodium/test/default/kdf.c +4 -2
- data/vendor/libsodium/test/default/metamorphic.c +8 -8
- data/vendor/libsodium/test/default/misuse.c +29 -1
- data/vendor/libsodium/test/default/pwhash_argon2i.c +9 -3
- data/vendor/libsodium/test/default/pwhash_argon2i.exp +2 -2
- data/vendor/libsodium/test/default/pwhash_argon2id.c +7 -2
- data/vendor/libsodium/test/default/pwhash_argon2id.exp +2 -2
- data/vendor/libsodium/test/default/scalarmult.c +0 -2
- data/vendor/libsodium/test/default/scalarmult.exp +0 -1
- data/vendor/libsodium/test/default/scalarmult_ed25519.c +90 -0
- data/vendor/libsodium/test/default/scalarmult_ed25519.exp +1 -0
- data/vendor/libsodium/test/default/secretbox_easy2.c +1 -1
- data/vendor/libsodium/test/default/secretstream.c +52 -3
- data/vendor/libsodium/test/default/sign.c +16 -0
- data/vendor/libsodium/test/default/sodium_core.c +1 -0
- data/vendor/libsodium/test/default/sodium_utils.c +2 -1
- data/vendor/libsodium/test/default/xchacha20.c +2 -1
- metadata +63 -12
- data/vendor/libsodium/src/libsodium/crypto_core/curve25519/ref10/base.h +0 -1344
- data/vendor/libsodium/src/libsodium/crypto_core/curve25519/ref10/base2.h +0 -40
- data/vendor/libsodium/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c +0 -2797
- data/vendor/libsodium/src/libsodium/crypto_scalarmult/curve25519/donna_c64/curve25519_donna_c64.c +0 -545
- data/vendor/libsodium/src/libsodium/crypto_scalarmult/curve25519/donna_c64/curve25519_donna_c64.h +0 -10
- data/vendor/libsodium/src/libsodium/include/sodium/private/curve25519_ref10.h +0 -132
- data/vendor/libsodium/test/default/index-wasm.html.tpl +0 -118
@@ -96,6 +96,7 @@ typedef struct Argon2_instance_t {
|
|
96
96
|
block_region *region; /* Memory region pointer */
|
97
97
|
uint64_t *pseudo_rands;
|
98
98
|
uint32_t passes; /* Number of passes */
|
99
|
+
uint32_t current_pass;
|
99
100
|
uint32_t memory_blocks; /* Number of blocks in memory */
|
100
101
|
uint32_t segment_length;
|
101
102
|
uint32_t lane_length;
|
@@ -135,9 +136,76 @@ typedef struct Argon2_thread_data {
|
|
135
136
|
* If so we can reference the current segment
|
136
137
|
* @pre All pointers must be valid
|
137
138
|
*/
|
138
|
-
uint32_t index_alpha(const argon2_instance_t *instance,
|
139
|
-
|
140
|
-
|
139
|
+
static uint32_t index_alpha(const argon2_instance_t *instance,
|
140
|
+
const argon2_position_t *position, uint32_t pseudo_rand,
|
141
|
+
int same_lane)
|
142
|
+
{
|
143
|
+
/*
|
144
|
+
* Pass 0:
|
145
|
+
* This lane : all already finished segments plus already constructed
|
146
|
+
* blocks in this segment
|
147
|
+
* Other lanes : all already finished segments
|
148
|
+
* Pass 1+:
|
149
|
+
* This lane : (SYNC_POINTS - 1) last segments plus already constructed
|
150
|
+
* blocks in this segment
|
151
|
+
* Other lanes : (SYNC_POINTS - 1) last segments
|
152
|
+
*/
|
153
|
+
uint32_t reference_area_size;
|
154
|
+
uint64_t relative_position;
|
155
|
+
uint32_t start_position, absolute_position;
|
156
|
+
|
157
|
+
if (position->pass == 0) {
|
158
|
+
/* First pass */
|
159
|
+
if (position->slice == 0) {
|
160
|
+
/* First slice */
|
161
|
+
reference_area_size =
|
162
|
+
position->index - 1; /* all but the previous */
|
163
|
+
} else {
|
164
|
+
if (same_lane) {
|
165
|
+
/* The same lane => add current segment */
|
166
|
+
reference_area_size =
|
167
|
+
position->slice * instance->segment_length +
|
168
|
+
position->index - 1;
|
169
|
+
} else {
|
170
|
+
reference_area_size =
|
171
|
+
position->slice * instance->segment_length +
|
172
|
+
((position->index == 0) ? (-1) : 0);
|
173
|
+
}
|
174
|
+
}
|
175
|
+
} else {
|
176
|
+
/* Second pass */
|
177
|
+
if (same_lane) {
|
178
|
+
reference_area_size = instance->lane_length -
|
179
|
+
instance->segment_length + position->index -
|
180
|
+
1;
|
181
|
+
} else {
|
182
|
+
reference_area_size = instance->lane_length -
|
183
|
+
instance->segment_length +
|
184
|
+
((position->index == 0) ? (-1) : 0);
|
185
|
+
}
|
186
|
+
}
|
187
|
+
|
188
|
+
/* 1.2.4. Mapping pseudo_rand to 0..<reference_area_size-1> and produce
|
189
|
+
* relative position */
|
190
|
+
relative_position = pseudo_rand;
|
191
|
+
relative_position = relative_position * relative_position >> 32;
|
192
|
+
relative_position = reference_area_size - 1 -
|
193
|
+
(reference_area_size * relative_position >> 32);
|
194
|
+
|
195
|
+
/* 1.2.5 Computing starting position */
|
196
|
+
start_position = 0;
|
197
|
+
|
198
|
+
if (position->pass != 0) {
|
199
|
+
start_position = (position->slice == ARGON2_SYNC_POINTS - 1)
|
200
|
+
? 0
|
201
|
+
: (position->slice + 1) * instance->segment_length;
|
202
|
+
}
|
203
|
+
|
204
|
+
/* 1.2.6. Computing absolute position */
|
205
|
+
absolute_position = (start_position + relative_position) %
|
206
|
+
instance->lane_length; /* absolute position */
|
207
|
+
return absolute_position;
|
208
|
+
}
|
141
209
|
|
142
210
|
/*
|
143
211
|
* Function that validates all inputs against predefined restrictions and return
|
@@ -224,6 +292,6 @@ void fill_segment_ref(const argon2_instance_t *instance,
|
|
224
292
|
* @param instance Pointer to the current instance
|
225
293
|
* @return Zero if successful, -1 if memory failed to allocate
|
226
294
|
*/
|
227
|
-
void fill_memory_blocks(argon2_instance_t *instance);
|
295
|
+
void fill_memory_blocks(argon2_instance_t *instance, uint32_t pass);
|
228
296
|
|
229
297
|
#endif
|
@@ -29,6 +29,7 @@ argon2_ctx(argon2_context *context, argon2_type type)
|
|
29
29
|
/* 1. Validate all inputs */
|
30
30
|
int result = validate_inputs(context);
|
31
31
|
uint32_t memory_blocks, segment_length;
|
32
|
+
uint32_t pass;
|
32
33
|
argon2_instance_t instance;
|
33
34
|
|
34
35
|
if (ARGON2_OK != result) {
|
@@ -53,6 +54,7 @@ argon2_ctx(argon2_context *context, argon2_type type)
|
|
53
54
|
|
54
55
|
instance.region = NULL;
|
55
56
|
instance.passes = context->t_cost;
|
57
|
+
instance.current_pass = ~ 0U;
|
56
58
|
instance.memory_blocks = memory_blocks;
|
57
59
|
instance.segment_length = segment_length;
|
58
60
|
instance.lane_length = segment_length * ARGON2_SYNC_POINTS;
|
@@ -70,7 +72,9 @@ argon2_ctx(argon2_context *context, argon2_type type)
|
|
70
72
|
}
|
71
73
|
|
72
74
|
/* 4. Filling memory */
|
73
|
-
|
75
|
+
for (pass = 0; pass < instance.passes; pass++) {
|
76
|
+
fill_memory_blocks(&instance, pass);
|
77
|
+
}
|
74
78
|
|
75
79
|
/* 5. Finalization */
|
76
80
|
finalize(context, &instance);
|
@@ -69,7 +69,7 @@
|
|
69
69
|
#define ARGON2_FLAG_CLEAR_PASSWORD (UINT32_C(1) << 0)
|
70
70
|
#define ARGON2_FLAG_CLEAR_SECRET (UINT32_C(1) << 1)
|
71
71
|
#define ARGON2_FLAG_CLEAR_MEMORY (UINT32_C(1) << 2)
|
72
|
-
#define ARGON2_DEFAULT_FLAGS (
|
72
|
+
#define ARGON2_DEFAULT_FLAGS (UINT32_C(0))
|
73
73
|
|
74
74
|
/* Error codes */
|
75
75
|
typedef enum Argon2_ErrorCodes {
|
@@ -28,7 +28,13 @@
|
|
28
28
|
#include "runtime.h"
|
29
29
|
|
30
30
|
#if !defined(MAP_ANON) && defined(MAP_ANONYMOUS)
|
31
|
-
#define MAP_ANON MAP_ANONYMOUS
|
31
|
+
# define MAP_ANON MAP_ANONYMOUS
|
32
|
+
#endif
|
33
|
+
#ifndef MAP_NOCORE
|
34
|
+
# define MAP_NOCORE 0
|
35
|
+
#endif
|
36
|
+
#ifndef MAP_POPULATE
|
37
|
+
# define MAP_POPULATE 0
|
32
38
|
#endif
|
33
39
|
|
34
40
|
void *
|
@@ -37,13 +43,10 @@ alloc_region(escrypt_region_t *region, size_t size)
|
|
37
43
|
uint8_t *base, *aligned;
|
38
44
|
#if defined(MAP_ANON) && defined(HAVE_MMAP)
|
39
45
|
if ((base = (uint8_t *) mmap(NULL, size, PROT_READ | PROT_WRITE,
|
40
|
-
|
41
|
-
|
42
|
-
#else
|
43
|
-
MAP_ANON | MAP_PRIVATE,
|
44
|
-
#endif
|
45
|
-
-1, 0)) == MAP_FAILED)
|
46
|
+
MAP_ANON | MAP_PRIVATE | MAP_NOCORE | MAP_POPULATE,
|
47
|
+
-1, 0)) == MAP_FAILED) {
|
46
48
|
base = NULL; /* LCOV_EXCL_LINE */
|
49
|
+
} /* LCOV_EXCL_LINE */
|
47
50
|
aligned = base;
|
48
51
|
#elif defined(HAVE_POSIX_MEMALIGN)
|
49
52
|
if ((errno = posix_memalign((void **) &base, 64, size)) != 0) {
|
@@ -2,174 +2,50 @@
|
|
2
2
|
#include <stddef.h>
|
3
3
|
#include <stdint.h>
|
4
4
|
|
5
|
-
#ifndef HAVE_TI_MODE
|
6
|
-
|
7
5
|
#include "../scalarmult_curve25519.h"
|
8
|
-
#include "
|
6
|
+
#include "export.h"
|
7
|
+
#include "private/ed25519_ref10.h"
|
9
8
|
#include "utils.h"
|
10
9
|
#include "x25519_ref10.h"
|
11
10
|
|
12
11
|
/*
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
static void
|
20
|
-
fe_cswap(fe f, fe g, unsigned int b)
|
21
|
-
{
|
22
|
-
int32_t f0 = f[0];
|
23
|
-
int32_t f1 = f[1];
|
24
|
-
int32_t f2 = f[2];
|
25
|
-
int32_t f3 = f[3];
|
26
|
-
int32_t f4 = f[4];
|
27
|
-
int32_t f5 = f[5];
|
28
|
-
int32_t f6 = f[6];
|
29
|
-
int32_t f7 = f[7];
|
30
|
-
int32_t f8 = f[8];
|
31
|
-
int32_t f9 = f[9];
|
32
|
-
int32_t g0 = g[0];
|
33
|
-
int32_t g1 = g[1];
|
34
|
-
int32_t g2 = g[2];
|
35
|
-
int32_t g3 = g[3];
|
36
|
-
int32_t g4 = g[4];
|
37
|
-
int32_t g5 = g[5];
|
38
|
-
int32_t g6 = g[6];
|
39
|
-
int32_t g7 = g[7];
|
40
|
-
int32_t g8 = g[8];
|
41
|
-
int32_t g9 = g[9];
|
42
|
-
int32_t x0 = f0 ^ g0;
|
43
|
-
int32_t x1 = f1 ^ g1;
|
44
|
-
int32_t x2 = f2 ^ g2;
|
45
|
-
int32_t x3 = f3 ^ g3;
|
46
|
-
int32_t x4 = f4 ^ g4;
|
47
|
-
int32_t x5 = f5 ^ g5;
|
48
|
-
int32_t x6 = f6 ^ g6;
|
49
|
-
int32_t x7 = f7 ^ g7;
|
50
|
-
int32_t x8 = f8 ^ g8;
|
51
|
-
int32_t x9 = f9 ^ g9;
|
52
|
-
|
53
|
-
b = (unsigned int)(-(int)b);
|
54
|
-
x0 &= b;
|
55
|
-
x1 &= b;
|
56
|
-
x2 &= b;
|
57
|
-
x3 &= b;
|
58
|
-
x4 &= b;
|
59
|
-
x5 &= b;
|
60
|
-
x6 &= b;
|
61
|
-
x7 &= b;
|
62
|
-
x8 &= b;
|
63
|
-
x9 &= b;
|
64
|
-
f[0] = f0 ^ x0;
|
65
|
-
f[1] = f1 ^ x1;
|
66
|
-
f[2] = f2 ^ x2;
|
67
|
-
f[3] = f3 ^ x3;
|
68
|
-
f[4] = f4 ^ x4;
|
69
|
-
f[5] = f5 ^ x5;
|
70
|
-
f[6] = f6 ^ x6;
|
71
|
-
f[7] = f7 ^ x7;
|
72
|
-
f[8] = f8 ^ x8;
|
73
|
-
f[9] = f9 ^ x9;
|
74
|
-
g[0] = g0 ^ x0;
|
75
|
-
g[1] = g1 ^ x1;
|
76
|
-
g[2] = g2 ^ x2;
|
77
|
-
g[3] = g3 ^ x3;
|
78
|
-
g[4] = g4 ^ x4;
|
79
|
-
g[5] = g5 ^ x5;
|
80
|
-
g[6] = g6 ^ x6;
|
81
|
-
g[7] = g7 ^ x7;
|
82
|
-
g[8] = g8 ^ x8;
|
83
|
-
g[9] = g9 ^ x9;
|
84
|
-
}
|
85
|
-
|
86
|
-
/*
|
87
|
-
h = f * 121666
|
88
|
-
Can overlap h with f.
|
89
|
-
|
90
|
-
Preconditions:
|
91
|
-
|f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
|
92
|
-
|
93
|
-
Postconditions:
|
94
|
-
|h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
|
95
|
-
*/
|
96
|
-
|
97
|
-
static void
|
98
|
-
fe_mul121666(fe h, const fe f)
|
12
|
+
* Reject small order points early to mitigate the implications of
|
13
|
+
* unexpected optimizations that would affect the ref10 code.
|
14
|
+
* See https://eprint.iacr.org/2017/806.pdf for reference.
|
15
|
+
*/
|
16
|
+
static int
|
17
|
+
has_small_order(const unsigned char s[32])
|
99
18
|
{
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
carry9 = (h9 + ((int64_t)1 << 24)) >> 25;
|
132
|
-
h0 += carry9 * 19;
|
133
|
-
h9 -= carry9 * ((int64_t)1 << 25);
|
134
|
-
carry1 = (h1 + ((int64_t)1 << 24)) >> 25;
|
135
|
-
h2 += carry1;
|
136
|
-
h1 -= carry1 * ((int64_t)1 << 25);
|
137
|
-
carry3 = (h3 + ((int64_t)1 << 24)) >> 25;
|
138
|
-
h4 += carry3;
|
139
|
-
h3 -= carry3 * ((int64_t)1 << 25);
|
140
|
-
carry5 = (h5 + ((int64_t)1 << 24)) >> 25;
|
141
|
-
h6 += carry5;
|
142
|
-
h5 -= carry5 * ((int64_t)1 << 25);
|
143
|
-
carry7 = (h7 + ((int64_t)1 << 24)) >> 25;
|
144
|
-
h8 += carry7;
|
145
|
-
h7 -= carry7 * ((int64_t)1 << 25);
|
146
|
-
|
147
|
-
carry0 = (h0 + ((int64_t)1 << 25)) >> 26;
|
148
|
-
h1 += carry0;
|
149
|
-
h0 -= carry0 * ((int64_t)1 << 26);
|
150
|
-
carry2 = (h2 + ((int64_t)1 << 25)) >> 26;
|
151
|
-
h3 += carry2;
|
152
|
-
h2 -= carry2 * ((int64_t)1 << 26);
|
153
|
-
carry4 = (h4 + ((int64_t)1 << 25)) >> 26;
|
154
|
-
h5 += carry4;
|
155
|
-
h4 -= carry4 * ((int64_t)1 << 26);
|
156
|
-
carry6 = (h6 + ((int64_t)1 << 25)) >> 26;
|
157
|
-
h7 += carry6;
|
158
|
-
h6 -= carry6 * ((int64_t)1 << 26);
|
159
|
-
carry8 = (h8 + ((int64_t)1 << 25)) >> 26;
|
160
|
-
h9 += carry8;
|
161
|
-
h8 -= carry8 * ((int64_t)1 << 26);
|
162
|
-
|
163
|
-
h[0] = (int32_t) h0;
|
164
|
-
h[1] = (int32_t) h1;
|
165
|
-
h[2] = (int32_t) h2;
|
166
|
-
h[3] = (int32_t) h3;
|
167
|
-
h[4] = (int32_t) h4;
|
168
|
-
h[5] = (int32_t) h5;
|
169
|
-
h[6] = (int32_t) h6;
|
170
|
-
h[7] = (int32_t) h7;
|
171
|
-
h[8] = (int32_t) h8;
|
172
|
-
h[9] = (int32_t) h9;
|
19
|
+
CRYPTO_ALIGN(16)
|
20
|
+
static const unsigned char blacklist[][32] = {
|
21
|
+
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
22
|
+
{ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
23
|
+
{ 0xe0, 0xeb, 0x7a, 0x7c, 0x3b, 0x41, 0xb8, 0xae, 0x16, 0x56, 0xe3, 0xfa, 0xf1, 0x9f, 0xc4, 0x6a, 0xda, 0x09, 0x8d, 0xeb, 0x9c, 0x32, 0xb1, 0xfd, 0x86, 0x62, 0x05, 0x16, 0x5f, 0x49, 0xb8, 0x00 },
|
24
|
+
{ 0x5f, 0x9c, 0x95, 0xbc, 0xa3, 0x50, 0x8c, 0x24, 0xb1, 0xd0, 0xb1, 0x55, 0x9c, 0x83, 0xef, 0x5b, 0x04, 0x44, 0x5c, 0xc4, 0x58, 0x1c, 0x8e, 0x86, 0xd8, 0x22, 0x4e, 0xdd, 0xd0, 0x9f, 0x11, 0x57 },
|
25
|
+
{ 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
|
26
|
+
{ 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
|
27
|
+
{ 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
|
28
|
+
{ 0xcd, 0xeb, 0x7a, 0x7c, 0x3b, 0x41, 0xb8, 0xae, 0x16, 0x56, 0xe3, 0xfa, 0xf1, 0x9f, 0xc4, 0x6a, 0xda, 0x09, 0x8d, 0xeb, 0x9c, 0x32, 0xb1, 0xfd, 0x86, 0x62, 0x05, 0x16, 0x5f, 0x49, 0xb8, 0x80 },
|
29
|
+
{ 0x4c, 0x9c, 0x95, 0xbc, 0xa3, 0x50, 0x8c, 0x24, 0xb1, 0xd0, 0xb1, 0x55, 0x9c, 0x83, 0xef, 0x5b, 0x04, 0x44, 0x5c, 0xc4, 0x58, 0x1c, 0x8e, 0x86, 0xd8, 0x22, 0x4e, 0xdd, 0xd0, 0x9f, 0x11, 0xd7 },
|
30
|
+
{ 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
|
31
|
+
{ 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
|
32
|
+
{ 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }
|
33
|
+
};
|
34
|
+
unsigned char c[12] = { 0 };
|
35
|
+
unsigned int k;
|
36
|
+
size_t i, j;
|
37
|
+
|
38
|
+
COMPILER_ASSERT(12 == sizeof blacklist / sizeof blacklist[0]);
|
39
|
+
for (j = 0; j < 32; j++) {
|
40
|
+
for (i = 0; i < sizeof blacklist / sizeof blacklist[0]; i++) {
|
41
|
+
c[i] |= s[j] ^ blacklist[i][j];
|
42
|
+
}
|
43
|
+
}
|
44
|
+
k = 0;
|
45
|
+
for (i = 0; i < sizeof blacklist / sizeof blacklist[0]; i++) {
|
46
|
+
k |= (c[i] - 1);
|
47
|
+
}
|
48
|
+
return (int) ((k >> 8) & 1);
|
173
49
|
}
|
174
50
|
|
175
51
|
static int
|
@@ -177,98 +53,101 @@ crypto_scalarmult_curve25519_ref10(unsigned char *q,
|
|
177
53
|
const unsigned char *n,
|
178
54
|
const unsigned char *p)
|
179
55
|
{
|
180
|
-
unsigned char
|
181
|
-
unsigned int
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
int
|
190
|
-
unsigned int
|
191
|
-
unsigned int
|
192
|
-
|
193
|
-
|
194
|
-
|
56
|
+
unsigned char *t = q;
|
57
|
+
unsigned int i;
|
58
|
+
fe25519 x1;
|
59
|
+
fe25519 x2;
|
60
|
+
fe25519 z2;
|
61
|
+
fe25519 x3;
|
62
|
+
fe25519 z3;
|
63
|
+
fe25519 tmp0;
|
64
|
+
fe25519 tmp1;
|
65
|
+
int pos;
|
66
|
+
unsigned int swap;
|
67
|
+
unsigned int b;
|
68
|
+
|
69
|
+
if (has_small_order(p)) {
|
70
|
+
return -1;
|
195
71
|
}
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
72
|
+
for (i = 0; i < 32; i++) {
|
73
|
+
t[i] = n[i];
|
74
|
+
}
|
75
|
+
t[0] &= 248;
|
76
|
+
t[31] &= 127;
|
77
|
+
t[31] |= 64;
|
78
|
+
fe25519_frombytes(x1, p);
|
79
|
+
fe25519_1(x2);
|
80
|
+
fe25519_0(z2);
|
81
|
+
fe25519_copy(x3, x1);
|
82
|
+
fe25519_1(z3);
|
204
83
|
|
205
84
|
swap = 0;
|
206
85
|
for (pos = 254; pos >= 0; --pos) {
|
207
|
-
b =
|
86
|
+
b = t[pos / 8] >> (pos & 7);
|
208
87
|
b &= 1;
|
209
88
|
swap ^= b;
|
210
|
-
|
211
|
-
|
89
|
+
fe25519_cswap(x2, x3, swap);
|
90
|
+
fe25519_cswap(z2, z3, swap);
|
212
91
|
swap = b;
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
92
|
+
fe25519_sub(tmp0, x3, z3);
|
93
|
+
fe25519_sub(tmp1, x2, z2);
|
94
|
+
fe25519_add(x2, x2, z2);
|
95
|
+
fe25519_add(z2, x3, z3);
|
96
|
+
fe25519_mul(z3, tmp0, x2);
|
97
|
+
fe25519_mul(z2, z2, tmp1);
|
98
|
+
fe25519_sq(tmp0, tmp1);
|
99
|
+
fe25519_sq(tmp1, x2);
|
100
|
+
fe25519_add(x3, z3, z2);
|
101
|
+
fe25519_sub(z2, z3, z2);
|
102
|
+
fe25519_mul(x2, tmp1, tmp0);
|
103
|
+
fe25519_sub(tmp1, tmp1, tmp0);
|
104
|
+
fe25519_sq(z2, z2);
|
105
|
+
fe25519_scalar_product(z3, tmp1, 121666);
|
106
|
+
fe25519_sq(x3, x3);
|
107
|
+
fe25519_add(tmp0, tmp0, z3);
|
108
|
+
fe25519_mul(z3, x1, z2);
|
109
|
+
fe25519_mul(z2, tmp1, tmp0);
|
231
110
|
}
|
232
|
-
|
233
|
-
|
111
|
+
fe25519_cswap(x2, x3, swap);
|
112
|
+
fe25519_cswap(z2, z3, swap);
|
234
113
|
|
235
|
-
|
236
|
-
|
237
|
-
|
114
|
+
fe25519_invert(z2, z2);
|
115
|
+
fe25519_mul(x2, x2, z2);
|
116
|
+
fe25519_tobytes(q, x2);
|
238
117
|
|
239
118
|
return 0;
|
240
119
|
}
|
241
120
|
|
242
121
|
static void
|
243
|
-
edwards_to_montgomery(
|
122
|
+
edwards_to_montgomery(fe25519 montgomeryX, const fe25519 edwardsY, const fe25519 edwardsZ)
|
244
123
|
{
|
245
|
-
|
246
|
-
|
124
|
+
fe25519 tempX;
|
125
|
+
fe25519 tempZ;
|
247
126
|
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
127
|
+
fe25519_add(tempX, edwardsZ, edwardsY);
|
128
|
+
fe25519_sub(tempZ, edwardsZ, edwardsY);
|
129
|
+
fe25519_invert(tempZ, tempZ);
|
130
|
+
fe25519_mul(montgomeryX, tempX, tempZ);
|
252
131
|
}
|
253
132
|
|
254
133
|
static int
|
255
134
|
crypto_scalarmult_curve25519_ref10_base(unsigned char *q,
|
256
135
|
const unsigned char *n)
|
257
136
|
{
|
258
|
-
unsigned char
|
259
|
-
|
260
|
-
|
261
|
-
unsigned int
|
137
|
+
unsigned char *t = q;
|
138
|
+
ge25519_p3 A;
|
139
|
+
fe25519 pk;
|
140
|
+
unsigned int i;
|
262
141
|
|
263
|
-
for (i = 0; i < 32; ++
|
264
|
-
|
142
|
+
for (i = 0; i < 32; i++) {
|
143
|
+
t[i] = n[i];
|
265
144
|
}
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
145
|
+
t[0] &= 248;
|
146
|
+
t[31] &= 127;
|
147
|
+
t[31] |= 64;
|
148
|
+
ge25519_scalarmult_base(&A, t);
|
270
149
|
edwards_to_montgomery(pk, A.Y, A.Z);
|
271
|
-
|
150
|
+
fe25519_tobytes(q, pk);
|
272
151
|
|
273
152
|
return 0;
|
274
153
|
}
|
@@ -278,5 +157,3 @@ struct crypto_scalarmult_curve25519_implementation
|
|
278
157
|
SODIUM_C99(.mult =) crypto_scalarmult_curve25519_ref10,
|
279
158
|
SODIUM_C99(.mult_base =) crypto_scalarmult_curve25519_ref10_base
|
280
159
|
};
|
281
|
-
|
282
|
-
#endif
|