-
Notifications
You must be signed in to change notification settings - Fork 32
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add support for CryptoRb ed25519 and x25519 libraries [see #8]
- Loading branch information
1 parent
8b8fa70
commit ff432bc
Showing
11 changed files
with
292 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
2.3.1 | ||
2.5.1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
module JOSE::JWA::Curve25519_CryptoRb | ||
|
||
extend self | ||
|
||
def __ruby__?; false; end | ||
|
||
def __supported__? | ||
return @supported ||= begin | ||
begin | ||
require 'ed25519' | ||
rescue LoadError | ||
end | ||
begin | ||
require 'x25519' | ||
rescue LoadError | ||
end | ||
!!(defined?(Ed25519::SigningKey) and defined?(X25519::Scalar)) | ||
end | ||
end | ||
|
||
def ed25519_keypair(secret = nil) | ||
return JOSE::JWA::Ed25519_CryptoRb.keypair(secret) | ||
end | ||
|
||
def ed25519_secret_to_public(sk) | ||
return JOSE::JWA::Ed25519_CryptoRb.sk_to_pk(sk) | ||
end | ||
|
||
def ed25519_sign(m, sk) | ||
return JOSE::JWA::Ed25519_CryptoRb.sign(m, sk) | ||
end | ||
|
||
def ed25519_verify(sig, m, pk) | ||
return JOSE::JWA::Ed25519_CryptoRb.verify(sig, m, pk) | ||
end | ||
|
||
def ed25519ph_keypair(secret = nil) | ||
return JOSE::JWA::Ed25519_CryptoRb.keypair(secret) | ||
end | ||
|
||
def ed25519ph_secret_to_public(sk) | ||
return JOSE::JWA::Ed25519_CryptoRb.sk_to_pk(sk) | ||
end | ||
|
||
def ed25519ph_sign(m, sk) | ||
return JOSE::JWA::Ed25519_CryptoRb.sign_ph(m, sk) | ||
end | ||
|
||
def ed25519ph_verify(sig, m, pk) | ||
return JOSE::JWA::Ed25519_CryptoRb.verify_ph(sig, m, pk) | ||
end | ||
|
||
def x25519_keypair(secret = nil) | ||
return JOSE::JWA::X25519_CryptoRb.keypair(secret) | ||
end | ||
|
||
def x25519_secret_to_public(sk) | ||
return JOSE::JWA::X25519_CryptoRb.sk_to_pk(sk) | ||
end | ||
|
||
def x25519_shared_secret(pk, sk) | ||
return JOSE::JWA::X25519_CryptoRb.shared_secret(pk, sk) | ||
end | ||
|
||
end | ||
|
||
JOSE::JWA::Curve25519.__register__(JOSE::JWA::Curve25519_CryptoRb) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
module JOSE::JWA::Ed25519_CryptoRb | ||
|
||
extend self | ||
|
||
def keypair(secret = nil) | ||
secret ||= Ed25519::SigningKey.generate() | ||
sk = coerce_signing_key!(secret) | ||
pk = sk.verify_key() | ||
return pk.to_bytes(), sk.keypair() | ||
end | ||
|
||
def sk_to_pk(sk) | ||
return sk[Ed25519::KEY_SIZE..-1] | ||
end | ||
|
||
def sign(m, sk) | ||
signing_key = coerce_signing_key!(sk) | ||
return signing_key.sign(m) | ||
end | ||
|
||
def sign_ph(m, sk) | ||
return sign(Digest::SHA512.digest(m), sk) | ||
end | ||
|
||
def verify(sig, m, pk) | ||
return Ed25519::VerifyKey.new(pk).verify(sig, m) | ||
end | ||
|
||
def verify_ph(sig, m, pk) | ||
return verify(sig, Digest::SHA512.digest(m), pk) | ||
end | ||
|
||
def coerce_signing_key!(sk) | ||
return sk if sk.is_a?(Ed25519::SigningKey) | ||
sk = | ||
if not sk.respond_to?(:bytesize) | ||
begin | ||
JOSE::JWA::Ed25519.coerce_secret_bytes!(sk) | ||
rescue ArgumentError | ||
JOSE::JWA::Ed25519.coerce_secretkey_bytes!(sk) | ||
end | ||
else | ||
sk | ||
end | ||
return Ed25519::SigningKey.from_keypair(sk) if sk.bytesize === JOSE::JWA::Ed25519::C_secretkeybytes | ||
return Ed25519::SigningKey.new(sk) | ||
end | ||
|
||
def coerce_verify_key!(pk) | ||
return pk if pk.is_a?(Ed25519::VerifyKey) | ||
pk = JOSE::JWA::Ed25519.coerce_publickey_bytes!(pk) if not pk.respond_to?(:bytesize) | ||
return Ed25519::VerifyKey.new(pk) | ||
end | ||
|
||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
module JOSE::JWA::X25519_CryptoRb | ||
|
||
extend self | ||
|
||
def curve25519(k, u) | ||
k = coerce_scalar!(k) | ||
u = coerce_montgomery_u!(u) | ||
return k.diffie_hellman(u) | ||
end | ||
|
||
def x25519(sk, pk) | ||
return curve25519(sk, pk).to_bytes() | ||
end | ||
|
||
def x25519_base(sk) | ||
scalar = coerce_scalar!(sk) | ||
return scalar.public_key.to_bytes() | ||
end | ||
|
||
def keypair(sk = nil) | ||
sk ||= X25519::Scalar.generate() | ||
scalar = coerce_scalar!(sk) | ||
pk = sk_to_pk(scalar) | ||
return pk, scalar.to_bytes() | ||
end | ||
|
||
def shared_secret(pk, sk) | ||
return x25519(sk, pk) | ||
end | ||
|
||
def sk_to_pk(sk) | ||
return x25519_base(sk) | ||
end | ||
|
||
def coerce_montgomery_u!(pk) | ||
return pk if pk.is_a?(X25519::MontgomeryU) | ||
pk = JOSE::JWA::X25519.coerce_coordinate_bytes!(u) if not pk.respond_to?(:bytesize) | ||
return X25519::MontgomeryU.new(pk) | ||
end | ||
|
||
def coerce_scalar!(sk) | ||
return sk if sk.is_a?(X25519::Scalar) | ||
sk = JOSE::JWA::X25519.coerce_scalar_bytes!(sk) if not sk.respond_to?(:bytesize) | ||
return X25519::Scalar.new(sk) | ||
end | ||
|
||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
require 'test_helper' | ||
|
||
class JOSE::JWA::Curve25519_CryptoRbTest < Minitest::Test | ||
|
||
EdDSA_SECRET = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].pack('C*') | ||
EdDSA_SK = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,106,39,188,206,182,164,45,98,163,168,208,42,111,13,115,101,50,21,119,29,226,67,166,58,192,72,161,139,89,218,41].pack('C*') | ||
EdDSA_PK = [59,106,39,188,206,182,164,45,98,163,168,208,42,111,13,115,101,50,21,119,29,226,67,166,58,192,72,161,139,89,218,41].pack('C*') | ||
EdDSA_M = [].pack('C*') | ||
Ed25519_SIGNATURE = [143,137,91,60,175,226,201,80,96,57,208,226,166,99,130,86,128,4,103,79,232,210,55,120,80,146,228,13,106,175,72,62,79,198,1,104,112,95,49,241,1,89,97,56,206,33,170,53,124,13,50,160,100,244,35,220,62,228,170,58,191,83,248,3].pack('C*') | ||
Ed25519ph_SIGNATURE = [156,203,202,248,117,129,126,7,75,58,114,37,34,97,88,28,107,134,137,45,226,153,205,227,223,176,47,120,25,58,104,151,0,98,205,14,60,170,233,142,178,63,207,181,133,191,210,47,240,169,14,31,162,243,195,196,214,28,175,237,234,99,76,4].pack('C*') | ||
Curve25519_SECRET = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64].pack('C*') | ||
Curve25519_PUBLIC = [47,229,125,163,71,205,98,67,21,40,218,172,95,187,41,7,48,255,246,132,175,196,207,194,237,144,153,95,88,203,59,116].pack('C*') | ||
Curve25519_SHARED = [147,254,162,167,193,174,182,44,253,100,82,255,91,173,174,139,223,252,189,113,150,220,145,12,137,148,64,6,216,93,187,104].pack('C*') | ||
|
||
def test_supported_methods | ||
if JOSE::JWA::Curve25519_CryptoRb.__supported__? | ||
[ | ||
[[EdDSA_PK, EdDSA_SK], :ed25519_keypair, EdDSA_SECRET], | ||
[EdDSA_PK, :ed25519_secret_to_public, EdDSA_SK], | ||
[Ed25519_SIGNATURE, :ed25519_sign, EdDSA_M, EdDSA_SK], | ||
[true, :ed25519_verify, Ed25519_SIGNATURE, EdDSA_M, EdDSA_PK], | ||
[[EdDSA_PK, EdDSA_SK], :ed25519ph_keypair, EdDSA_SECRET], | ||
[EdDSA_PK, :ed25519ph_secret_to_public, EdDSA_SK], | ||
[Ed25519ph_SIGNATURE, :ed25519ph_sign, EdDSA_M, EdDSA_SK], | ||
[true, :ed25519ph_verify, Ed25519ph_SIGNATURE, EdDSA_M, EdDSA_PK], | ||
[[Curve25519_PUBLIC, Curve25519_SECRET], :x25519_keypair, Curve25519_SECRET], | ||
[Curve25519_PUBLIC, :x25519_secret_to_public, Curve25519_SECRET], | ||
[Curve25519_SHARED, :x25519_shared_secret, Curve25519_PUBLIC, Curve25519_SECRET] | ||
].each do |(expected, function, *args)| | ||
assert_equal expected, JOSE::JWA::Curve25519_CryptoRb.send(function, *args) | ||
end | ||
end | ||
end | ||
|
||
end |