Class: ZKSync::Key

Inherits:
Object
  • Object
show all
Defined in:
lib/zksync/key.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(passphrase, opts = {}) ⇒ Key

Returns a new instance of Key.



31
32
33
34
35
36
37
38
39
40
41
42
43
# 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

Class Method Details

.sizeObject



20
21
22
# File 'lib/zksync/key.rb', line 20

def self.size
  32 # size in bytes of the key
end

.write_sizeObject



24
25
26
27
28
29
# 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

Instance Method Details

#child_key(string, opts = {}) ⇒ Object



49
50
51
# File 'lib/zksync/key.rb', line 49

def child_key(string, opts={})
  Key.new(to_s + "::" + string, {type: :key}.merge(opts))
end

#decrypt(ciphertext) ⇒ Object



65
66
67
68
69
70
71
# 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) ⇒ Object



57
58
59
60
61
62
63
# 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) ⇒ Object



45
46
47
# File 'lib/zksync/key.rb', line 45

def kdf(passphrase)
  OpenSSL::PKCS5.pbkdf2_hmac_sha1(passphrase, "ZKSync", 2**16, self.class.size)
end

#to_bObject



77
78
79
# File 'lib/zksync/key.rb', line 77

def to_b
  @raw_key
end

#to_sObject



73
74
75
# File 'lib/zksync/key.rb', line 73

def to_s
  @raw_key.unpack("H*").first
end

#write_sizeObject



53
54
55
# File 'lib/zksync/key.rb', line 53

def write_size
  to_b.length
end