ed25519 0.1.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 +7 -0
- data/.gitignore +15 -0
- data/.rspec +5 -0
- data/.rubocop.yml +35 -0
- data/.travis.yml +13 -0
- data/CHANGES.md +3 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +12 -0
- data/LICENSE +22 -0
- data/README.md +156 -0
- data/Rakefile +27 -0
- data/ed25519.gemspec +32 -0
- data/ed25519.png +0 -0
- data/ext/ed25519/api.h +4 -0
- data/ext/ed25519/crypto_int32.h +6 -0
- data/ext/ed25519/crypto_sign.h +13 -0
- data/ext/ed25519/crypto_uint32.h +6 -0
- data/ext/ed25519/crypto_verify_32.h +7 -0
- data/ext/ed25519/ed25519.c +136 -0
- data/ext/ed25519/ed25519_engine.c +82 -0
- data/ext/ed25519/extconf.rb +6 -0
- data/ext/ed25519/fe25519.c +326 -0
- data/ext/ed25519/fe25519.h +63 -0
- data/ext/ed25519/ge25519.c +311 -0
- data/ext/ed25519/ge25519.h +35 -0
- data/ext/ed25519/ge25519_base.data +850 -0
- data/ext/ed25519/org/cryptosphere/ed25519.java +228 -0
- data/ext/ed25519/sc25519.c +298 -0
- data/ext/ed25519/sc25519.h +73 -0
- data/ext/ed25519/sha512-blocks.c +239 -0
- data/ext/ed25519/sha512-hash.c +72 -0
- data/ext/ed25519/sha512.h +4 -0
- data/ext/ed25519/verify.c +40 -0
- data/lib/ed25519.rb +34 -0
- data/lib/ed25519/jruby_engine.rb +30 -0
- data/lib/ed25519/signing_key.rb +35 -0
- data/lib/ed25519/verify_key.rb +28 -0
- data/lib/ed25519/version.rb +5 -0
- data/tasks/extension.rake +14 -0
- data/tasks/rspec.rake +9 -0
- metadata +98 -0
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "java"
|
4
|
+
|
5
|
+
module Ed25519
|
6
|
+
# Core functionality provided by an Ed25519 library
|
7
|
+
module Engine
|
8
|
+
module_function
|
9
|
+
|
10
|
+
def create_keypair(seed)
|
11
|
+
raise ArgumentError, "seed must be 32 bytes long" unless seed.length == 32
|
12
|
+
|
13
|
+
verify_key = org.cryptosphere.ed25519.publickey(seed.to_java_bytes)
|
14
|
+
verify_key = String.from_java_bytes(verify_key)
|
15
|
+
[verify_key, seed + verify_key]
|
16
|
+
end
|
17
|
+
|
18
|
+
def sign(signing_key, message)
|
19
|
+
verify_key = signing_key[32...64].to_java_bytes
|
20
|
+
signing_key = signing_key[0...32].to_java_bytes
|
21
|
+
|
22
|
+
signature = org.cryptosphere.ed25519.signature(message.to_java_bytes, signing_key, verify_key)
|
23
|
+
String.from_java_bytes(signature)
|
24
|
+
end
|
25
|
+
|
26
|
+
def verify(verify_key, signature, message)
|
27
|
+
org.cryptosphere.ed25519.checkvalid(signature.to_java_bytes, message.to_java_bytes, verify_key.to_java_bytes)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,35 @@
|
|
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 :verify_key
|
9
|
+
|
10
|
+
def self.generate
|
11
|
+
new SecureRandom.random_bytes(Ed25519::SECRET_KEY_BYTES)
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(seed)
|
15
|
+
raise ArgumentError, "seed must be 32 bytes long" unless seed.length == SECRET_KEY_BYTES
|
16
|
+
@seed = seed
|
17
|
+
|
18
|
+
verify_key, @signing_key = Ed25519::Engine.create_keypair(seed)
|
19
|
+
@verify_key = VerifyKey.new(verify_key)
|
20
|
+
end
|
21
|
+
|
22
|
+
def sign(message)
|
23
|
+
Ed25519::Engine.sign(@signing_key, message)
|
24
|
+
end
|
25
|
+
|
26
|
+
def inspect
|
27
|
+
to_s
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_bytes
|
31
|
+
@seed
|
32
|
+
end
|
33
|
+
alias to_str to_bytes
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Ed25519
|
4
|
+
# Public key for verifying digital signatures
|
5
|
+
class VerifyKey
|
6
|
+
def initialize(key)
|
7
|
+
raise ArgumentError, "seed must be 32 bytes long" unless key.length == PUBLIC_KEY_BYTES
|
8
|
+
@key = key
|
9
|
+
end
|
10
|
+
|
11
|
+
def verify(signature, message)
|
12
|
+
if signature.length != SIGNATURE_BYTES
|
13
|
+
raise ArgumentError, "expected #{SIGNATURE_BYTES} byte signature, got #{signature.length}"
|
14
|
+
end
|
15
|
+
|
16
|
+
Ed25519::Engine.verify(@key, signature, message)
|
17
|
+
end
|
18
|
+
|
19
|
+
def inspect
|
20
|
+
to_s
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_bytes
|
24
|
+
@key
|
25
|
+
end
|
26
|
+
alias to_str to_bytes
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
if defined? JRUBY_VERSION
|
4
|
+
require "rake/javaextensiontask"
|
5
|
+
Rake::JavaExtensionTask.new("ed25519_engine") do |ext|
|
6
|
+
ext.ext_dir = "ext/ed25519"
|
7
|
+
end
|
8
|
+
else
|
9
|
+
require "rake/extensiontask"
|
10
|
+
|
11
|
+
Rake::ExtensionTask.new("ed25519_engine") do |ext|
|
12
|
+
ext.ext_dir = "ext/ed25519"
|
13
|
+
end
|
14
|
+
end
|
data/tasks/rspec.rake
ADDED
metadata
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ed25519
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tony Arcieri
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-12-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.16'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
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
|
+
- ext/ed25519/extconf.rb
|
34
|
+
extra_rdoc_files: []
|
35
|
+
files:
|
36
|
+
- ".gitignore"
|
37
|
+
- ".rspec"
|
38
|
+
- ".rubocop.yml"
|
39
|
+
- ".travis.yml"
|
40
|
+
- CHANGES.md
|
41
|
+
- CODE_OF_CONDUCT.md
|
42
|
+
- Gemfile
|
43
|
+
- LICENSE
|
44
|
+
- README.md
|
45
|
+
- Rakefile
|
46
|
+
- ed25519.gemspec
|
47
|
+
- ed25519.png
|
48
|
+
- ext/ed25519/api.h
|
49
|
+
- ext/ed25519/crypto_int32.h
|
50
|
+
- ext/ed25519/crypto_sign.h
|
51
|
+
- ext/ed25519/crypto_uint32.h
|
52
|
+
- ext/ed25519/crypto_verify_32.h
|
53
|
+
- ext/ed25519/ed25519.c
|
54
|
+
- ext/ed25519/ed25519_engine.c
|
55
|
+
- ext/ed25519/extconf.rb
|
56
|
+
- ext/ed25519/fe25519.c
|
57
|
+
- ext/ed25519/fe25519.h
|
58
|
+
- ext/ed25519/ge25519.c
|
59
|
+
- ext/ed25519/ge25519.h
|
60
|
+
- ext/ed25519/ge25519_base.data
|
61
|
+
- ext/ed25519/org/cryptosphere/ed25519.java
|
62
|
+
- ext/ed25519/sc25519.c
|
63
|
+
- ext/ed25519/sc25519.h
|
64
|
+
- ext/ed25519/sha512-blocks.c
|
65
|
+
- ext/ed25519/sha512-hash.c
|
66
|
+
- ext/ed25519/sha512.h
|
67
|
+
- ext/ed25519/verify.c
|
68
|
+
- lib/ed25519.rb
|
69
|
+
- lib/ed25519/jruby_engine.rb
|
70
|
+
- lib/ed25519/signing_key.rb
|
71
|
+
- lib/ed25519/verify_key.rb
|
72
|
+
- lib/ed25519/version.rb
|
73
|
+
- tasks/extension.rake
|
74
|
+
- tasks/rspec.rake
|
75
|
+
homepage: https://github.com/cryptosphere/ed25519
|
76
|
+
licenses: []
|
77
|
+
metadata: {}
|
78
|
+
post_install_message:
|
79
|
+
rdoc_options: []
|
80
|
+
require_paths:
|
81
|
+
- lib
|
82
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: 2.2.2
|
87
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
requirements: []
|
93
|
+
rubyforge_project:
|
94
|
+
rubygems_version: 2.6.13
|
95
|
+
signing_key:
|
96
|
+
specification_version: 4
|
97
|
+
summary: An efficient digital signature library providing the Ed25519 algorithm
|
98
|
+
test_files: []
|