@@ -22,37 +22,31 @@ class InvalidData < RuntimeError; end
2222
2323 class << self
2424 def encrypt ( payload , key , alg : 'RSA-OAEP' , enc : 'A128GCM' , **more_headers )
25- header = { alg : alg , enc : enc } . merge ( more_headers )
26- header . delete ( :zip ) if header [ :zip ] == ''
25+ header = generate_header ( alg , enc , more_headers )
2726 check_params ( header , key )
2827
29- cipher = Enc . for ( enc ) . new
30- cipher . cek = key if alg == 'dir'
28+ payload = apply_zip ( header , payload , :compress )
3129
32- payload = Zip . for ( header [ :zip ] ) . new . compress ( payload ) if header [ :zip ]
30+ cipher = Enc . for ( enc )
31+ cipher . cek = key if alg == 'dir'
3332
34- ciphertext = cipher . encrypt ( payload , Base64 . jwe_encode ( header . to_json ) )
35- encrypted_cek = Alg . for ( alg ) . new ( key ) . encrypt ( cipher . cek )
33+ json_hdr = header . to_json
34+ ciphertext = cipher . encrypt ( payload , Base64 . jwe_encode ( json_hdr ) )
3635
37- Serialization :: Compact . encode ( header . to_json , encrypted_cek , cipher . iv , ciphertext , cipher . tag )
36+ generate_serialization ( json_hdr , Alg . encrypt_cek ( alg , key , cipher . cek ) , ciphertext , cipher )
3837 end
3938
4039 def decrypt ( payload , key )
4140 header , enc_key , iv , ciphertext , tag = Serialization ::Compact . decode ( payload )
4241 header = JSON . parse ( header )
4342 check_params ( header , key )
4443
45- cek = Alg . for ( header [ 'alg' ] ) . new ( key ) . decrypt ( enc_key )
46- cipher = Enc . for ( header [ 'enc' ] ) . new ( cek , iv )
47- cipher . tag = tag
44+ cek = Alg . decrypt_cek ( header [ 'alg' ] , key , enc_key )
45+ cipher = Enc . for ( header [ 'enc' ] , cek , iv , tag )
4846
4947 plaintext = cipher . decrypt ( ciphertext , payload . split ( '.' ) . first )
5048
51- if header [ 'zip' ]
52- Zip . for ( header [ 'zip' ] ) . new . decompress ( plaintext )
53- else
54- plaintext
55- end
49+ apply_zip ( header , plaintext , :decompress )
5650 end
5751
5852 def check_params ( header , key )
@@ -82,5 +76,24 @@ def param_to_class_name(param)
8276 klass = param . gsub ( /[-\+ ]/ , '_' ) . downcase . sub ( /^[a-z\d ]*/ ) { $&. capitalize }
8377 klass . gsub ( /_([a-z\d ]*)/i ) { Regexp . last_match ( 1 ) . capitalize }
8478 end
79+
80+ def apply_zip ( header , data , direction )
81+ zip = header [ :zip ] || header [ 'zip' ]
82+ if zip
83+ Zip . for ( zip ) . new . send ( direction , data )
84+ else
85+ data
86+ end
87+ end
88+
89+ def generate_header ( alg , enc , more )
90+ header = { alg : alg , enc : enc } . merge ( more )
91+ header . delete ( :zip ) if header [ :zip ] == ''
92+ header
93+ end
94+
95+ def generate_serialization ( hdr , cek , content , cipher )
96+ Serialization ::Compact . encode ( hdr , cek , cipher . iv , content , cipher . tag )
97+ end
8598 end
8699end
0 commit comments