x25519 1.0.2 → 1.0.3
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/CHANGES.md +7 -0
- data/lib/x25519.rb +21 -1
- data/lib/x25519/montgomery_u.rb +5 -0
- data/lib/x25519/scalar.rb +6 -6
- data/lib/x25519/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 228a5fff8ae6b51e46c91ab6e0fd9fce4ec03fbf
|
4
|
+
data.tar.gz: e2562bda953f96a37e0188820f6139641b715c6b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2eb051180a4fdf3f4735bcd39aad32a13d117bd3aad7ee1597f2563b7ae3afb3f1056b52caf4ffc7efce335cdeeb79497ce848388ee5d2f663c499f6067ae01a
|
7
|
+
data.tar.gz: 4f850779d9401fcfdfe7bf27bb89637c7848eec13158f5f7a176c7ca98eb8a34f546c116f16a5378b12df179790f86384e292abfb765277eba87a2686ea59358
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
# [1.0.3] (2017-12-13)
|
2
|
+
|
3
|
+
[1.0.3]: https://github.com/cryptosphere/x25519/compare/v1.0.2...v1.0.3
|
4
|
+
|
5
|
+
* [#10](https://github.com/cryptosphere/x25519/pull/10)
|
6
|
+
Detect degenerate (i.e. all-zero) public keys (fixes #6)
|
7
|
+
|
1
8
|
# [1.0.2] (2017-12-13)
|
2
9
|
|
3
10
|
[1.0.2]: https://github.com/cryptosphere/x25519/compare/v1.0.1...v1.0.2
|
data/lib/x25519.rb
CHANGED
@@ -19,6 +19,9 @@ module X25519
|
|
19
19
|
# Size of an X25519 key (public or private) in bytes
|
20
20
|
KEY_SIZE = 32
|
21
21
|
|
22
|
+
# Raised when we detect a degenerate (i.e. all-zero) public key
|
23
|
+
InvalidKeyError = Class.new(StandardError)
|
24
|
+
|
22
25
|
# Raised when the built-in self-test fails
|
23
26
|
SelfTestFailure = Class.new(StandardError)
|
24
27
|
|
@@ -35,6 +38,18 @@ module X25519
|
|
35
38
|
# fall back to the ref10 portable C implementation.
|
36
39
|
self.provider = X25519::Provider::Precomputed if X25519::Provider::Precomputed.available?
|
37
40
|
|
41
|
+
# Raw fixed-base scalar multiplication function that acts directly on
|
42
|
+
# bytestrings. Calculates the coordinate of the elliptic curve point that
|
43
|
+
# represents the public key for a given scalar.
|
44
|
+
#
|
45
|
+
# @param scalar_bytes [String] a serialized private scalar
|
46
|
+
#
|
47
|
+
# @return [String] compressed Montgomery-u coordinate of the resulting point
|
48
|
+
def calculate_public_key(scalar_bytes)
|
49
|
+
validate_key_bytes(scalar_bytes)
|
50
|
+
provider.scalarmult_base(scalar_bytes)
|
51
|
+
end
|
52
|
+
|
38
53
|
# Raw Diffie-Hellman function that acts directly on bytestrings. An
|
39
54
|
# alternative to the object-oriented API
|
40
55
|
#
|
@@ -45,7 +60,12 @@ module X25519
|
|
45
60
|
def diffie_hellman(scalar_bytes, montgomery_u_bytes)
|
46
61
|
validate_key_bytes(scalar_bytes)
|
47
62
|
validate_key_bytes(montgomery_u_bytes)
|
48
|
-
|
63
|
+
|
64
|
+
# The point located at a Montgomery-u coordinate of zero always returns
|
65
|
+
# the point at zero regardless of which scalar it's multiplied with
|
66
|
+
raise InvalidKeyError, "degenerate public key" if montgomery_u_bytes == ("\0" * KEY_SIZE)
|
67
|
+
|
68
|
+
provider.scalarmult(scalar_bytes, montgomery_u_bytes)
|
49
69
|
end
|
50
70
|
|
51
71
|
# Ensure a serialized key meets the requirements
|
data/lib/x25519/montgomery_u.rb
CHANGED
@@ -11,6 +11,11 @@ module X25519
|
|
11
11
|
# @param bytes [String] 32-byte compressed Montgomery-u coordinate
|
12
12
|
def initialize(bytes)
|
13
13
|
X25519.validate_key_bytes(bytes)
|
14
|
+
|
15
|
+
# The point located at a Montgomery-u coordinate of zero always returns
|
16
|
+
# the point at zero regardless of which scalar it's multiplied with
|
17
|
+
raise InvalidKeyError, "degenerate public key" if bytes == ("\0" * KEY_SIZE)
|
18
|
+
|
14
19
|
@bytes = bytes
|
15
20
|
end
|
16
21
|
|
data/lib/x25519/scalar.rb
CHANGED
@@ -26,20 +26,20 @@ module X25519
|
|
26
26
|
# @param montgomery_u [X25519::MontgomeryU] coordinate of the public key/point to perform D-H with
|
27
27
|
#
|
28
28
|
# @return [X25519::MontgomeryU] resulting point (i.e. D-H shared secret)
|
29
|
-
def
|
29
|
+
def diffie_hellman(montgomery_u)
|
30
30
|
raise TypeError, "expected X25519::MontgomeryU, got #{montgomery_u}" unless montgomery_u.is_a?(MontgomeryU)
|
31
|
-
MontgomeryU.new(X25519.
|
31
|
+
MontgomeryU.new(X25519.diffie_hellman(@scalar_bytes, montgomery_u.to_bytes))
|
32
32
|
end
|
33
|
-
alias diffie_hellman
|
33
|
+
alias multiply diffie_hellman
|
34
34
|
|
35
35
|
# Fixed-base scalar multiplication. Calculates a public key from a
|
36
36
|
# private scalar
|
37
37
|
#
|
38
38
|
# @return [X25519::MontgomeryU] resulting point (i.e. public key)
|
39
|
-
def
|
40
|
-
MontgomeryU.new(X25519.
|
39
|
+
def public_key
|
40
|
+
MontgomeryU.new(X25519.calculate_public_key(@scalar_bytes))
|
41
41
|
end
|
42
|
-
alias public_key
|
42
|
+
alias multiply_base public_key
|
43
43
|
|
44
44
|
# Return a bytestring representation of this scalar
|
45
45
|
#
|
data/lib/x25519/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: x25519
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tony Arcieri
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-12-
|
11
|
+
date: 2017-12-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|