Class: TTTLS13::Message::Extension::KeyShare

Inherits:
Object
  • Object
show all
Defined in:
lib/tttls1.3/message/extension/key_share.rb

Overview

rubocop: disable Metrics/ClassLength

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(msg_type:, key_share_entry: []) ⇒ KeyShare

Returns a new instance of KeyShare.

Parameters:

Raises:



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/tttls1.3/message/extension/key_share.rb', line 16

def initialize(msg_type:, key_share_entry: [])
  @extension_type = ExtensionType::KEY_SHARE
  @msg_type = msg_type
  @key_share_entry = key_share_entry || []
  raise Error::ErrorAlerts, :internal_error \
    unless (@msg_type == HandshakeType::CLIENT_HELLO &&
            @key_share_entry.length >= 0 &&
            @key_share_entry.all?(&:valid_key_share_client_hello?)) ||
           (@msg_type == HandshakeType::SERVER_HELLO &&
            @key_share_entry.length == 1 &&
            @key_share_entry.first.valid_key_share_server_hello?) ||
           (@msg_type == HandshakeType::HELLO_RETRY_REQUEST &&
            @key_share_entry.length == 1 &&
            @key_share_entry.first.valid_key_share_hello_retry_request?)
end

Instance Attribute Details

#extension_typeObject (readonly)

Returns the value of attribute extension_type.



10
11
12
# File 'lib/tttls1.3/message/extension/key_share.rb', line 10

def extension_type
  @extension_type
end

#key_share_entryObject (readonly)

Returns the value of attribute key_share_entry.



10
11
12
# File 'lib/tttls1.3/message/extension/key_share.rb', line 10

def key_share_entry
  @key_share_entry
end

#msg_typeObject (readonly)

Returns the value of attribute msg_type.



10
11
12
# File 'lib/tttls1.3/message/extension/key_share.rb', line 10

def msg_type
  @msg_type
end

Class Method Details

.deserialize(binary, msg_type) ⇒ TTTLS13::Message::Extensions::KeyShare?

Parameters:

Returns:

  • (TTTLS13::Message::Extensions::KeyShare, nil)

Raises:



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/tttls1.3/message/extension/key_share.rb', line 53

def self.deserialize(binary, msg_type)
  raise Error::ErrorAlerts, :internal_error if binary.nil?

  case msg_type
  when HandshakeType::CLIENT_HELLO
    key_share_entry = deserialize_keyshare_ch(binary)
    return nil \
      unless key_share_entry.all?(&:valid_key_share_client_hello?)
  when HandshakeType::SERVER_HELLO
    key_share_entry = deserialize_keyshare_sh(binary)
    return nil \
      unless key_share_entry.first.valid_key_share_server_hello?
  when HandshakeType::HELLO_RETRY_REQUEST
    key_share_entry = deserialize_keyshare_hrr(binary)
    return nil \
      unless key_share_entry.first.valid_key_share_hello_retry_request?
  else
    raise Error::ErrorAlerts, :internal_error
  end
  return nil if key_share_entry.nil?

  KeyShare.new(msg_type:,
               key_share_entry:)
end

.gen_ch_key_share(groups) ⇒ TTTLS13::Message::Extensions::KeyShare, TTTLS13::SharedSecret

Parameters:

Returns:



82
83
84
85
86
87
88
89
90
# File 'lib/tttls1.3/message/extension/key_share.rb', line 82

def self.gen_ch_key_share(groups)
  shared_secret = SharedSecret.gen_from_named_groups(groups)
  key_share = KeyShare.new(
    msg_type: HandshakeType::CLIENT_HELLO,
    key_share_entry: shared_secret.key_share_entries
  )

  [key_share, shared_secret]
end

.gen_hrr_key_share(group) ⇒ TTTLS13::Message::Extensions::KeyShare

Parameters:

Returns:

  • (TTTLS13::Message::Extensions::KeyShare)


110
111
112
113
114
115
116
# File 'lib/tttls1.3/message/extension/key_share.rb', line 110

def self.gen_hrr_key_share(group)
  kse = KeyShareEntry.new(group:)
  KeyShare.new(
    msg_type: HandshakeType::HELLO_RETRY_REQUEST,
    key_share_entry: [kse]
  )
end

.gen_sh_key_share(group) ⇒ TTTLS13::Message::Extensions::KeyShare, TTTLS13::SharedSecret

Parameters:

Returns:



96
97
98
99
100
101
102
103
104
105
# File 'lib/tttls1.3/message/extension/key_share.rb', line 96

def self.gen_sh_key_share(group)
  shared_secret = SharedSecret.gen_from_named_groups([group])

  key_share = KeyShare.new(
    msg_type: HandshakeType::SERVER_HELLO,
    key_share_entry: shared_secret.key_share_entries
  )

  [key_share, shared_secret]
end

Instance Method Details

#serializeString

Returns:

  • (String)

Raises:



35
36
37
38
39
40
41
42
43
44
45
# File 'lib/tttls1.3/message/extension/key_share.rb', line 35

def serialize
  case @msg_type
  when HandshakeType::CLIENT_HELLO
    binary = @key_share_entry.map(&:serialize).join.prefix_uint16_length
  when HandshakeType::SERVER_HELLO, HandshakeType::HELLO_RETRY_REQUEST
    binary = @key_share_entry.first.serialize
  else
    raise Error::ErrorAlerts, :internal_error
  end
  @extension_type + binary.prefix_uint16_length
end