27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
# File 'ext/self_crypto/utility.c', line 27
static VALUE ed25519_pk_to_curve25519(VALUE self, VALUE ed25519_pk)
{
VALUE curve25519_sk;
void *pk_ptr, *dec_ptr, *enc_ptr;
size_t pk_sz, dec_sz, enc_sz, success;
if(rb_obj_is_kind_of(ed25519_pk, rb_eval_string("String")) != Qtrue){
rb_raise(rb_eTypeError, "ed25519_pk must be kind of String");
}
pk_sz = crypto_sign_publickeybytes();
if((dec_ptr = malloc(pk_sz)) == NULL){
rb_raise(rb_eNoMemError, "%s()", __FUNCTION__);
}
success = sodium_base642bin(
dec_ptr,
pk_sz,
RSTRING_PTR(ed25519_pk),
RSTRING_LEN(ed25519_pk),
NULL,
&dec_sz,
NULL,
sodium_base64_VARIANT_ORIGINAL_NO_PADDING
);
if(success != 0) {
free(dec_ptr);
rb_raise(rb_eTypeError, "could not convert ed25519 public key");
}
if((pk_ptr = malloc(pk_sz)) == NULL){
rb_raise(rb_eNoMemError, "%s()", __FUNCTION__);
}
success = crypto_sign_ed25519_pk_to_curve25519(
pk_ptr,
dec_ptr
);
free(dec_ptr);
if(success != 0) {
free(pk_ptr);
rb_raise(rb_eTypeError, "could not convert ed25519 public key");
}
enc_sz = sodium_base64_ENCODED_LEN(pk_sz, sodium_base64_VARIANT_ORIGINAL_NO_PADDING);
if((enc_ptr = malloc(enc_sz)) == NULL){
rb_raise(rb_eNoMemError, "%s()", __FUNCTION__);
}
sodium_bin2base64(
enc_ptr,
enc_sz,
pk_ptr,
pk_sz,
sodium_base64_VARIANT_ORIGINAL_NO_PADDING
);
free(pk_ptr);
curve25519_sk = rb_str_new(enc_ptr, 44);
free(enc_ptr);
return curve25519_sk;
}
|