module Ed25519::Provider::Ref10
Public Class Methods
create_keypair(p1)
click to toggle source
static VALUE mEd25519_Provider_Ref10_create_keypair(VALUE self, VALUE seed)
{
uint8_t verify_key[PUBLICKEYBYTES];
uint8_t keypair[SECRETKEYBYTES];
StringValue(seed);
if(RSTRING_LEN(seed) != SECRETKEYBYTES / 2) {
rb_raise(rb_eArgError, "seed must be exactly %d bytes", SECRETKEYBYTES / 2);
}
crypto_sign_ed25519_ref10_seed_keypair(verify_key, keypair, (uint8_t *)RSTRING_PTR(seed));
return rb_str_new((const char *)keypair, SECRETKEYBYTES);
}
sign(p1, p2)
click to toggle source
static VALUE mEd25519_Provider_Ref10_sign(VALUE self, VALUE signing_key, VALUE msg)
{
uint8_t *sig_and_msg;
uint64_t sig_and_msg_len;
VALUE result;
StringValue(signing_key);
StringValue(msg);
if(RSTRING_LEN(signing_key) != SECRETKEYBYTES) {
rb_raise(rb_eArgError, "private signing keys must be %d bytes", SECRETKEYBYTES);
}
sig_and_msg = (uint8_t *)xmalloc(SIGNATUREBYTES + RSTRING_LEN(msg));
crypto_sign_ed25519_ref10(
sig_and_msg, &sig_and_msg_len,
(uint8_t *)RSTRING_PTR(msg), RSTRING_LEN(msg),
(uint8_t *)RSTRING_PTR(signing_key)
);
result = rb_str_new((const char *)sig_and_msg, SIGNATUREBYTES);
xfree(sig_and_msg);
return result;
}
verify(p1, p2, p3)
click to toggle source
static VALUE mEd25519_Provider_Ref10_verify(VALUE self, VALUE verify_key, VALUE signature, VALUE msg)
{
uint8_t *sig_and_msg, *buffer;
uint64_t sig_and_msg_len, buffer_len;
int result;
StringValue(verify_key);
StringValue(signature);
StringValue(msg);
if(RSTRING_LEN(verify_key) != PUBLICKEYBYTES) {
rb_raise(rb_eArgError, "public verify keys must be %d bytes", PUBLICKEYBYTES);
}
if(RSTRING_LEN(signature) != SIGNATUREBYTES) {
rb_raise(rb_eArgError, "signatures must be %d bytes", SIGNATUREBYTES);
}
sig_and_msg_len = SIGNATUREBYTES + RSTRING_LEN(msg);
sig_and_msg = (unsigned char *)xmalloc(sig_and_msg_len);
buffer = (unsigned char *)xmalloc(sig_and_msg_len);
memcpy(sig_and_msg, RSTRING_PTR(signature), SIGNATUREBYTES);
memcpy(sig_and_msg + SIGNATUREBYTES, RSTRING_PTR(msg), RSTRING_LEN(msg));
result = crypto_sign_open_ed25519_ref10(
buffer, &buffer_len,
sig_and_msg, sig_and_msg_len,
(uint8_t *)RSTRING_PTR(verify_key)
);
xfree(sig_and_msg);
xfree(buffer);
return result == 0 ? Qtrue : Qfalse;
}