jwa 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.
Files changed (81) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +15 -0
  3. data/.gitignore +17 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +16 -0
  6. data/.travis.yml +15 -0
  7. data/Gemfile +4 -0
  8. data/LICENSE.md +23 -0
  9. data/README.md +26 -0
  10. data/Rakefile +6 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/jwa.gemspec +27 -0
  14. data/lib/jwa.rb +16 -0
  15. data/lib/jwa/algorithms.rb +2 -0
  16. data/lib/jwa/algorithms/content_encryption.rb +29 -0
  17. data/lib/jwa/algorithms/content_encryption/a128_cbc_hs256.rb +29 -0
  18. data/lib/jwa/algorithms/content_encryption/a128_gcm.rb +25 -0
  19. data/lib/jwa/algorithms/content_encryption/a192_cbc_hs384.rb +29 -0
  20. data/lib/jwa/algorithms/content_encryption/a192_gcm.rb +25 -0
  21. data/lib/jwa/algorithms/content_encryption/a256_cbc_hs512.rb +29 -0
  22. data/lib/jwa/algorithms/content_encryption/a256_gcm.rb +25 -0
  23. data/lib/jwa/algorithms/content_encryption/aes_cbc_hs.rb +85 -0
  24. data/lib/jwa/algorithms/content_encryption/aes_gcm.rb +64 -0
  25. data/lib/jwa/algorithms/key_management.rb +56 -0
  26. data/lib/jwa/algorithms/key_management/a128_gcm_kw.rb +21 -0
  27. data/lib/jwa/algorithms/key_management/a128_kw.rb +21 -0
  28. data/lib/jwa/algorithms/key_management/a192_gcm_kw.rb +21 -0
  29. data/lib/jwa/algorithms/key_management/a192_kw.rb +21 -0
  30. data/lib/jwa/algorithms/key_management/a256_gcm_kw.rb +21 -0
  31. data/lib/jwa/algorithms/key_management/a256_kw.rb +21 -0
  32. data/lib/jwa/algorithms/key_management/aes_gcm_kw.rb +26 -0
  33. data/lib/jwa/algorithms/key_management/aes_kw.rb +100 -0
  34. data/lib/jwa/algorithms/key_management/ecdh_es.rb +45 -0
  35. data/lib/jwa/algorithms/key_management/ecdh_es_a128_kw.rb +25 -0
  36. data/lib/jwa/algorithms/key_management/ecdh_es_a192_kw.rb +25 -0
  37. data/lib/jwa/algorithms/key_management/ecdh_es_a256_kw.rb +25 -0
  38. data/lib/jwa/algorithms/key_management/ecdh_es_kw.rb +23 -0
  39. data/lib/jwa/algorithms/key_management/pbes2.rb +27 -0
  40. data/lib/jwa/algorithms/key_management/pbes_hs256_a128_kw.rb +25 -0
  41. data/lib/jwa/algorithms/key_management/pbes_hs384_a192_kw.rb +25 -0
  42. data/lib/jwa/algorithms/key_management/pbes_hs512_a256_kw.rb +25 -0
  43. data/lib/jwa/algorithms/key_management/rsa15.rb +20 -0
  44. data/lib/jwa/algorithms/key_management/rsa_oaep.rb +20 -0
  45. data/lib/jwa/cipher.rb +17 -0
  46. data/lib/jwa/support/concat_kdf.rb +29 -0
  47. data/lib/jwa/support/pbkdf2.rb +48 -0
  48. data/lib/jwa/version.rb +3 -0
  49. data/spec/jwa/algorithms/content_encryption/a128_cbc_hs256_spec.rb +30 -0
  50. data/spec/jwa/algorithms/content_encryption/a128_gcm_spec.rb +42 -0
  51. data/spec/jwa/algorithms/content_encryption/a192_cbc_hs384_spec.rb +34 -0
  52. data/spec/jwa/algorithms/content_encryption/a192_gcm_spec.rb +49 -0
  53. data/spec/jwa/algorithms/content_encryption/a256_cbc_hs512_spec.rb +35 -0
  54. data/spec/jwa/algorithms/content_encryption/a256_gcm_spec.rb +61 -0
  55. data/spec/jwa/algorithms/content_encryption/aes_cbc_hs_shared.rb +96 -0
  56. data/spec/jwa/algorithms/content_encryption/aes_gcm_shared.rb +60 -0
  57. data/spec/jwa/algorithms/content_encryption_spec.rb +7 -0
  58. data/spec/jwa/algorithms/key_management/a128_kw_spec.rb +43 -0
  59. data/spec/jwa/algorithms/key_management/a192_kw_spec.rb +29 -0
  60. data/spec/jwa/algorithms/key_management/a256_kw_spec.rb +29 -0
  61. data/spec/jwa/algorithms/key_management/ecdh_es_spec.rb +36 -0
  62. data/spec/jwa/algorithms/key_management/pbes2_hs256_a128_kw_spec.rb +27 -0
  63. data/spec/jwa/algorithms/key_management/pbes2_hs384_a192_kw_spec.rb +32 -0
  64. data/spec/jwa/algorithms/key_management/pbes2_hs512_a256_kw_spec.rb +32 -0
  65. data/spec/jwa/algorithms/key_management/rsa15_spec.rb +44 -0
  66. data/spec/jwa/algorithms/key_management/rsa_oaep_spec.rb +44 -0
  67. data/spec/jwa/algorithms/key_management_spec.rb +7 -0
  68. data/spec/jwa/cipher_spec.rb +7 -0
  69. data/spec/jwa/support/concat_kdf_spec.rb +32 -0
  70. data/spec/jwa/support/pbkdf2_spec.rb +111 -0
  71. data/spec/jwa_spec.rb +5 -0
  72. data/spec/spec_helper.rb +22 -0
  73. data/spec/support/ec1.json +7 -0
  74. data/spec/support/ec2.json +7 -0
  75. data/spec/support/hex_helpers.rb +9 -0
  76. data/spec/support/oct16.json +4 -0
  77. data/spec/support/oct24.json +4 -0
  78. data/spec/support/oct32.json +4 -0
  79. data/spec/support/rsa1.json +11 -0
  80. data/spec/support/rsa2.json +11 -0
  81. 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,7 @@
1
+ describe JWA::Algorithms::KeyManagement do
2
+ describe '.for' do
3
+ it 'returns a class for a given key management method name' do
4
+ expect(described_class.for('A256KW')).to be JWA::Algorithms::KeyManagement::A256Kw
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ describe JWA::Cipher do
2
+ it 'raises if the cipher does not exist (or is not supported by this ruby)' do
3
+ expect do
4
+ JWA::Cipher.for('very-strange-cipher')
5
+ end.to raise_error(NotImplementedError)
6
+ end
7
+ 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
@@ -0,0 +1,5 @@
1
+ RSpec.describe JWA do
2
+ it 'has a version number' do
3
+ expect(JWA::VERSION).not_to be nil
4
+ end
5
+ end
@@ -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,7 @@
1
+ {
2
+ "kty":"EC",
3
+ "crv":"P-256",
4
+ "x":"gI0GAILBdu7T53akrFmMyGcsF3n5dO7MmwNBHKW5SV0",
5
+ "y":"SLW_xSffzlPWrHEVI30DHM_4egVwt3NQqeUD7nMFpps",
6
+ "d":"0_NxaRPUMQoAJt50Gz8YiTr8gRTwyEaCumd-MToTmIo"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "kty":"EC",
3
+ "crv":"P-256",
4
+ "x":"weNJy2HscCSM6AEDTDg04biOvhFhyyWvOHQfeF_PxMQ",
5
+ "y":"e8lnCO-AlStT-NJVX-crhB7QRYhiix03illJOVAOyck",
6
+ "d":"VEmDZpDXXK8p8N0Cndsxs924q6nS1RXFASRl6BfUqdw"
7
+ }
@@ -0,0 +1,9 @@
1
+ module HexHelpers
2
+ def hex_string_to_bytes(s)
3
+ s.scan(/[0-9a-f]{2}/i).map { |pair| pair.to_i(16).chr }.join
4
+ end
5
+
6
+ def int_byte_array_to_bytes(a)
7
+ a.map(&:chr).join
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ {
2
+ "kty":"oct",
3
+ "k":"GawgguFyGrWKav7AX4VKUg"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "kty":"oct",
3
+ "k":"a1pIEp2b4thO1LPsHVT5YFsmF8KT3Zj9"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "kty":"oct",
3
+ "k":"Ceav0fhQ_lEUcnb5geY44oAnvWyxmbAwhNxCWGyg8hc"
4
+ }
@@ -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: []