Minor cleanup of ::KeyPair
This commit is contained in:
parent
f6032dac18
commit
3b2f4ea5d0
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue