ons-jwe 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a8bc97876dcae5fcff526459efb0de2502bca222
4
+ data.tar.gz: e92c84cc1917b6715360e167d730bd32a0b7b98e
5
+ SHA512:
6
+ metadata.gz: 68c2c8a3cdc027a7b5683c6e2323487d43a7b286f8864463fde8d7cc614b15329398f7cf31f5a8acb4c61fa780f8b6938f23e8d3281b2e0b312adfaf19a744be
7
+ data.tar.gz: 76d3c78839a51f6758bed653f9e0934d1bfef3a5c4fa3a895b92bf704886a2feb40805e6e6fbbb8846b3c4e18a95a3dad5f22917c25171238cb3d6cb74ed85f5
@@ -0,0 +1,54 @@
1
+ # ONS JSON Web Token RubyGem
2
+ [RFC 7516](https://tools.ietf.org/html/rfc7516)-compliant JSON Web Encryption (JWE) token generator that uses RSAES-OAEP and AES GCM. Suitable for use with the [ONS eQ Survey Runner](https://github.com/ONSdigital/eq-survey-runner). Note that this gem targets Ruby 2.3 and above.
3
+
4
+ [![Build Status](https://travis-ci.org/ONSdigital/jwe-rubygem.svg?branch=master)](https://travis-ci.org/ONSdigital/jwe-rubygem)
5
+
6
+ ## Installation
7
+
8
+ ```
9
+ gem install ons-jwe
10
+ ```
11
+
12
+ ## Examples
13
+
14
+ ```ruby
15
+ require 'openssl'
16
+ require 'ons-jwe'
17
+
18
+ KEY_ID = 'EDCRRM'
19
+
20
+ RESPONDENT_PORTAL_PRIVATE_KEY = File.read('sdc-user-authentication-signing-rrm-private-key.pem')
21
+ SURVEY_RUNNER_PUBLIC_KEY = File.read('sdc-user-authentication-encryption-sr-public-key.pem')
22
+
23
+ public_key = OpenSSL::PKey::RSA.new(SURVEY_RUNNER_PUBLIC_KEY)
24
+ private_key = OpenSSL::PKey::RSA.new(RESPONDENT_PORTAL_PRIVATE_KEY, 'digitaleq')
25
+
26
+ claims = {
27
+ user_id: 'John Topley',
28
+ iat: Time.now.to_i,
29
+ exp: Time.now.to_i + 60 * 60,
30
+ eq_id: '1',
31
+ period_str: '2016-01-01',
32
+ period_id: '2016-01-01',
33
+ form_type: '0205',
34
+ collection_exercise_sid: '789',
35
+ ref_p_start_date: '2016-01-01',
36
+ ref_p_end_date: '2016-09-01',
37
+ ru_ref: '12346789012A',
38
+ ru_name: 'Office for National Statistics',
39
+ return_by: '2016-04-30',
40
+ employment_date: '2016-06-10'
41
+ }
42
+
43
+ token = JWEToken.new(KEY_ID, claims, public_key, private_key)
44
+ puts token.value
45
+ ```
46
+
47
+ ## Testing
48
+
49
+ ```
50
+ rake test
51
+ ```
52
+
53
+ ## Copyright
54
+ Copyright (C) 2016 Crown Copyright (Office for National Statistics)
@@ -0,0 +1,2 @@
1
+ # frozen_string_literal: true
2
+ require_relative 'ons-jwe/jwe_token'
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+ require 'json/jwt'
3
+
4
+ # This class generates JSON Web Encryption (JWE) tokens as per RFC 7516.
5
+ class JWEToken
6
+ attr_reader :value
7
+
8
+ def initialize(key_id, claims, public_key, private_key)
9
+ validate_key_id(key_id)
10
+ validate_claims(claims)
11
+ validate_public_key(public_key)
12
+ validate_private_key(private_key)
13
+ jwt = build_jwt(claims, key_id)
14
+ jws = build_jws(jwt, private_key)
15
+ @value = build_jwe(jws, public_key).to_s
16
+ end
17
+
18
+ def to_s
19
+ @value
20
+ end
21
+
22
+ private
23
+
24
+ def build_jwe(jws, public_key)
25
+ jws.encrypt(public_key, :'RSA-OAEP', :A256GCM)
26
+ end
27
+
28
+ def build_jwt(claims, key_id)
29
+ jwt = JSON::JWT.new(claims)
30
+ jwt.kid = key_id
31
+ jwt.alg = :RS256
32
+ jwt
33
+ end
34
+
35
+ def build_jws(jwt, private_key)
36
+ jwt.sign(private_key, :RS256)
37
+ end
38
+
39
+ def validate_claims(claims)
40
+ raise ArgumentError, 'claims must be specified' if claims.nil? ||
41
+ claims.empty?
42
+ end
43
+
44
+ def validate_key_id(key_id)
45
+ raise ArgumentError, 'key_id must be specified' if key_id.nil? ||
46
+ key_id.empty?
47
+ end
48
+
49
+ def validate_private_key(private_key)
50
+ raise ArgumentError, 'private_key must be specified' if private_key.nil?
51
+ validate_rsa_key(private_key, 'private_key')
52
+ end
53
+
54
+ def validate_public_key(public_key)
55
+ raise ArgumentError, 'public_key must be specified' if public_key.nil?
56
+ validate_rsa_key(public_key, 'public_key')
57
+ end
58
+
59
+ def validate_rsa_key(key, key_type)
60
+ unless key.instance_of? OpenSSL::PKey::RSA
61
+ raise ArgumentError, "#{key_type} must be an RSA key"
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+ module ONSJWE
3
+ module Version
4
+ MAJOR = 1
5
+ MINOR = 0
6
+ TINY = 0
7
+ end
8
+ VERSION = [Version::MAJOR, Version::MINOR, Version::TINY].compact * '.'
9
+ end
metadata ADDED
@@ -0,0 +1,150 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ons-jwe
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - John Topley
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-08-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json-jwt
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.6.3
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.6.3
33
+ - !ruby/object:Gem::Dependency
34
+ name: bundler
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 1.12.5
43
+ type: :development
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '1'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 1.12.5
53
+ - !ruby/object:Gem::Dependency
54
+ name: rake
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '11'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 11.1.2
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '11'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 11.1.2
73
+ - !ruby/object:Gem::Dependency
74
+ name: rubocop
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 0.42.0
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: 0.42.0
93
+ - !ruby/object:Gem::Dependency
94
+ name: test-unit
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '3'
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: 3.1.9
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '3'
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: 3.1.9
113
+ description: |
114
+ RFC7516-compliant JSON Web Encryption (JWE) token generator that uses RSAES-OAEP and AES GCM.
115
+ Suitable for use with the ONS eQ Survey Runner.
116
+ email:
117
+ - john.topley@ons.gov.uk
118
+ executables: []
119
+ extensions: []
120
+ extra_rdoc_files: []
121
+ files:
122
+ - README.md
123
+ - lib/ons-jwe.rb
124
+ - lib/ons-jwe/jwe_token.rb
125
+ - lib/ons-jwe/version.rb
126
+ homepage: https://github.com/ONSdigital/jwe-rubygem
127
+ licenses:
128
+ - Crown Copyright (Office for National Statistics)
129
+ metadata: {}
130
+ post_install_message:
131
+ rdoc_options: []
132
+ require_paths:
133
+ - lib
134
+ required_ruby_version: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ required_rubygems_version: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ requirements: []
145
+ rubyforge_project:
146
+ rubygems_version: 2.6.6
147
+ signing_key:
148
+ specification_version: 4
149
+ summary: JSON Web Encryption (JWE) token generator
150
+ test_files: []