class ZKSync::Key

Public Class Methods

new(passphrase, opts={}) click to toggle source
# File lib/zksync/key.rb, line 31
def initialize(passphrase, opts={})
  @raw_key = case opts[:type]
  when :literal
    passphrase
  when :passphrase
    kdf(passphrase)
  else
    Digest::SHA256.digest(passphrase)
  end

  @mode = opts[:mode] || :CBC
  @iv = Digest::SHA256.digest("iv" + @raw_key)
end
size() click to toggle source
# File lib/zksync/key.rb, line 20
def self.size
  32 # size in bytes of the key
end
write_size() click to toggle source
# File lib/zksync/key.rb, line 24
def self.write_size
  return @write_size if @write_size

  k = Key.new("", type: :key)
  @write_size = k.encrypt(k.to_b).length
end

Public Instance Methods

child_key(string, opts={}) click to toggle source
# File lib/zksync/key.rb, line 49
def child_key(string, opts={})
  Key.new(to_s + "::" + string, {type: :key}.merge(opts))
end
decrypt(ciphertext) click to toggle source
# File lib/zksync/key.rb, line 65
def decrypt(ciphertext)
  decipher = OpenSSL::Cipher::AES.new(8*self.class.size, @mode)
  decipher.decrypt
  decipher.key = @raw_key
  decipher.iv = @iv
  decipher.update(ciphertext) + decipher.final
end
encrypt(plaintext, padding=0) click to toggle source
# File lib/zksync/key.rb, line 57
def encrypt(plaintext, padding=0)
  cipher = OpenSSL::Cipher::AES.new(8*self.class.size, @mode)
  cipher.encrypt
  cipher.key = to_b
  cipher.iv = @iv
  cipher.update(plaintext) + cipher.final
end
kdf(passphrase) click to toggle source
# File lib/zksync/key.rb, line 45
def kdf(passphrase)
  OpenSSL::PKCS5.pbkdf2_hmac_sha1(passphrase, "ZKSync", 2**16, self.class.size)
end
to_b() click to toggle source
# File lib/zksync/key.rb, line 77
def to_b
  @raw_key
end
to_s() click to toggle source
# File lib/zksync/key.rb, line 73
def to_s
  @raw_key.unpack("H*").first
end
write_size() click to toggle source
# File lib/zksync/key.rb, line 53
def write_size
  to_b.length
end