Added the methods: - Event#verify_signature - Crypto#check_sig! - Crypto#valid_sig? - Crypto#sign_message Fixed a primitive obsession by introducing a Signature class to ensure that signatures are valid Nostr signatures.
68 lines
1.9 KiB
Ruby
68 lines
1.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Nostr
|
|
# 64-bytes lowercase hex of the signature of the sha256 hash of the serialized event data,
|
|
# which is the same as the "id" field
|
|
class Signature < String
|
|
# The regular expression for hexadecimal lowercase characters
|
|
#
|
|
# @return [Regexp] The regular expression for hexadecimal lowercase characters
|
|
#
|
|
FORMAT = /^[a-f0-9]+$/
|
|
|
|
# The length of the signature in hex format
|
|
#
|
|
# @return [Integer] The length of the signature in hex format
|
|
#
|
|
LENGTH = 128
|
|
|
|
# Instantiates a new Signature
|
|
#
|
|
# @api public
|
|
#
|
|
# @example Instantiating a new signature
|
|
# Nostr::Signature.new(
|
|
# 'f418c97b50cc68227e82f4f3a79d79eb2b7a0fa517859c86e1a8fa91e3741b7f' \
|
|
# '06e070c44129227b83fcbe93cecb02a346804a4080ce47685ecad60ab4f5f128'
|
|
# )
|
|
#
|
|
# @param [String] hex_value Hex-encoded value of the signature
|
|
#
|
|
# @raise [SignatureValidationError]
|
|
#
|
|
def initialize(hex_value)
|
|
validate(hex_value)
|
|
|
|
super(hex_value)
|
|
end
|
|
|
|
private
|
|
|
|
# Hex-encoded value of the signature
|
|
#
|
|
# @api private
|
|
#
|
|
# @return [String] hex_value Hex-encoded value of the signature
|
|
#
|
|
attr_reader :hex_value
|
|
|
|
# Validates the hex value of the signature
|
|
#
|
|
# @api private
|
|
#
|
|
# @param [String] hex_value The signature in hex format
|
|
#
|
|
# @raise InvalidSignatureTypeError when the signature is not a string
|
|
# @raise InvalidSignatureLengthError when the signature's length is not 128 characters
|
|
# @raise InvalidSignatureFormatError when the signature is in an invalid format
|
|
#
|
|
# @return [void]
|
|
#
|
|
def validate(hex_value)
|
|
raise InvalidSignatureTypeError unless hex_value.is_a?(String)
|
|
raise InvalidSignatureLengthError unless hex_value.size == LENGTH
|
|
raise InvalidSignatureFormatError unless hex_value.match(FORMAT)
|
|
end
|
|
end
|
|
end
|