Class: SimpleSecrets::Packet
- Inherits:
-
Object
- Object
- SimpleSecrets::Packet
- Defined in:
- lib/simple_secrets/packet.rb
Instance Method Summary collapse
- #authenticate(data, master_key, identity) ⇒ Object
- #body_to_data(body) ⇒ Object
- #build_body(data) ⇒ Object
- #decrypt_body(cipher_data, master_key) ⇒ Object
- #encrypt_body(body, master_key) ⇒ Object
-
#initialize(master_key) ⇒ Packet
constructor
A new instance of Packet.
- #pack(data) ⇒ Object
- #unpack(websafe_data) ⇒ Object
- #verify(packet, master_key, identity) ⇒ Object
Constructor Details
#initialize(master_key) ⇒ Packet
Returns a new instance of Packet.
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 |