jwa 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.codeclimate.yml +15 -0
- data/.gitignore +17 -0
- data/.rspec +3 -0
- data/.rubocop.yml +16 -0
- data/.travis.yml +15 -0
- data/Gemfile +4 -0
- data/LICENSE.md +23 -0
- data/README.md +26 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/jwa.gemspec +27 -0
- data/lib/jwa.rb +16 -0
- data/lib/jwa/algorithms.rb +2 -0
- data/lib/jwa/algorithms/content_encryption.rb +29 -0
- data/lib/jwa/algorithms/content_encryption/a128_cbc_hs256.rb +29 -0
- data/lib/jwa/algorithms/content_encryption/a128_gcm.rb +25 -0
- data/lib/jwa/algorithms/content_encryption/a192_cbc_hs384.rb +29 -0
- data/lib/jwa/algorithms/content_encryption/a192_gcm.rb +25 -0
- data/lib/jwa/algorithms/content_encryption/a256_cbc_hs512.rb +29 -0
- data/lib/jwa/algorithms/content_encryption/a256_gcm.rb +25 -0
- data/lib/jwa/algorithms/content_encryption/aes_cbc_hs.rb +85 -0
- data/lib/jwa/algorithms/content_encryption/aes_gcm.rb +64 -0
- data/lib/jwa/algorithms/key_management.rb +56 -0
- data/lib/jwa/algorithms/key_management/a128_gcm_kw.rb +21 -0
- data/lib/jwa/algorithms/key_management/a128_kw.rb +21 -0
- data/lib/jwa/algorithms/key_management/a192_gcm_kw.rb +21 -0
- data/lib/jwa/algorithms/key_management/a192_kw.rb +21 -0
- data/lib/jwa/algorithms/key_management/a256_gcm_kw.rb +21 -0
- data/lib/jwa/algorithms/key_management/a256_kw.rb +21 -0
- data/lib/jwa/algorithms/key_management/aes_gcm_kw.rb +26 -0
- data/lib/jwa/algorithms/key_management/aes_kw.rb +100 -0
- data/lib/jwa/algorithms/key_management/ecdh_es.rb +45 -0
- data/lib/jwa/algorithms/key_management/ecdh_es_a128_kw.rb +25 -0
- data/lib/jwa/algorithms/key_management/ecdh_es_a192_kw.rb +25 -0
- data/lib/jwa/algorithms/key_management/ecdh_es_a256_kw.rb +25 -0
- data/lib/jwa/algorithms/key_management/ecdh_es_kw.rb +23 -0
- data/lib/jwa/algorithms/key_management/pbes2.rb +27 -0
- data/lib/jwa/algorithms/key_management/pbes_hs256_a128_kw.rb +25 -0
- data/lib/jwa/algorithms/key_management/pbes_hs384_a192_kw.rb +25 -0
- data/lib/jwa/algorithms/key_management/pbes_hs512_a256_kw.rb +25 -0
- data/lib/jwa/algorithms/key_management/rsa15.rb +20 -0
- data/lib/jwa/algorithms/key_management/rsa_oaep.rb +20 -0
- data/lib/jwa/cipher.rb +17 -0
- data/lib/jwa/support/concat_kdf.rb +29 -0
- data/lib/jwa/support/pbkdf2.rb +48 -0
- data/lib/jwa/version.rb +3 -0
- data/spec/jwa/algorithms/content_encryption/a128_cbc_hs256_spec.rb +30 -0
- data/spec/jwa/algorithms/content_encryption/a128_gcm_spec.rb +42 -0
- data/spec/jwa/algorithms/content_encryption/a192_cbc_hs384_spec.rb +34 -0
- data/spec/jwa/algorithms/content_encryption/a192_gcm_spec.rb +49 -0
- data/spec/jwa/algorithms/content_encryption/a256_cbc_hs512_spec.rb +35 -0
- data/spec/jwa/algorithms/content_encryption/a256_gcm_spec.rb +61 -0
- data/spec/jwa/algorithms/content_encryption/aes_cbc_hs_shared.rb +96 -0
- data/spec/jwa/algorithms/content_encryption/aes_gcm_shared.rb +60 -0
- data/spec/jwa/algorithms/content_encryption_spec.rb +7 -0
- data/spec/jwa/algorithms/key_management/a128_kw_spec.rb +43 -0
- data/spec/jwa/algorithms/key_management/a192_kw_spec.rb +29 -0
- data/spec/jwa/algorithms/key_management/a256_kw_spec.rb +29 -0
- data/spec/jwa/algorithms/key_management/ecdh_es_spec.rb +36 -0
- data/spec/jwa/algorithms/key_management/pbes2_hs256_a128_kw_spec.rb +27 -0
- data/spec/jwa/algorithms/key_management/pbes2_hs384_a192_kw_spec.rb +32 -0
- data/spec/jwa/algorithms/key_management/pbes2_hs512_a256_kw_spec.rb +32 -0
- data/spec/jwa/algorithms/key_management/rsa15_spec.rb +44 -0
- data/spec/jwa/algorithms/key_management/rsa_oaep_spec.rb +44 -0
- data/spec/jwa/algorithms/key_management_spec.rb +7 -0
- data/spec/jwa/cipher_spec.rb +7 -0
- data/spec/jwa/support/concat_kdf_spec.rb +32 -0
- data/spec/jwa/support/pbkdf2_spec.rb +111 -0
- data/spec/jwa_spec.rb +5 -0
- data/spec/spec_helper.rb +22 -0
- data/spec/support/ec1.json +7 -0
- data/spec/support/ec2.json +7 -0
- data/spec/support/hex_helpers.rb +9 -0
- data/spec/support/oct16.json +4 -0
- data/spec/support/oct24.json +4 -0
- data/spec/support/oct32.json +4 -0
- data/spec/support/rsa1.json +11 -0
- data/spec/support/rsa2.json +11 -0
- metadata +193 -0
@@ -0,0 +1,32 @@
|
|
1
|
+
# WARNING:
|
2
|
+
# No public test case was found, so this was artificially generated.
|
3
|
+
# The ciphertext here is what I expect it to be, not what is known to be correct.
|
4
|
+
# Hopefully it's still correct
|
5
|
+
|
6
|
+
describe JWA::Algorithms::KeyManagement::Pbes2Hs512A256Kw do
|
7
|
+
let(:password) { 'Thus from my lips, by yours, my sin is purged.' }
|
8
|
+
let(:salt) { int_byte_array_to_bytes([217, 96, 147, 112, 150, 117, 70, 247, 127, 8, 155, 137, 174, 42, 80, 215]) }
|
9
|
+
let(:iterations) { 4096 }
|
10
|
+
|
11
|
+
let(:plaintext) do
|
12
|
+
int_byte_array_to_bytes([111, 27, 25, 52, 66, 29, 20, 78, 92, 176, 56, 240, 65, 208, 82, 112,
|
13
|
+
161, 131, 36, 55, 202, 236, 185, 172, 129, 23, 153, 194, 195, 48,
|
14
|
+
253, 182])
|
15
|
+
end
|
16
|
+
|
17
|
+
let(:ciphertext) do
|
18
|
+
int_byte_array_to_bytes([39, 197, 106, 80, 194, 86, 68, 142, 208, 178, 205, 219, 128, 6, 150,
|
19
|
+
128, 95, 89, 173, 74, 146, 122, 27, 6, 246, 140, 179, 235, 92, 116,
|
20
|
+
188, 38, 248, 145, 218, 221, 14, 245, 131, 159])
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'decrypts predictably' do
|
24
|
+
alg = described_class.new(password, salt, iterations)
|
25
|
+
expect(alg.decrypt(ciphertext)).to eq plaintext
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'encrypts predictably' do
|
29
|
+
alg = described_class.new(password, salt, iterations)
|
30
|
+
expect(alg.encrypt(plaintext)).to eq ciphertext
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
describe JWA::Algorithms::KeyManagement::Rsa15 do
|
2
|
+
let(:jwk) { JWK::Key.from_json(File.read('spec/support/rsa2.json')) }
|
3
|
+
|
4
|
+
let(:plaintext) do
|
5
|
+
int_byte_array_to_bytes([4, 211, 31, 197, 84, 157, 252, 254, 11, 100, 157, 250, 63, 170, 106,
|
6
|
+
206, 107, 124, 212, 45, 111, 107, 9, 219, 200, 177, 0, 240, 143, 156,
|
7
|
+
44, 207])
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:known_ciphertext) do
|
11
|
+
int_byte_array_to_bytes([80, 104, 72, 58, 11, 130, 236, 139, 132, 189, 255, 205, 61, 86, 151,
|
12
|
+
176, 99, 40, 44, 233, 176, 189, 205, 70, 202, 169, 72, 40, 226, 181,
|
13
|
+
156, 223, 120, 156, 115, 232, 150, 209, 145, 133, 104, 112, 237, 156,
|
14
|
+
116, 250, 65, 102, 212, 210, 103, 240, 177, 61, 93, 40, 71, 231, 223,
|
15
|
+
226, 240, 157, 15, 31, 150, 89, 200, 215, 198, 203, 108, 70, 117, 66,
|
16
|
+
212, 238, 193, 205, 23, 161, 169, 218, 243, 203, 128, 214, 127, 253,
|
17
|
+
215, 139, 43, 17, 135, 103, 179, 220, 28, 2, 212, 206, 131, 158, 128,
|
18
|
+
66, 62, 240, 78, 186, 141, 125, 132, 227, 60, 137, 43, 31, 152, 199,
|
19
|
+
54, 72, 34, 212, 115, 11, 152, 101, 70, 42, 219, 233, 142, 66, 151,
|
20
|
+
250, 126, 146, 141, 216, 190, 73, 50, 177, 146, 5, 52, 247, 28, 197,
|
21
|
+
21, 59, 170, 247, 181, 89, 131, 241, 169, 182, 246, 99, 15, 36, 102,
|
22
|
+
166, 182, 172, 197, 136, 230, 120, 60, 58, 219, 243, 149, 94, 222,
|
23
|
+
150, 154, 194, 110, 227, 225, 112, 39, 89, 233, 112, 207, 211, 241,
|
24
|
+
124, 174, 69, 221, 179, 107, 196, 225, 127, 167, 112, 226, 12, 242,
|
25
|
+
16, 24, 28, 120, 182, 244, 213, 244, 153, 194, 162, 69, 160, 244,
|
26
|
+
248, 63, 165, 141, 4, 207, 249, 193, 79, 131, 0, 169, 233, 127, 167,
|
27
|
+
101, 151, 125, 56, 112, 111, 248, 29, 232, 90, 29, 147, 110, 169,
|
28
|
+
146, 114, 165, 204, 71, 136, 41, 252])
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'decrypts according to the Test Case (RFC 7516 - Section A.2)' do
|
32
|
+
key = jwk.to_openssl_key
|
33
|
+
|
34
|
+
alg = described_class.new(key)
|
35
|
+
expect(alg.decrypt(known_ciphertext)).to eq plaintext
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'encryption generates a ciphertext that decrypts correctly' do
|
39
|
+
key = jwk.to_openssl_key
|
40
|
+
|
41
|
+
alg = described_class.new(key)
|
42
|
+
expect(alg.decrypt(alg.encrypt(plaintext))).to eq plaintext
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
describe JWA::Algorithms::KeyManagement::RsaOaep do
|
2
|
+
let(:jwk) { JWK::Key.from_json(File.read('spec/support/rsa1.json')) }
|
3
|
+
|
4
|
+
let(:plaintext) do
|
5
|
+
int_byte_array_to_bytes([177, 161, 244, 128, 84, 143, 225, 115, 63, 180, 3, 255, 107, 154,
|
6
|
+
212, 246, 138, 7, 110, 91, 112, 46, 34, 105, 47, 130, 203, 46, 122,
|
7
|
+
234, 64, 252])
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:known_ciphertext) do
|
11
|
+
int_byte_array_to_bytes([56, 163, 154, 192, 58, 53, 222, 4, 105, 218, 136, 218, 29, 94, 203,
|
12
|
+
22, 150, 92, 129, 94, 211, 232, 53, 89, 41, 60, 138, 56, 196, 216,
|
13
|
+
82, 98, 168, 76, 37, 73, 70, 7, 36, 8, 191, 100, 136, 196, 244, 220,
|
14
|
+
145, 158, 138, 155, 4, 117, 141, 230, 199, 247, 173, 45, 182, 214,
|
15
|
+
74, 177, 107, 211, 153, 11, 205, 196, 171, 226, 162, 128, 171, 182,
|
16
|
+
13, 237, 239, 99, 193, 4, 91, 219, 121, 223, 107, 167, 61, 119, 228,
|
17
|
+
173, 156, 137, 134, 200, 80, 219, 74, 253, 56, 185, 91, 177, 34, 158,
|
18
|
+
89, 154, 205, 96, 55, 18, 138, 43, 96, 218, 215, 128, 124, 75, 138,
|
19
|
+
243, 85, 25, 109, 117, 140, 26, 155, 249, 67, 167, 149, 231, 100, 6,
|
20
|
+
41, 65, 214, 251, 232, 87, 72, 40, 182, 149, 154, 168, 31, 193, 126,
|
21
|
+
215, 89, 28, 111, 219, 125, 182, 139, 235, 195, 197, 23, 234, 55, 58,
|
22
|
+
63, 180, 68, 202, 206, 149, 75, 205, 248, 176, 67, 39, 178, 60, 98,
|
23
|
+
193, 32, 238, 122, 96, 158, 222, 57, 183, 111, 210, 55, 188, 215,
|
24
|
+
206, 180, 166, 150, 166, 106, 250, 55, 229, 72, 40, 69, 214, 216,
|
25
|
+
104, 23, 40, 135, 212, 28, 127, 41, 80, 175, 174, 168, 115, 171, 197,
|
26
|
+
89, 116, 92, 103, 246, 83, 216, 182, 176, 84, 37, 147, 35, 45, 219,
|
27
|
+
172, 99, 226, 233, 73, 37, 124, 42, 72, 49, 242, 35, 127, 184, 134,
|
28
|
+
117, 114, 135, 206])
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'decrypts according to the Test Case (RFC 7516 - Section A.1)' do
|
32
|
+
key = jwk.to_openssl_key
|
33
|
+
|
34
|
+
alg = described_class.new(key)
|
35
|
+
expect(alg.decrypt(known_ciphertext)).to eq plaintext
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'encryption generates a ciphertext that decrypts correctly' do
|
39
|
+
key = jwk.to_openssl_key
|
40
|
+
|
41
|
+
alg = described_class.new(key)
|
42
|
+
expect(alg.decrypt(alg.encrypt(plaintext))).to eq plaintext
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# WARNING:
|
2
|
+
# The only publicly known test case I could find involves is only about deriving
|
3
|
+
# a 128-bit Key from a SHA256 hash.
|
4
|
+
#
|
5
|
+
# This means that my implementation is only tested against SHA256 and for key
|
6
|
+
# size less than or equal to 256 bits (and incidentally, with a single round
|
7
|
+
# of the KDF function).
|
8
|
+
#
|
9
|
+
# This test case comes from JWE RFC 7518 Appendix C.
|
10
|
+
|
11
|
+
describe JWA::Support::ConcatKDF do
|
12
|
+
test_cases = [
|
13
|
+
{
|
14
|
+
hash: OpenSSL::Digest::SHA256.new,
|
15
|
+
z: [158, 86, 217, 29, 129, 113, 53, 211, 114, 131, 66, 131, 191, 132,
|
16
|
+
38, 156, 251, 49, 110, 163, 218, 128, 106, 72, 246, 218, 167, 121,
|
17
|
+
140, 254, 144, 196].map(&:chr).join,
|
18
|
+
info: [0, 0, 0, 7, 65, 49, 50, 56, 71, 67, 77, 0, 0, 0, 5, 65, 108, 105,
|
19
|
+
99, 101, 0, 0, 0, 3, 66, 111, 98, 0, 0, 0, 128].map(&:chr).join,
|
20
|
+
key_length: 128,
|
21
|
+
expected: [86, 170, 141, 234, 248, 35, 109, 32, 92, 34, 40, 205, 113, 167, 16, 26].map(&:chr).join
|
22
|
+
}
|
23
|
+
]
|
24
|
+
|
25
|
+
test_cases.each_with_index do |params, i|
|
26
|
+
subject { described_class.new(params[:hash]) }
|
27
|
+
|
28
|
+
it "derives according to test case #{i + 1}" do
|
29
|
+
expect(subject.run(params[:z], params[:info], params[:key_length])).to eq params[:expected]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
describe JWA::Support::PBKDF2 do
|
2
|
+
test_cases = [
|
3
|
+
{
|
4
|
+
password: 'password',
|
5
|
+
salt: 'ATHENA.MIT.EDUraeburn',
|
6
|
+
iterations: 1,
|
7
|
+
key_length: 16,
|
8
|
+
expected: 'cd ed b5 28 1b b2 f8 01 56 5a 11 22 b2 56 35 15'
|
9
|
+
},
|
10
|
+
{
|
11
|
+
password: 'password',
|
12
|
+
salt: 'ATHENA.MIT.EDUraeburn',
|
13
|
+
iterations: 1,
|
14
|
+
key_length: 32,
|
15
|
+
expected: 'cd ed b5 28 1b b2 f8 01 56 5a 11 22 b2 56 35 15 0a d1 f7 a0 4b b9 f3 a3 33 ec c0 e2 e1 f7 08 37'
|
16
|
+
},
|
17
|
+
{
|
18
|
+
password: 'password',
|
19
|
+
salt: 'ATHENA.MIT.EDUraeburn',
|
20
|
+
iterations: 2,
|
21
|
+
key_length: 16,
|
22
|
+
expected: '01 db ee 7f 4a 9e 24 3e 98 8b 62 c7 3c da 93 5d'
|
23
|
+
},
|
24
|
+
{
|
25
|
+
password: 'password',
|
26
|
+
salt: 'ATHENA.MIT.EDUraeburn',
|
27
|
+
iterations: 2,
|
28
|
+
key_length: 32,
|
29
|
+
expected: '01 db ee 7f 4a 9e 24 3e 98 8b 62 c7 3c da 93 5d a0 53 78 b9 32 44 ec 8f 48 a9 9e 61 ad 79 9d 86'
|
30
|
+
},
|
31
|
+
{
|
32
|
+
password: 'password',
|
33
|
+
salt: 'ATHENA.MIT.EDUraeburn',
|
34
|
+
iterations: 1200,
|
35
|
+
key_length: 16,
|
36
|
+
expected: '5c 08 eb 61 fd f7 1e 4e 4e c3 cf 6b a1 f5 51 2b'
|
37
|
+
},
|
38
|
+
{
|
39
|
+
password: 'password',
|
40
|
+
salt: 'ATHENA.MIT.EDUraeburn',
|
41
|
+
iterations: 1200,
|
42
|
+
key_length: 32,
|
43
|
+
expected: '5c 08 eb 61 fd f7 1e 4e 4e c3 cf 6b a1 f5 51 2b a7 e5 2d db c5 e5 14 2f 70 8a 31 e2 e6 2b 1e 13'
|
44
|
+
},
|
45
|
+
{
|
46
|
+
password: 'password',
|
47
|
+
salt: [0x1234567878563412].pack('Q'),
|
48
|
+
iterations: 5,
|
49
|
+
key_length: 16,
|
50
|
+
expected: 'd1 da a7 86 15 f2 87 e6 a1 c8 b1 20 d7 06 2a 49'
|
51
|
+
},
|
52
|
+
{
|
53
|
+
password: 'password',
|
54
|
+
salt: [0x1234567878563412].pack('Q'),
|
55
|
+
iterations: 5,
|
56
|
+
key_length: 32,
|
57
|
+
expected: 'd1 da a7 86 15 f2 87 e6 a1 c8 b1 20 d7 06 2a 49 3f 98 d2 03 e6 be 49 a6 ad f4 fa 57 4b 6e 64 ee'
|
58
|
+
},
|
59
|
+
{
|
60
|
+
password: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
|
61
|
+
salt: 'pass phrase equals block size',
|
62
|
+
iterations: 1200,
|
63
|
+
key_length: 16,
|
64
|
+
expected: '13 9c 30 c0 96 6b c3 2b a5 5f db f2 12 53 0a c9'
|
65
|
+
},
|
66
|
+
{
|
67
|
+
password: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
|
68
|
+
salt: 'pass phrase equals block size',
|
69
|
+
iterations: 1200,
|
70
|
+
key_length: 32,
|
71
|
+
expected: '13 9c 30 c0 96 6b c3 2b a5 5f db f2 12 53 0a c9 c5 ec 59 f1 a4 52 f5 cc 9a d9 40 fe a0 59 8e d1'
|
72
|
+
},
|
73
|
+
{
|
74
|
+
password: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
|
75
|
+
salt: 'pass phrase exceeds block size',
|
76
|
+
iterations: 1200,
|
77
|
+
key_length: 16,
|
78
|
+
expected: '9c ca d6 d4 68 77 0c d5 1b 10 e6 a6 87 21 be 61'
|
79
|
+
},
|
80
|
+
{
|
81
|
+
password: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
|
82
|
+
salt: 'pass phrase exceeds block size',
|
83
|
+
iterations: 1200,
|
84
|
+
key_length: 32,
|
85
|
+
expected: '9c ca d6 d4 68 77 0c d5 1b 10 e6 a6 87 21 be 61 1a 8b 4d 28 26 01 db 3b 36 be 92 46 91 5e c8 2a'
|
86
|
+
},
|
87
|
+
{
|
88
|
+
password: [0xf09d849e].pack('N'),
|
89
|
+
salt: 'EXAMPLE.COMpianist',
|
90
|
+
iterations: 50,
|
91
|
+
key_length: 16,
|
92
|
+
expected: '6b 9c f2 6d 45 45 5a 43 a5 b8 bb 27 6a 40 3b 39'
|
93
|
+
},
|
94
|
+
{
|
95
|
+
password: [0xf09d849e].pack('N'),
|
96
|
+
salt: 'EXAMPLE.COMpianist',
|
97
|
+
iterations: 50,
|
98
|
+
key_length: 32,
|
99
|
+
expected: '6b 9c f2 6d 45 45 5a 43 a5 b8 bb 27 6a 40 3b 39 e7 fe 37 a0 c4 1e 02 c2 81 ff 30 69 e1 e9 4f 52'
|
100
|
+
}
|
101
|
+
]
|
102
|
+
|
103
|
+
test_cases.each_with_index do |params, i|
|
104
|
+
subject { described_class.new(OpenSSL::Digest::SHA1.new) }
|
105
|
+
|
106
|
+
it "derives according to test case #{i + 1} of RFC 3962" do
|
107
|
+
expected = params[:expected].delete(' ')
|
108
|
+
expect(subject.run_hex(params[:password], params[:salt], params[:iterations], params[:key_length])).to eq expected
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
data/spec/jwa_spec.rb
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start do
|
3
|
+
add_filter 'spec/'
|
4
|
+
end
|
5
|
+
|
6
|
+
require 'bundler/setup'
|
7
|
+
require 'jwa'
|
8
|
+
|
9
|
+
Dir['spec/support/**/*.rb'].each { |f| require File.expand_path(f) }
|
10
|
+
|
11
|
+
RSpec.configure do |config|
|
12
|
+
config.include HexHelpers
|
13
|
+
|
14
|
+
# Enable flags like --only-failures and --next-failure
|
15
|
+
config.example_status_persistence_file_path = '.rspec_status'
|
16
|
+
|
17
|
+
config.expect_with :rspec do |c|
|
18
|
+
c.syntax = :expect
|
19
|
+
end
|
20
|
+
|
21
|
+
config.order = 'random'
|
22
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
{
|
2
|
+
"kty":"RSA",
|
3
|
+
"n":"oahUIoWw0K0usKNuOR6H4wkf4oBUXHTxRvgb48E-BVvxkeDNjbC4he8rUWcJoZmds2h7M70imEVhRU5djINXtqllXI4DFqcI1DgjT9LewND8MW2Krf3Spsk_ZkoFnilakGygTwpZ3uesH-PFABNIUYpOiN15dsQRkgr0vEhxN92i2asbOenSZeyaxziK72UwxrrKoExv6kc5twXTq4h-QChLOln0_mtUZwfsRaMStPs6mS6XrgxnxbWhojf663tuEQueGC-FCMfra36C9knDFGzKsNa7LZK2djYgyD3JR_MB_4NUJW_TqOQtwHYbxevoJArm-L5StowjzGy-_bq6Gw",
|
4
|
+
"e":"AQAB",
|
5
|
+
"d":"kLdtIj6GbDks_ApCSTYQtelcNttlKiOyPzMrXHeI-yk1F7-kpDxY4-WY5NWV5KntaEeXS1j82E375xxhWMHXyvjYecPT9fpwR_M9gV8n9Hrh2anTpTD93Dt62ypW3yDsJzBnTnrYu1iwWRgBKrEYY46qAZIrA2xAwnm2X7uGR1hghkqDp0Vqj3kbSCz1XyfCs6_LehBwtxHIyh8Ripy40p24moOAbgxVw3rxT_vlt3UVe4WO3JkJOzlpUf-KTVI2Ptgm-dARxTEtE-id-4OJr0h-K-VFs3VSndVTIznSxfyrj8ILL6MG_Uv8YAu7VILSB3lOW085-4qE3DzgrTjgyQ",
|
6
|
+
"p":"1r52Xk46c-LsfB5P442p7atdPUrxQSy4mti_tZI3Mgf2EuFVbUoDBvaRQ-SWxkbkmoEzL7JXroSBjSrK3YIQgYdMgyAEPTPjXv_hI2_1eTSPVZfzL0lffNn03IXqWF5MDFuoUYE0hzb2vhrlN_rKrbfDIwUbTrjjgieRbwC6Cl0",
|
7
|
+
"q":"wLb35x7hmQWZsWJmB_vle87ihgZ19S8lBEROLIsZG4ayZVe9Hi9gDVCOBmUDdaDYVTSNx_8Fyw1YYa9XGrGnDew00J28cRUoeBB_jKI1oma0Orv1T9aXIWxKwd4gvxFImOWr3QRL9KEBRzk2RatUBnmDZJTIAfwTs0g68UZHvtc",
|
8
|
+
"dp":"ZK-YwE7diUh0qR1tR7w8WHtolDx3MZ_OTowiFvgfeQ3SiresXjm9gZ5KLhMXvo-uz-KUJWDxS5pFQ_M0evdo1dKiRTjVw_x4NyqyXPM5nULPkcpU827rnpZzAJKpdhWAgqrXGKAECQH0Xt4taznjnd_zVpAmZZq60WPMBMfKcuE",
|
9
|
+
"dq":"Dq0gfgJ1DdFGXiLvQEZnuKEN0UUmsJBxkjydc3j4ZYdBiMRAy86x0vHCjywcMlYYg4yoC4YZa9hNVcsjqA3FeiL19rk8g6Qn29Tt0cj8qqyFpz9vNDBUfCAiJVeESOjJDZPYHdHY8v1b-o-Z2X5tvLx-TCekf7oxyeKDUqKWjis",
|
10
|
+
"qi":"VIMpMYbPf47dT1w_zDUXfPimsSegnMOA1zTaX7aGk_8urY6R8-ZW1FxU7AlWAyLWybqq6t16VFd7hQd0y6flUK4SlOydB61gwanOsXGOAOv82cHq0E3eL4HrtZkUuKvnPrMnsUUFlfUdybVzxyjz9JF_XyaY14ardLSjf4L_FNY"
|
11
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
{
|
2
|
+
"kty":"RSA",
|
3
|
+
"n":"sXchDaQebHnPiGvyDOAT4saGEUetSyo9MKLOoWFsueri23bOdgWp4Dy1WlUzewbgBHod5pcM9H95GQRV3JDXboIRROSBigeC5yjU1hGzHHyXss8UDprecbAYxknTcQkhslANGRUZmdTOQ5qTRsLAt6BTYuyvVRdhS8exSZEy_c4gs_7svlJJQ4H9_NxsiIoLwAEk7-Q3UXERGYw_75IDrGA84-lA_-Ct4eTlXHBIY2EaV7t7LjJaynVJCpkv4LKjTTAumiGUIuQhrNhZLuF_RJLqHpM2kgWFLU7-VTdL1VbC2tejvcI2BlMkEpk1BzBZI0KQB0GaDWFLN-aEAw3vRw",
|
4
|
+
"e":"AQAB",
|
5
|
+
"d":"VFCWOqXr8nvZNyaaJLXdnNPXZKRaWCjkU5Q2egQQpTBMwhprMzWzpR8Sxq1OPThh_J6MUD8Z35wky9b8eEO0pwNS8xlh1lOFRRBoNqDIKVOku0aZb-rynq8cxjDTLZQ6Fz7jSjR1Klop-YKaUHc9GsEofQqYruPhzSA-QgajZGPbE_0ZaVDJHfyd7UUBUKunFMScbflYAAOYJqVIVwaYR5zWEEceUjNnTNo_CVSj-VvXLO5VZfCUAVLgW4dpf1SrtZjSt34YLsRarSb127reG_DUwg9Ch-KyvjT1SkHgUWRVGcyly7uvVGRSDwsXypdrNinPA4jlhoNdizK2zF2CWQ",
|
6
|
+
"p":"9gY2w6I6S6L0juEKsbeDAwpd9WMfgqFoeA9vEyEUuk4kLwBKcoe1x4HG68ik918hdDSE9vDQSccA3xXHOAFOPJ8R9EeIAbTi1VwBYnbTp87X-xcPWlEPkrdoUKW60tgs1aNd_Nnc9LEVVPMS390zbFxt8TN_biaBgelNgbC95sM",
|
7
|
+
"q":"uKlCKvKv_ZJMVcdIs5vVSU_6cPtYI1ljWytExV_skstvRSNi9r66jdd9-yBhVfuG4shsp2j7rGnIio901RBeHo6TPKWVVykPu1iYhQXw1jIABfw-MVsN-3bQ76WLdt2SDxsHs7q7zPyUyHXmps7ycZ5c72wGkUwNOjYelmkiNS0",
|
8
|
+
"dp":"w0kZbV63cVRvVX6yk3C8cMxo2qCM4Y8nsq1lmMSYhG4EcL6FWbX5h9yuvngs4iLEFk6eALoUS4vIWEwcL4txw9LsWH_zKI-hwoReoP77cOdSL4AVcraHawlkpyd2TWjE5evgbhWtOxnZee3cXJBkAi64Ik6jZxbvk-RR3pEhnCs",
|
9
|
+
"dq":"o_8V14SezckO6CNLKs_btPdFiO9_kC1DsuUTd2LAfIIVeMZ7jn1Gus_Ff7B7IVx3p5KuBGOVF8L-qifLb6nQnLysgHDh132NDioZkhH7mI7hPG-PYE_odApKdnqECHWw0J-F0JWnUd6D2B_1TvF9mXA2Qx-iGYn8OVV1Bsmp6qU",
|
10
|
+
"qi":"eNho5yRBEBxhGBtQRww9QirZsB66TrfFReG_CcteI1aCneT0ELGhYlRlCtUkTRclIfuEPmNsNDPbLoLqqCVznFbvdB7x-Tl-m0l_eFTj2KiqwGqE9PZB9nNTwMVvH3VRRSLWACvPnSiwP8N5Usy-WRXS-V7TbpxIhvepTfE0NNo"
|
11
|
+
}
|
metadata
ADDED
@@ -0,0 +1,193 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jwa
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Francesco Boffa
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-11-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: jwk
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: simplecov
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: codeclimate-test-reporter
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: A Ruby implementation of the RFC 7518 JSON Web Algorithms (JWA) standard
|
84
|
+
email:
|
85
|
+
- fra.boffa@gmail.com
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- ".codeclimate.yml"
|
91
|
+
- ".gitignore"
|
92
|
+
- ".rspec"
|
93
|
+
- ".rubocop.yml"
|
94
|
+
- ".travis.yml"
|
95
|
+
- Gemfile
|
96
|
+
- LICENSE.md
|
97
|
+
- README.md
|
98
|
+
- Rakefile
|
99
|
+
- bin/console
|
100
|
+
- bin/setup
|
101
|
+
- jwa.gemspec
|
102
|
+
- lib/jwa.rb
|
103
|
+
- lib/jwa/algorithms.rb
|
104
|
+
- lib/jwa/algorithms/content_encryption.rb
|
105
|
+
- lib/jwa/algorithms/content_encryption/a128_cbc_hs256.rb
|
106
|
+
- lib/jwa/algorithms/content_encryption/a128_gcm.rb
|
107
|
+
- lib/jwa/algorithms/content_encryption/a192_cbc_hs384.rb
|
108
|
+
- lib/jwa/algorithms/content_encryption/a192_gcm.rb
|
109
|
+
- lib/jwa/algorithms/content_encryption/a256_cbc_hs512.rb
|
110
|
+
- lib/jwa/algorithms/content_encryption/a256_gcm.rb
|
111
|
+
- lib/jwa/algorithms/content_encryption/aes_cbc_hs.rb
|
112
|
+
- lib/jwa/algorithms/content_encryption/aes_gcm.rb
|
113
|
+
- lib/jwa/algorithms/key_management.rb
|
114
|
+
- lib/jwa/algorithms/key_management/a128_gcm_kw.rb
|
115
|
+
- lib/jwa/algorithms/key_management/a128_kw.rb
|
116
|
+
- lib/jwa/algorithms/key_management/a192_gcm_kw.rb
|
117
|
+
- lib/jwa/algorithms/key_management/a192_kw.rb
|
118
|
+
- lib/jwa/algorithms/key_management/a256_gcm_kw.rb
|
119
|
+
- lib/jwa/algorithms/key_management/a256_kw.rb
|
120
|
+
- lib/jwa/algorithms/key_management/aes_gcm_kw.rb
|
121
|
+
- lib/jwa/algorithms/key_management/aes_kw.rb
|
122
|
+
- lib/jwa/algorithms/key_management/ecdh_es.rb
|
123
|
+
- lib/jwa/algorithms/key_management/ecdh_es_a128_kw.rb
|
124
|
+
- lib/jwa/algorithms/key_management/ecdh_es_a192_kw.rb
|
125
|
+
- lib/jwa/algorithms/key_management/ecdh_es_a256_kw.rb
|
126
|
+
- lib/jwa/algorithms/key_management/ecdh_es_kw.rb
|
127
|
+
- lib/jwa/algorithms/key_management/pbes2.rb
|
128
|
+
- lib/jwa/algorithms/key_management/pbes_hs256_a128_kw.rb
|
129
|
+
- lib/jwa/algorithms/key_management/pbes_hs384_a192_kw.rb
|
130
|
+
- lib/jwa/algorithms/key_management/pbes_hs512_a256_kw.rb
|
131
|
+
- lib/jwa/algorithms/key_management/rsa15.rb
|
132
|
+
- lib/jwa/algorithms/key_management/rsa_oaep.rb
|
133
|
+
- lib/jwa/cipher.rb
|
134
|
+
- lib/jwa/support/concat_kdf.rb
|
135
|
+
- lib/jwa/support/pbkdf2.rb
|
136
|
+
- lib/jwa/version.rb
|
137
|
+
- spec/jwa/algorithms/content_encryption/a128_cbc_hs256_spec.rb
|
138
|
+
- spec/jwa/algorithms/content_encryption/a128_gcm_spec.rb
|
139
|
+
- spec/jwa/algorithms/content_encryption/a192_cbc_hs384_spec.rb
|
140
|
+
- spec/jwa/algorithms/content_encryption/a192_gcm_spec.rb
|
141
|
+
- spec/jwa/algorithms/content_encryption/a256_cbc_hs512_spec.rb
|
142
|
+
- spec/jwa/algorithms/content_encryption/a256_gcm_spec.rb
|
143
|
+
- spec/jwa/algorithms/content_encryption/aes_cbc_hs_shared.rb
|
144
|
+
- spec/jwa/algorithms/content_encryption/aes_gcm_shared.rb
|
145
|
+
- spec/jwa/algorithms/content_encryption_spec.rb
|
146
|
+
- spec/jwa/algorithms/key_management/a128_kw_spec.rb
|
147
|
+
- spec/jwa/algorithms/key_management/a192_kw_spec.rb
|
148
|
+
- spec/jwa/algorithms/key_management/a256_kw_spec.rb
|
149
|
+
- spec/jwa/algorithms/key_management/ecdh_es_spec.rb
|
150
|
+
- spec/jwa/algorithms/key_management/pbes2_hs256_a128_kw_spec.rb
|
151
|
+
- spec/jwa/algorithms/key_management/pbes2_hs384_a192_kw_spec.rb
|
152
|
+
- spec/jwa/algorithms/key_management/pbes2_hs512_a256_kw_spec.rb
|
153
|
+
- spec/jwa/algorithms/key_management/rsa15_spec.rb
|
154
|
+
- spec/jwa/algorithms/key_management/rsa_oaep_spec.rb
|
155
|
+
- spec/jwa/algorithms/key_management_spec.rb
|
156
|
+
- spec/jwa/cipher_spec.rb
|
157
|
+
- spec/jwa/support/concat_kdf_spec.rb
|
158
|
+
- spec/jwa/support/pbkdf2_spec.rb
|
159
|
+
- spec/jwa_spec.rb
|
160
|
+
- spec/spec_helper.rb
|
161
|
+
- spec/support/ec1.json
|
162
|
+
- spec/support/ec2.json
|
163
|
+
- spec/support/hex_helpers.rb
|
164
|
+
- spec/support/oct16.json
|
165
|
+
- spec/support/oct24.json
|
166
|
+
- spec/support/oct32.json
|
167
|
+
- spec/support/rsa1.json
|
168
|
+
- spec/support/rsa2.json
|
169
|
+
homepage: https://github.com/jwt/ruby-jwa
|
170
|
+
licenses:
|
171
|
+
- MIT
|
172
|
+
metadata: {}
|
173
|
+
post_install_message:
|
174
|
+
rdoc_options: []
|
175
|
+
require_paths:
|
176
|
+
- lib
|
177
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
178
|
+
requirements:
|
179
|
+
- - ">="
|
180
|
+
- !ruby/object:Gem::Version
|
181
|
+
version: '0'
|
182
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
183
|
+
requirements:
|
184
|
+
- - ">="
|
185
|
+
- !ruby/object:Gem::Version
|
186
|
+
version: '0'
|
187
|
+
requirements: []
|
188
|
+
rubyforge_project:
|
189
|
+
rubygems_version: 2.6.11
|
190
|
+
signing_key:
|
191
|
+
specification_version: 4
|
192
|
+
summary: JSON Web Algorithms implementation in Ruby
|
193
|
+
test_files: []
|