class CryptoGost::Verify

DigitalSignature

@author WildDima

Attributes

create_hash[R]
group[R]
message[R]
public_key[R]

Public Class Methods

new(message, group, create_hash = Stribog::CreateHash) click to toggle source
# File lib/crypto_gost/verify.rb, line 10
def initialize(message, group, create_hash = Stribog::CreateHash)
  @message = message
  @group = group
  @create_hash = create_hash
end

Public Instance Methods

call(public_key, sign) click to toggle source
# File lib/crypto_gost/verify.rb, line 16
def call(public_key, sign)
  @public_key = public_key
  @sign = sign
  @hashed_message = hash_message(@message, size: 256)
  r = sign.r
  s = sign.s
  return false if invalid_vector?(r) || invalid_vector?(s)
  (c_param(r, s).x % group.order) == r
end

Private Instance Methods

c_param(r, s) click to toggle source
# File lib/crypto_gost/verify.rb, line 54
def c_param(r, s)
  group.generator * z_param(s) + public_key * z_param(-r)
end
hash_message(message, size: 256) click to toggle source
# File lib/crypto_gost/verify.rb, line 28
def hash_message(message, size: 256)
  create_hash.new(message).(size)
end
hash_mod_ecn() click to toggle source
# File lib/crypto_gost/verify.rb, line 32
def hash_mod_ecn
  hashed = hash_message(message, size: 256).dec
  hashed.zero? ? 1 : hashed
end
invalid_vector?(vector) click to toggle source
# File lib/crypto_gost/verify.rb, line 45
def invalid_vector?(vector)
  !valid_vector?(vector)
end
mod_inv(opt, mod) click to toggle source
# File lib/crypto_gost/verify.rb, line 37
def mod_inv(opt, mod)
  ModularArithmetic.invert(opt, mod)
end
valid_vector?(vector) click to toggle source
# File lib/crypto_gost/verify.rb, line 41
def valid_vector?(vector)
  (1...group.order).cover? vector
end
z_param(param) click to toggle source
# File lib/crypto_gost/verify.rb, line 49
def z_param(param)
  param * mod_inv(hash_mod_ecn, group.order) %
    group.order
end