module X25519::Provider::Ref10

Public Class Methods

scalarmult(p1, p2) click to toggle source

Variable-base scalar multiplication

static VALUE mX25519_Provider_Ref10_scalarmult(VALUE self, VALUE scalar, VALUE montgomery_u)
{
    X25519_KEY product;

    StringValue(scalar);
    if(RSTRING_LEN(scalar) != X25519_KEYSIZE_BYTES) {
        rb_raise(
            rb_eArgError,
            "expected %d-byte scalar, got %ld",
            X25519_KEYSIZE_BYTES,
            RSTRING_LEN(scalar)
        );
    }

    StringValue(montgomery_u);
    if(RSTRING_LEN(montgomery_u) != X25519_KEYSIZE_BYTES) {
        rb_raise(
            rb_eArgError,
            "expected %d-byte Montgomery-u coordinate, got %ld",
            X25519_KEYSIZE_BYTES,
            RSTRING_LEN(montgomery_u)
        );
    }

    x25519_ref10_scalarmult(
        product,
        (const uint8_t *)RSTRING_PTR(scalar),
        (const uint8_t *)RSTRING_PTR(montgomery_u)
    );

    return rb_str_new((const char *)product, X25519_KEYSIZE_BYTES);
}
scalarmult_base(p1) click to toggle source

Fixed-base scalar multiplication

static VALUE mX25519_Provider_Ref10_scalarmult_base(VALUE self, VALUE scalar)
{
    X25519_KEY product;

    StringValue(scalar);
    if(RSTRING_LEN(scalar) != X25519_KEYSIZE_BYTES) {
        rb_raise(
            rb_eArgError,
            "expected %d-byte scalar, got %ld",
            X25519_KEYSIZE_BYTES,
            RSTRING_LEN(scalar)
        );
    }

    x25519_ref10_scalarmult_base(
        product,
        (const uint8_t *)RSTRING_PTR(scalar)
    );

    return rb_str_new((const char *)product, X25519_KEYSIZE_BYTES);
}