Module: LibEcp

Extended by:
FFI::Library
Defined in:
lib/libecp.rb

Constant Summary collapse

@@pb =

Create the buffers

FFI::MemoryPointer.new(:char, 29)
@@ab =
FFI::MemoryPointer.new(:char, 29)
@@gb =
FFI::MemoryPointer.new(:char, 29*3)
@@nb =
FFI::MemoryPointer.new(:char, 29)

Class Method Summary collapse

Class Method Details

.gen_nonceObject



34
35
36
# File 'lib/libecp.rb', line 34

def self.gen_nonce
  SecureRandom.random_bytes(16)
end

.gen_pub(priv_key) ⇒ Object

Generates public key from private key



49
50
51
52
53
54
55
56
# File 'lib/libecp.rb', line 49

def self.gen_pub(priv_key)
  qbuf = FFI::MemoryPointer.new(:char, 29*3)
  zbuf = FFI::MemoryPointer.new(:char, 29)
  zbuf.put_bytes(1, priv_key)
  LibEcp::ecp_pubkey_u8 qbuf, @@pb, @@ab, @@gb, zbuf, 29

  [Base64.encode64(qbuf.get_bytes(1, 28)).rstrip, Base64.encode64(qbuf.get_bytes(30, 28)).rstrip]
end

.gen_uid(user_id) ⇒ Object

Generates user id as a bytestring



39
40
41
# File 'lib/libecp.rb', line 39

def self.gen_uid(user_id)
  (user_id >> 56 & 0xFF).chr + (user_id >> 48 & 0xFF).chr + (user_id >> 40 & 0xFF).chr + (user_id >> 32 & 0xFF).chr + (user_id >> 24 & 0xFF).chr + (user_id >> 16 & 0xFF).chr + (user_id >> 8 & 0xFF).chr + (user_id & 0xFF).chr
end

.private_key(uid, pass) ⇒ Object

Generates users private key, Arguments: user id bytestring (from gen_uid), password String



44
45
46
# File 'lib/libecp.rb', line 44

def self.private_key(uid, pass)
  OpenSSL::Digest.digest("SHA224", uid + pass)
end

.sign(user_id, snonce, cnonce, priv_key) ⇒ Object

Arguments: user id, server nonce, client nonce, users private key. Returns an array with the two coordinates that is the signature.



60
61
62
63
64
65
66
67
68
69
70
# File 'lib/libecp.rb', line 60

def self.sign(user_id, snonce, cnonce, priv_key)
  rbuf = FFI::MemoryPointer.new(:char, 29)
  sbuf = FFI::MemoryPointer.new(:char, 29)
  dbuf = FFI::MemoryPointer.new(:char, 29)
  dbuf.put_bytes(1, priv_key)
  zbuf = FFI::MemoryPointer.new(:char, 29)
  zbuf.put_bytes(1, OpenSSL::Digest.digest("SHA224", user_id + snonce + cnonce))
  LibEcp::ecp_sign_u8 rbuf, sbuf, @@pb, @@ab, @@gb, @@nb, dbuf, zbuf, 29

  [rbuf.get_bytes(1, 28), sbuf.get_bytes(1, 28)]
end