Created
February 9, 2013 23:58
-
-
Save tarcieri/4747652 to your computer and use it in GitHub Desktop.
Trying to put together a semiprivate key system
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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