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



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

def self.gen_nonce
  return SecureRandom.random_bytes.rstrip
end

.gen_pub(priv_key) ⇒ Object

Generates public key from private key



68
69
70
71
72
73
74
75
# File 'lib/libecp.rb', line 68

def self.gen_pub(priv_key)
  #create pointer
  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
  return [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



58
59
60
# File 'lib/libecp.rb', line 58

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



63
64
65
# File 'lib/libecp.rb', line 63

def self.private_key(uid,pass)
  return 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 (i.e. the signature)



78
79
80
81
82
83
84
85
86
87
88
# File 'lib/libecp.rb', line 78

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
  # these are the coordinates that is the signature:
  return [ rbuf.get_bytes(1, 28), sbuf.get_bytes(1, 28) ]
end