Minor cleanup of ::KeyPair

This commit is contained in:
Netscape Navigator 2020-03-12 07:34:22 -05:00
parent f6032dac18
commit 3b2f4ea5d0
6 changed files with 33 additions and 19 deletions

View File

@ -24,6 +24,7 @@ Eg: `pigeon identity show` becomes `./pigeon-cli show`.
- [X] pigeon peer block
- [X] pigeon peer all
- [X] 100% coverage
- [ ] Remove all `.current` "singletons" / hacks
- [ ] Rename numerous "pigeon message ..." commands to "pigeon draft ..."
- [ ] pigeon bundle create
- [ ] pigeon bundle consume
@ -35,6 +36,7 @@ Eg: `pigeon identity show` becomes `./pigeon-cli show`.
- [ ] pigeon message find-all
- [ ] 100% documentation
- [ ] add parsers and validators for all CLI inputs
- [ ] Validate inputs for `Draft#[]=`.
- [ ] Performance benchmarks
- [ ] Performance tuning (DO THIS LAST!)
- [ ] Update spec to look [like this](https://gist.github.com/RickCarlino/3ff4178db4a75fd135832c403cd313d4)

View File

@ -20,6 +20,7 @@ module Pigeon
# the key should be derived
def initialize(seed = SecureRandom.random_bytes(Ed25519::KEY_SIZE))
@seed = seed
@signing_key = Ed25519::SigningKey.new(@seed)
end
def private_key
@ -27,18 +28,22 @@ module Pigeon
end
def public_key
bytes = raw_key.verify_key.to_bytes
bytes = @signing_key.verify_key.to_bytes
b64 = Base64.urlsafe_encode64(bytes)
@public_key ||= KeyPair.add_headers(b64)
end
def sign(string)
hex = raw_key.sign(string)
hex = @signing_key.sign(string)
b64 = Base64.urlsafe_encode64(hex)
return b64 + ".sig.ed25519"
end
def verify(signature, string)
raise "TODO"
end
def save!
Pigeon::Storage.current.set_config(SEED_CONFIG_KEY, @seed)
self
@ -53,9 +58,5 @@ module Pigeon
def self.add_headers(urlsafe_b64_no_headers)
[HEADER, urlsafe_b64_no_headers, FOOTER].join("")
end
def raw_key
@raw_key ||= Ed25519::SigningKey.new(@seed)
end
end
end

View File

@ -16,7 +16,7 @@ module Pigeon
end
def render
Serializer.new(self).render.chomp
MessageSerializer.new(self).render.chomp
end
def multihash
@ -41,7 +41,7 @@ module Pigeon
end
def calculate_signature
template = Serializer.new(self)
template = MessageSerializer.new(self)
string = template.render_without_signature
KeyPair.current.sign(string)
end

View File

@ -3,7 +3,7 @@ require "erb"
module Pigeon
# Wrapper around a message to perform string templating.
# Renders a string that is a Pigeon-compliant message.
class Serializer
class MessageSerializer
attr_reader :message
def initialize(message)

View File

@ -23,6 +23,10 @@ RSpec.describe Pigeon::Message do
"b" => hash })
end
let (:template) do
Pigeon::MessageSerializer.new(create_message({ "a" => "b" }))
end
it "discards a draft after signing" do
expect(draft.internal_id).to eq(Pigeon::Draft.current.internal_id)
Pigeon::Message.from_draft(draft)
@ -87,15 +91,22 @@ RSpec.describe Pigeon::Message do
end
it "verifies accuracy of signatures" do
m1 = create_message({ "a" => "b" })
template = Pigeon::Serializer.new(m1)
string = template.render_without_signature
# Initial setup
Pigeon::KeyPair.current
secret = Pigeon::Storage.current.get_config(Pigeon::SEED_CONFIG_KEY)
expect(secret.length).to eq(32)
real_signing_key = Pigeon::KeyPair.current.instance_variable_get(:@signing_key)
signing_key = Ed25519::SigningKey.new(secret)
raw_signature = signing_key.sign(string)
b64_signature = Base64.urlsafe_encode64(raw_signature)
signature = b64_signature + ".sig.ed25519"
expect(m1.signature).to eq(signature)
unsigned_message_string = template.render_without_signature.chomp
# Sanity checks
expect(secret.length).to eq(32)
expect(real_signing_key.to_bytes).to eq(signing_key.to_bytes)
duplicate_signature =
Base64.urlsafe_encode64(signing_key.sign(unsigned_message_string))
real_sinature = template.message.signature.gsub(".sig.ed25519", "")
binding.pry
expect(real_sinature).to eq(duplicate_signature)
end
end

View File

@ -1,6 +1,6 @@
require "spec_helper"
RSpec.describe Pigeon::Serializer do
RSpec.describe Pigeon::MessageSerializer do
SHIM_ATTRS = [:author, :body, :kind, :depth, :prev, :signature, :saved?]
MessageShim = Struct.new(*SHIM_ATTRS)
TOP_HALF = ["author FAKE_AUTHOR",
@ -26,7 +26,7 @@ RSpec.describe Pigeon::Serializer do
"XYZ.sig.sha256",
false]
message = MessageShim.new(*args)
template = Pigeon::Serializer.new(message)
template = Pigeon::MessageSerializer.new(message)
expect(template.render).to eq(EXPECTED_DRAFT)
expect(template.render_without_signature).to eq(TOP_HALF)
end