class SimpleSecrets::Packet

Public Class Methods

new(master_key) click to toggle source
# 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

Public Instance Methods

authenticate(data, master_key, identity) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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

Private Instance Methods

hex_to_bin(string) click to toggle source
# File lib/simple_secrets/packet.rb, line 103
def hex_to_bin string
  [string].pack('H*')
end