Class: JOSE::JWK::KTY_oct

Inherits:
Struct
  • Object
show all
Defined in:
lib/jose/jwk/kty_oct.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#octObject

Returns the value of attribute oct

Returns:

  • (Object)

    the current value of oct



1
2
3
# File 'lib/jose/jwk/kty_oct.rb', line 1

def oct
  @oct
end

Class Method Details

.from_map(fields) ⇒ Object

JOSE::JWK callbacks



5
6
7
8
9
10
11
# File 'lib/jose/jwk/kty_oct.rb', line 5

def self.from_map(fields)
  if fields['kty'] == 'oct' and fields['k'].is_a?(String)
    return JOSE::JWK::KTY_oct.new(JOSE.urlsafe_decode64(fields['k'])), fields.except('kty', 'k')
  else
    raise ArgumentError, "invalid 'oct' JWK"
  end
end

.from_oct(binary) ⇒ Object

API functions



91
92
93
94
95
96
97
98
# File 'lib/jose/jwk/kty_oct.rb', line 91

def self.from_oct(binary)
  case binary
  when String
    return JOSE::JWK::KTY_oct.new(binary), JOSE::Map[]
  else
    raise ArgumentError, "'binary' must be a String"
  end
end

.generate_key(size) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
# File 'lib/jose/jwk/kty_oct.rb', line 56

def self.generate_key(size)
  if size.is_a?(Array) and size.length == 2 and size[0] == :oct
    size = size[1]
  end
  case size
  when Integer
    return from_oct(SecureRandom.random_bytes(size))
  else
    raise ArgumentError, "'size' must be an Integer"
  end
end

Instance Method Details

#block_encryptor(fields, plain_text) ⇒ Object

JOSE::JWK::KTY callbacks



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/jose/jwk/kty_oct.rb', line 31

def block_encryptor(fields, plain_text)
  enc = case (oct.bytesize * 8)
  when 128
    'A128GCM'
  when 192
    'A192GCM'
  when 256
    'A256GCM'
  when 384
    'A192CBC-HS384'
  when 512
    'A256CBC-HS512'
  else
    raise ArgumentError, "oct of size #{oct.bytesize * 8} has no default block encryptor"
  end
  return JOSE::Map[
    'alg' => 'dir',
    'enc' => enc
  ]
end

#derive_keyObject



52
53
54
# File 'lib/jose/jwk/kty_oct.rb', line 52

def derive_key
  return oct
end

#generate_key(fields) ⇒ Object



68
69
70
71
# File 'lib/jose/jwk/kty_oct.rb', line 68

def generate_key(fields)
  kty, other_fields = JOSE::JWK::KTY_oct.generate_key(oct.bytesize)
  return kty, fields.delete('kid').merge(other_fields)
end

#key_encryptor(fields, key) ⇒ Object



73
74
75
# File 'lib/jose/jwk/kty_oct.rb', line 73

def key_encryptor(fields, key)
  return JOSE::JWK::KTY.key_encryptor(self, fields, key)
end

#sign(message, digest_type) ⇒ Object



77
78
79
# File 'lib/jose/jwk/kty_oct.rb', line 77

def sign(message, digest_type)
  return OpenSSL::HMAC.digest(digest_type.new, oct, message)
end

#signer(fields = nil, plain_text = nil) ⇒ Object



81
82
83
# File 'lib/jose/jwk/kty_oct.rb', line 81

def signer(fields = nil, plain_text = nil)
  return JOSE::Map['alg' => 'HS256']
end

#to_keyObject



13
14
15
# File 'lib/jose/jwk/kty_oct.rb', line 13

def to_key
  return oct
end

#to_map(fields) ⇒ Object



17
18
19
# File 'lib/jose/jwk/kty_oct.rb', line 17

def to_map(fields)
  return fields.put('k', JOSE.urlsafe_encode64(oct)).put('kty', 'oct')
end

#to_octObject



100
101
102
# File 'lib/jose/jwk/kty_oct.rb', line 100

def to_oct
  return oct
end

#to_public_map(fields) ⇒ Object



21
22
23
# File 'lib/jose/jwk/kty_oct.rb', line 21

def to_public_map(fields)
  return to_map(fields)
end

#to_thumbprint_map(fields) ⇒ Object



25
26
27
# File 'lib/jose/jwk/kty_oct.rb', line 25

def to_thumbprint_map(fields)
  return to_public_map(fields).slice('k', 'kty')
end

#verify(message, digest_type, signature) ⇒ Object



85
86
87
# File 'lib/jose/jwk/kty_oct.rb', line 85

def verify(message, digest_type, signature)
  return JOSE::JWA.constant_time_compare(signature, sign(message, digest_type))
end