class Virgil::SDK::Client::CardValidator

Class used for cards signatures validation.

Constants

SERVICE_CARD_ID
SERVICE_PUBLIC_KEY

Attributes

crypto[R]
verifiers[R]

Public Class Methods

new(crypto) click to toggle source
# File lib/virgil/sdk/client/card_validator.rb, line 48
def initialize(crypto)
  @crypto = crypto
  @public_key_bytes = Crypto::Bytes.from_base64(SERVICE_PUBLIC_KEY)
  @public_key = crypto.import_public_key(@public_key_bytes)
  @verifiers = {
      SERVICE_CARD_ID => @public_key
  }
end

Public Instance Methods

add_verifier(card_id, public_key) click to toggle source

Add signature verifier.

Args:

card_id: Card identifier
public_key: Public key used for signature verification.
# File lib/virgil/sdk/client/card_validator.rb, line 62
def add_verifier(card_id, public_key)
  @verifiers[card_id] = public_key
end
is_valid?(card) click to toggle source

Validates Card using verifiers.

Args:

card: Card for validation.

Returns:

True if card signatures are valid, false otherwise.
# File lib/virgil/sdk/client/card_validator.rb, line 72
def is_valid?(card)

  return true if (card.version == '3.0')

  if (card.nil? || !card.is_a?(Card) || card.snapshot.nil? || (card.signatures.nil? || card.signatures.empty?))
    return false
  end

  # add self signature verifier
  fingerprint = self.crypto.calculate_fingerprint(
      Crypto::Bytes.from_string(card.snapshot)
  )
  fingerprint_hex = fingerprint.to_hex
  return false if fingerprint_hex != card.id

  verifiers = self.verifiers.clone
  card_public_key = self.crypto.import_public_key(card.public_key)
  verifiers[fingerprint_hex] = card_public_key

  verifiers.each do |id, key|
    unless card.signatures.has_key?(id)
      return false
    end
    is_valid = self.crypto.verify(
        fingerprint.value,
        Crypto::Bytes.from_base64(card.signatures[id]),
        key
    )
    return false unless is_valid
  end
  true
end