Skip to content

Instantly share code, notes, and snippets.

@tarcieri
Created February 9, 2013 23:58
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tarcieri/4747652 to your computer and use it in GitHub Desktop.
Save tarcieri/4747652 to your computer and use it in GitHub Desktop.
Trying to put together a semiprivate key system
# Experimenting with implementing semiprivate keys with RbNaCl
require 'rbnacl'
require 'hkdf'
module Semiprivate
class WriteKey
def initialize(seed)
if seed.bytesize != 32
raise ArgumentError, "seed must be 32 bytes"
end
@seed = seed
@read_key = ReadKey.new Crypto::Scalar.mult_base(@seed)
@private_key = Crypto::Scalar.mult(@seed, @read_key.semiprivate_key)
end
end
class ReadKey
def initialize(bytes)
hkdf = HKDF.new(bytes)
@semiprivate_key = hkdf.next_bytes(32)
@symmetric_key = hkdf.next_bytes(16)
@verify_key = VerifyKey.new Crypto::Scalar.mult(@semiprivate_key, bytes)
end
end
class VerifyKey
def initialize(bytes)
@key = bytes
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment