Class: SimpleSecrets::Packet

Inherits:
Object
  • Object
show all
Defined in:
lib/simple_secrets/packet.rb

Instance Method Summary collapse

Constructor Details

#initialize(master_key) ⇒ Packet

Returns a new instance of Packet.

Raises:

  • (ArgumentError)


7
8
9
10
11
12
# File 'lib/simple_secrets/packet.rb', line 7

def initialize master_key
  raise ArgumentError unless master_key

  @master_key = hex_to_bin master_key
  @identity = Primitives.identify @master_key
end

Instance Method Details

#authenticate(data, master_key, identity) ⇒ Object



54
55
56
57
58
59
60
61
62
63
# File 'lib/simple_secrets/packet.rb', line 54

def authenticate data, master_key, identity
  hmac_key = Primitives.derive_sender_hmac master_key

  auth = "#{identity}#{data}"
  mac = Primitives.mac auth, hmac_key
  packet = "#{auth}#{mac}"

  Primitives.zero hmac_key, mac
  packet
end

#body_to_data(body) ⇒ Object



24
25
26
27
28
29
30
31
32
# File 'lib/simple_secrets/packet.rb', line 24

def body_to_data body
  nonce = body[0...16]
  bindata = body[16..-1]

  data = Primitives.deserialize bindata

  Primitives.zero nonce, bindata
  data
end

#build_body(data) ⇒ Object



14
15
16
17
18
19
20
21
22
# File 'lib/simple_secrets/packet.rb', line 14

def build_body data
  nonce = Primitives.nonce
  bindata = Primitives.serialize data

  body = "#{nonce}#{bindata}"

  Primitives.zero nonce, bindata
  body
end

#decrypt_body(cipher_data, master_key) ⇒ Object



43
44
45
46
47
48
49
50
51
52
# File 'lib/simple_secrets/packet.rb', line 43

def decrypt_body cipher_data, master_key
  key = Primitives.derive_sender_key master_key
  iv = cipher_data[0...16]
  encrypted = cipher_data[16..-1]

  body = Primitives.decrypt encrypted, key, iv

  Primitives.zero key, iv, encrypted
  body
end

#encrypt_body(body, master_key) ⇒ Object



34
35
36
37
38
39
40
41
# File 'lib/simple_secrets/packet.rb', line 34

def encrypt_body body, master_key
  key = Primitives.derive_sender_key master_key

  cipher_data = Primitives.encrypt body, key

  Primitives.zero key
  cipher_data
end

#pack(data) ⇒ Object



79
80
81
82
83
84
85
86
87
# File 'lib/simple_secrets/packet.rb', line 79

def pack data
  body = build_body data
  encrypted = encrypt_body body, @master_key
  packet = authenticate encrypted, @master_key, @identity
  websafe = Primitives.stringify packet

  Primitives.zero body, encrypted, packet
  websafe
end

#unpack(websafe_data) ⇒ Object



89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/simple_secrets/packet.rb', line 89

def unpack websafe_data
  packet = Primitives.binify websafe_data
  cipher_data = verify packet, @master_key, @identity
  Primitives.zero packet
  return nil unless cipher_data

  body = decrypt_body cipher_data, @master_key
  data = body_to_data body

  Primitives.zero body, cipher_data
  data
end

#verify(packet, master_key, identity) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/simple_secrets/packet.rb', line 65

def verify packet, master_key, identity
  packet_id = packet[0...6]
  return nil unless Primitives.compare packet_id, identity

  data = packet[0...-32]
  packet_mac = packet[-32..-1]
  hmac_key = Primitives.derive_sender_hmac master_key
  mac = Primitives.mac data, hmac_key
  return nil unless Primitives.compare packet_mac, mac

  Primitives.zero hmac_key, mac
  packet[6...-32]
end