ed25519 1.2.4-java

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.
Files changed (79) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.rspec +5 -0
  4. data/.rubocop.yml +35 -0
  5. data/.travis.yml +26 -0
  6. data/CHANGES.md +70 -0
  7. data/CODE_OF_CONDUCT.md +74 -0
  8. data/Gemfile +12 -0
  9. data/LICENSE +22 -0
  10. data/README.md +170 -0
  11. data/Rakefile +27 -0
  12. data/appveyor.yml +21 -0
  13. data/ed25519.gemspec +32 -0
  14. data/ed25519.png +0 -0
  15. data/ext/ed25519_jruby/LICENSE.txt +123 -0
  16. data/ext/ed25519_jruby/README.md +77 -0
  17. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/EdDSAEngine.java +491 -0
  18. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/EdDSAKey.java +31 -0
  19. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/EdDSAPrivateKey.java +338 -0
  20. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/EdDSAPublicKey.java +275 -0
  21. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/EdDSASecurityProvider.java +59 -0
  22. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/KeyFactory.java +75 -0
  23. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/KeyPairGenerator.java +97 -0
  24. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/Utils.java +103 -0
  25. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/Constants.java +23 -0
  26. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/Curve.java +100 -0
  27. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/Encoding.java +54 -0
  28. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/Field.java +99 -0
  29. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/FieldElement.java +76 -0
  30. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/GroupElement.java +1034 -0
  31. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/ScalarOps.java +34 -0
  32. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/bigint/BigIntegerFieldElement.java +131 -0
  33. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/bigint/BigIntegerLittleEndianEncoding.java +102 -0
  34. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/bigint/BigIntegerScalarOps.java +37 -0
  35. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/bigint/package.html +6 -0
  36. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/ed25519/Ed25519FieldElement.java +988 -0
  37. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/ed25519/Ed25519LittleEndianEncoding.java +256 -0
  38. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/ed25519/Ed25519ScalarOps.java +693 -0
  39. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/spec/EdDSAGenParameterSpec.java +32 -0
  40. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/spec/EdDSANamedCurveSpec.java +35 -0
  41. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/spec/EdDSANamedCurveTable.java +71 -0
  42. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/spec/EdDSAParameterSpec.java +97 -0
  43. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/spec/EdDSAPrivateKeySpec.java +133 -0
  44. data/ext/ed25519_jruby/net/i2p/crypto/eddsa/spec/EdDSAPublicKeySpec.java +61 -0
  45. data/ext/ed25519_jruby/org/cryptorb/Ed25519Provider.java +95 -0
  46. data/ext/ed25519_ref10/api.h +4 -0
  47. data/ext/ed25519_ref10/base.h +1344 -0
  48. data/ext/ed25519_ref10/base2.h +40 -0
  49. data/ext/ed25519_ref10/d.h +1 -0
  50. data/ext/ed25519_ref10/d2.h +1 -0
  51. data/ext/ed25519_ref10/ed25519_ref10.c +99 -0
  52. data/ext/ed25519_ref10/ed25519_ref10.h +33 -0
  53. data/ext/ed25519_ref10/extconf.rb +9 -0
  54. data/ext/ed25519_ref10/fe.c +1085 -0
  55. data/ext/ed25519_ref10/fe.h +56 -0
  56. data/ext/ed25519_ref10/ge.c +407 -0
  57. data/ext/ed25519_ref10/ge.h +95 -0
  58. data/ext/ed25519_ref10/ge_add.h +97 -0
  59. data/ext/ed25519_ref10/ge_madd.h +88 -0
  60. data/ext/ed25519_ref10/ge_msub.h +88 -0
  61. data/ext/ed25519_ref10/ge_p2_dbl.h +73 -0
  62. data/ext/ed25519_ref10/ge_sub.h +97 -0
  63. data/ext/ed25519_ref10/keypair.c +22 -0
  64. data/ext/ed25519_ref10/open.c +47 -0
  65. data/ext/ed25519_ref10/pow22523.h +160 -0
  66. data/ext/ed25519_ref10/pow225521.h +160 -0
  67. data/ext/ed25519_ref10/sc.h +17 -0
  68. data/ext/ed25519_ref10/sc_muladd.c +366 -0
  69. data/ext/ed25519_ref10/sc_reduce.c +272 -0
  70. data/ext/ed25519_ref10/sha512.c +304 -0
  71. data/ext/ed25519_ref10/sha512.h +8 -0
  72. data/ext/ed25519_ref10/sign.c +41 -0
  73. data/ext/ed25519_ref10/sqrtm1.h +1 -0
  74. data/ext/ed25519_ref10/verify.c +40 -0
  75. data/lib/ed25519.rb +72 -0
  76. data/lib/ed25519/signing_key.rb +60 -0
  77. data/lib/ed25519/verify_key.rb +44 -0
  78. data/lib/ed25519/version.rb +5 -0
  79. metadata +137 -0
@@ -0,0 +1,8 @@
1
+ #ifndef SHA512_H
2
+ #define SHA512_H
3
+
4
+ #include <stdint.h>
5
+
6
+ int crypto_hash_sha512(uint8_t *out,const uint8_t *in,uint64_t inlen);
7
+
8
+ #endif /* SHA512_H */
@@ -0,0 +1,41 @@
1
+ #include <string.h>
2
+ #include "ed25519_ref10.h"
3
+ #include "sha512.h"
4
+ #include "ge.h"
5
+ #include "sc.h"
6
+
7
+ int crypto_sign_ed25519_ref10(
8
+ uint8_t *sm, uint64_t *smlen,
9
+ const uint8_t *m, uint64_t mlen,
10
+ const uint8_t *sk
11
+ )
12
+ {
13
+ unsigned char pk[32];
14
+ unsigned char az[64];
15
+ unsigned char nonce[64];
16
+ unsigned char hram[64];
17
+ ge_p3 R;
18
+
19
+ memmove(pk,sk + 32,32);
20
+
21
+ crypto_hash_sha512(az,sk,32);
22
+ az[0] &= 248;
23
+ az[31] &= 63;
24
+ az[31] |= 64;
25
+
26
+ *smlen = mlen + 64;
27
+ memmove(sm + 64,m,mlen);
28
+ memmove(sm + 32,az + 32,32);
29
+ crypto_hash_sha512(nonce,sm + 32,mlen + 32);
30
+ memmove(sm + 32,pk,32);
31
+
32
+ sc_reduce(nonce);
33
+ ge_scalarmult_base(&R,nonce);
34
+ ge_p3_tobytes(sm,&R);
35
+
36
+ crypto_hash_sha512(hram,sm,mlen + 64);
37
+ sc_reduce(hram);
38
+ sc_muladd(sm + 32,hram,az,nonce);
39
+
40
+ return 0;
41
+ }
@@ -0,0 +1 @@
1
+ -32595792,-7943725,9377950,3500415,12389472,-272473,-25146209,-2005654,326686,11406482
@@ -0,0 +1,40 @@
1
+ #include "ed25519_ref10.h"
2
+
3
+ int crypto_verify_32(const uint8_t *x,const uint8_t *y)
4
+ {
5
+ unsigned int differentbits = 0;
6
+ #define F(i) differentbits |= x[i] ^ y[i];
7
+ F(0)
8
+ F(1)
9
+ F(2)
10
+ F(3)
11
+ F(4)
12
+ F(5)
13
+ F(6)
14
+ F(7)
15
+ F(8)
16
+ F(9)
17
+ F(10)
18
+ F(11)
19
+ F(12)
20
+ F(13)
21
+ F(14)
22
+ F(15)
23
+ F(16)
24
+ F(17)
25
+ F(18)
26
+ F(19)
27
+ F(20)
28
+ F(21)
29
+ F(22)
30
+ F(23)
31
+ F(24)
32
+ F(25)
33
+ F(26)
34
+ F(27)
35
+ F(28)
36
+ F(29)
37
+ F(30)
38
+ F(31)
39
+ return (1 & ((differentbits - 1) >> 8)) - 1;
40
+ }
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "ed25519/version"
4
+ require "ed25519/signing_key"
5
+ require "ed25519/verify_key"
6
+
7
+ # The Ed25519 digital signatre algorithm
8
+ # rubocop:disable Metrics/LineLength
9
+ module Ed25519
10
+ module_function
11
+
12
+ # Size of an Ed25519 key (public or private) in bytes
13
+ KEY_SIZE = 32
14
+
15
+ # Size of an Ed25519 signature in bytes
16
+ SIGNATURE_SIZE = 64
17
+
18
+ # Raised when a signature fails to verify
19
+ VerifyError = Class.new(StandardError)
20
+
21
+ # Raised when the built-in self-test fails
22
+ SelfTestFailure = Class.new(StandardError)
23
+
24
+ class << self
25
+ # Obtain the backend provider module used to perform signatures
26
+ attr_accessor :provider
27
+ end
28
+
29
+ # Select the Ed25519::Provider to use based on the current environment
30
+ if defined? JRUBY_VERSION
31
+ require "ed25519_jruby"
32
+ self.provider = org.cryptorb.Ed25519Provider.createEd25519Module(JRuby.runtime)
33
+ else
34
+ require "ed25519_ref10"
35
+ self.provider = Ed25519::Provider::Ref10
36
+ end
37
+
38
+ # Ensure a serialized key meets the requirements
39
+ def validate_key_bytes(key_bytes)
40
+ raise TypeError, "expected String, got #{key_bytes.class}" unless key_bytes.is_a?(String)
41
+ return true if key_bytes.bytesize == KEY_SIZE
42
+ raise ArgumentError, "expected #{KEY_SIZE}-byte String, got #{key_bytes.bytesize}"
43
+ end
44
+
45
+ # Perform a self-test to ensure the selected provider is working
46
+ def self_test
47
+ signature_key = Ed25519::SigningKey.new("A" * 32)
48
+ raise SelfTestFailure, "failed to generate verify key correctly" unless signature_key.verify_key.to_bytes.unpack("H*").first == "db995fe25169d141cab9bbba92baa01f9f2e1ece7df4cb2ac05190f37fcc1f9d"
49
+
50
+ message = "crypto libraries should self-test on boot"
51
+ signature = signature_key.sign(message)
52
+ raise SelfTestFailure, "failed to generate correct signature" unless signature.unpack("H*").first == "c62c12a3a6cbfa04800d4be81468ef8aecd152a6a26a81d91257baecef13ba209531fe905a843e833c8b71cee04400fa2af3a29fef1152ece470421848758d0a"
53
+
54
+ verify_key = signature_key.verify_key
55
+ raise SelfTestFailure, "failed to verify a valid signature" unless verify_key.verify(signature, message)
56
+
57
+ bad_signature = signature[0...63] + "X"
58
+ ex = nil
59
+
60
+ # rubocop:disable Lint/HandleExceptions
61
+ begin
62
+ verify_key.verify(bad_signature, message)
63
+ rescue Ed25519::VerifyError => ex
64
+ end
65
+ # rubocop:enable Lint/HandleExceptions
66
+
67
+ raise SelfTestFailure, "failed to detect an invalid signature" unless ex.is_a?(Ed25519::VerifyError)
68
+ end
69
+ end
70
+
71
+ # Automatically run self-test when library loads
72
+ Ed25519.self_test
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "securerandom"
4
+
5
+ module Ed25519
6
+ # Private key for producing digital signatures
7
+ class SigningKey
8
+ attr_reader :seed, :keypair, :verify_key
9
+
10
+ # Generate a random Ed25519 signing key (i.e. private scalar)
11
+ def self.generate
12
+ new SecureRandom.random_bytes(Ed25519::KEY_SIZE)
13
+ end
14
+
15
+ # Create a SigningKey from a 64-byte Ed25519 keypair (i.e. public + private)
16
+ #
17
+ # @param keypair [String] 64-byte keypair value containing both seed + public key
18
+ def self.from_keypair(keypair)
19
+ raise TypeError, "expected String, got #{keypair.class}" unless keypair.is_a?(String)
20
+ raise ArgumentError, "expected 64-byte String, got #{keypair.bytesize}" unless keypair.bytesize == 64
21
+
22
+ new(keypair[0, KEY_SIZE]).tap do |key|
23
+ raise ArgumentError, "corrupt keypair" unless keypair[KEY_SIZE, KEY_SIZE] == key.verify_key.to_bytes
24
+ end
25
+ end
26
+
27
+ # Create a new Ed25519::SigningKey from the given seed value
28
+ #
29
+ # @param seed [String] 32-byte seed value from which the key should be derived
30
+ def initialize(seed)
31
+ Ed25519.validate_key_bytes(seed)
32
+
33
+ @seed = seed
34
+ @keypair = Ed25519.provider.create_keypair(seed)
35
+ @verify_key = VerifyKey.new(@keypair[32, 32])
36
+ end
37
+
38
+ # Sign the given message, returning an Ed25519 signature
39
+ #
40
+ # @param message [String] message to be signed
41
+ #
42
+ # @return [String] 64-byte Ed25519 signature
43
+ def sign(message)
44
+ Ed25519.provider.sign(@keypair, message)
45
+ end
46
+
47
+ # String inspection that does not leak secret values
48
+ def inspect
49
+ to_s
50
+ end
51
+
52
+ # Return a bytestring representation of this signing key
53
+ #
54
+ # @return [String] signing key converted to a bytestring
55
+ def to_bytes
56
+ seed
57
+ end
58
+ alias to_str to_bytes
59
+ end
60
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ed25519
4
+ # Public key for verifying digital signatures
5
+ class VerifyKey
6
+ # Create a Ed25519::VerifyKey from its serialized Twisted Edwards representation
7
+ #
8
+ # @param key [String] 32-byte string representing a serialized public key
9
+ def initialize(key)
10
+ Ed25519.validate_key_bytes(key)
11
+ @key_bytes = key
12
+ end
13
+
14
+ # Verify an Ed25519 signature against the message
15
+ #
16
+ # @param signature [String] 64-byte string containing an Ed25519 signature
17
+ # @param message [String] string containing message to be verified
18
+ #
19
+ # @raise Ed25519::VerifyError signature verification failed
20
+ #
21
+ # @return [true] message verified successfully
22
+ def verify(signature, message)
23
+ if signature.length != SIGNATURE_SIZE
24
+ raise ArgumentError, "expected #{SIGNATURE_SIZE} byte signature, got #{signature.length}"
25
+ end
26
+
27
+ return true if Ed25519.provider.verify(@key_bytes, signature, message)
28
+ raise VerifyError, "signature verification failed!"
29
+ end
30
+
31
+ # Return a compressed twisted Edwards coordinate representing the public key
32
+ #
33
+ # @return [String] bytestring serialization of this public key
34
+ def to_bytes
35
+ @key_bytes
36
+ end
37
+ alias to_str to_bytes
38
+
39
+ # Show hex representation of serialized coordinate in string inspection
40
+ def inspect
41
+ "#<#{self.class}:#{@key_bytes.unpack('H*').first}>"
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ed25519
4
+ VERSION = "1.2.4"
5
+ end
metadata ADDED
@@ -0,0 +1,137 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ed25519
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.2.4
5
+ platform: java
6
+ authors:
7
+ - Tony Arcieri
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-01-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.16'
19
+ name: bundler
20
+ prerelease: false
21
+ type: :development
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ description: A Ruby binding to the Ed25519 elliptic curve public-key signature system
28
+ described in RFC 8032.
29
+ email:
30
+ - tony.arcieri@gmail.com
31
+ executables: []
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - ".gitignore"
36
+ - ".rspec"
37
+ - ".rubocop.yml"
38
+ - ".travis.yml"
39
+ - CHANGES.md
40
+ - CODE_OF_CONDUCT.md
41
+ - Gemfile
42
+ - LICENSE
43
+ - README.md
44
+ - Rakefile
45
+ - appveyor.yml
46
+ - ed25519.gemspec
47
+ - ed25519.png
48
+ - ext/ed25519_jruby/LICENSE.txt
49
+ - ext/ed25519_jruby/README.md
50
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/EdDSAEngine.java
51
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/EdDSAKey.java
52
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/EdDSAPrivateKey.java
53
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/EdDSAPublicKey.java
54
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/EdDSASecurityProvider.java
55
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/KeyFactory.java
56
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/KeyPairGenerator.java
57
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/Utils.java
58
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/math/Constants.java
59
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/math/Curve.java
60
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/math/Encoding.java
61
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/math/Field.java
62
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/math/FieldElement.java
63
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/math/GroupElement.java
64
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/math/ScalarOps.java
65
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/math/bigint/BigIntegerFieldElement.java
66
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/math/bigint/BigIntegerLittleEndianEncoding.java
67
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/math/bigint/BigIntegerScalarOps.java
68
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/math/bigint/package.html
69
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/math/ed25519/Ed25519FieldElement.java
70
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/math/ed25519/Ed25519LittleEndianEncoding.java
71
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/math/ed25519/Ed25519ScalarOps.java
72
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/spec/EdDSAGenParameterSpec.java
73
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/spec/EdDSANamedCurveSpec.java
74
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/spec/EdDSANamedCurveTable.java
75
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/spec/EdDSAParameterSpec.java
76
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/spec/EdDSAPrivateKeySpec.java
77
+ - ext/ed25519_jruby/net/i2p/crypto/eddsa/spec/EdDSAPublicKeySpec.java
78
+ - ext/ed25519_jruby/org/cryptorb/Ed25519Provider.java
79
+ - ext/ed25519_ref10/api.h
80
+ - ext/ed25519_ref10/base.h
81
+ - ext/ed25519_ref10/base2.h
82
+ - ext/ed25519_ref10/d.h
83
+ - ext/ed25519_ref10/d2.h
84
+ - ext/ed25519_ref10/ed25519_ref10.c
85
+ - ext/ed25519_ref10/ed25519_ref10.h
86
+ - ext/ed25519_ref10/extconf.rb
87
+ - ext/ed25519_ref10/fe.c
88
+ - ext/ed25519_ref10/fe.h
89
+ - ext/ed25519_ref10/ge.c
90
+ - ext/ed25519_ref10/ge.h
91
+ - ext/ed25519_ref10/ge_add.h
92
+ - ext/ed25519_ref10/ge_madd.h
93
+ - ext/ed25519_ref10/ge_msub.h
94
+ - ext/ed25519_ref10/ge_p2_dbl.h
95
+ - ext/ed25519_ref10/ge_sub.h
96
+ - ext/ed25519_ref10/keypair.c
97
+ - ext/ed25519_ref10/open.c
98
+ - ext/ed25519_ref10/pow22523.h
99
+ - ext/ed25519_ref10/pow225521.h
100
+ - ext/ed25519_ref10/sc.h
101
+ - ext/ed25519_ref10/sc_muladd.c
102
+ - ext/ed25519_ref10/sc_reduce.c
103
+ - ext/ed25519_ref10/sha512.c
104
+ - ext/ed25519_ref10/sha512.h
105
+ - ext/ed25519_ref10/sign.c
106
+ - ext/ed25519_ref10/sqrtm1.h
107
+ - ext/ed25519_ref10/verify.c
108
+ - lib/ed25519.rb
109
+ - lib/ed25519/signing_key.rb
110
+ - lib/ed25519/verify_key.rb
111
+ - lib/ed25519/version.rb
112
+ - lib/ed25519_jruby.jar
113
+ homepage: https://github.com/crypto-rb/ed25519
114
+ licenses:
115
+ - MIT
116
+ metadata: {}
117
+ post_install_message:
118
+ rdoc_options: []
119
+ require_paths:
120
+ - lib
121
+ required_ruby_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: 2.0.0
126
+ required_rubygems_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ requirements: []
132
+ rubyforge_project:
133
+ rubygems_version: 2.7.4
134
+ signing_key:
135
+ specification_version: 4
136
+ summary: An efficient digital signature library providing the Ed25519 algorithm
137
+ test_files: []