Module: OPP::Signature

Defined in:
lib/opp/signature.rb

Class Method Summary collapse

Class Method Details

.sign(document, private_key:) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/opp/signature.rb', line 7

def sign(document, private_key:)
  unsigned = unsigned_document(document)
  bytes = KeyPair.from_private_key(private_key)
    .sign(Canonicalization.canonicalize(unsigned))

  unsigned.merge(
    "signature" => {
      "algorithm" => "ed25519",
      "value" => Base64URL.encode(bytes)
    }
  )
rescue InvalidEncodingError => error
  raise InvalidSignatureError, error.message
end

.verify(document, public_key:) ⇒ Object



22
23
24
25
26
# File 'lib/opp/signature.rb', line 22

def verify(document, public_key:)
  verify!(document, public_key:)
rescue InvalidSignatureError
  false
end

.verify!(document, public_key:) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/opp/signature.rb', line 28

def verify!(document, public_key:)
  unsigned, signature = split(document)
  unless signature["algorithm"] == "ed25519"
    raise InvalidSignatureError, "unsupported signature algorithm"
  end

  bytes = Base64URL.decode(signature["value"], length: 64)
  verify_key = Ed25519::VerifyKey.new(PublicKey.decode(public_key))
  verify_key.verify(bytes, Canonicalization.canonicalize(unsigned))
  true
rescue Ed25519::VerifyError, InvalidEncodingError, InvalidPublicKeyError => error
  raise InvalidSignatureError, error.message
end