Class: IOTA::Crypto::CCurl
- Inherits:
-
Object
- Object
- IOTA::Crypto::CCurl
- Defined in:
- lib/iota/crypto/curl_c.rb,
ext/ccurl/ccurl.c
Constant Summary collapse
- NUMBER_OF_ROUNDS =
81
- HASH_LENGTH =
243
- STATE_LENGTH =
3 * HASH_LENGTH
Instance Method Summary collapse
- #absorb(data) ⇒ Object
- #initialize(rounds) ⇒ Object constructor
- #reset ⇒ Object
- #squeeze(data) ⇒ Object
- #transform ⇒ Object
- #version ⇒ Object
Constructor Details
#initialize(rounds) ⇒ Object
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'ext/ccurl/ccurl.c', line 30
static VALUE ccurl_init(VALUE self, VALUE rounds) {
Curl *ctx;
int requested = NUMBER_OF_ROUNDS;
if (TYPE(rounds) != T_NIL) {
requested = NUM2INT(rounds);
}
Data_Get_Struct(self, Curl, ctx);
ctx->rounds = requested;
memset(ctx->state, (trit_t)0, STATE_LENGTH * sizeof(trit_t));
return self;
}
|
Instance Method Details
#absorb(data) ⇒ Object
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 |
# File 'ext/ccurl/ccurl.c', line 46
static VALUE ccurl_absorb(VALUE self, VALUE data) {
trit_t *trits;
int offset = 0;
int i;
int length = (int)RARRAY_LEN(data);
Curl *ctx;
Data_Get_Struct(self, Curl, ctx);
trits = (trit_t*)malloc(length * sizeof(trit_t));
for (i = 0; i < length; ++i) {
trits[i] = (trit_t)(NUM2LONG(rb_ary_entry(data, i)));
}
do {
memcpy(ctx->state, trits + offset, (length < HASH_LENGTH ? length : HASH_LENGTH) * sizeof(trit_t));
ccurl_transform(self);
offset += HASH_LENGTH;
} while ((length -= HASH_LENGTH) > 0);
free(trits);
return Qnil;
}
|
#reset ⇒ Object
116 117 118 119 120 121 |
# File 'ext/ccurl/ccurl.c', line 116
static VALUE ccurl_reset(VALUE self) {
Curl *ctx;
Data_Get_Struct(self, Curl, ctx);
memset(ctx->state, 0, STATE_LENGTH * sizeof(char));
return Qnil;
}
|
#squeeze(data) ⇒ Object
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'ext/ccurl/ccurl.c', line 72
static VALUE ccurl_squeeze(VALUE self, VALUE data) {
int offset = 0;
int i;
int length = (int)RARRAY_LEN(data);
Curl *ctx;
Data_Get_Struct(self, Curl, ctx);
do {
for(; length < HASH_LENGTH; length++) {
rb_ary_push(data, LONG2NUM(0));
}
for (i = 0; i < HASH_LENGTH; i++) {
rb_ary_store(data, i, LONG2NUM(ctx->state[i]));
}
ccurl_transform(self);
offset += HASH_LENGTH;
} while ((length -= HASH_LENGTH) > 0);
return Qnil;
}
|
#transform ⇒ Object
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
# File 'ext/ccurl/ccurl.c', line 96
static VALUE ccurl_transform(VALUE self) {
trit_t scratchpad[STATE_LENGTH];
int round, scratchpadIndex=0, scratchpadIndexSave, stateIndex;
Curl *ctx;
Data_Get_Struct(self, Curl, ctx);
for (round = 0; round < NUMBER_OF_ROUNDS; round++) {
memcpy(scratchpad, ctx->state, STATE_LENGTH * sizeof(trit_t));
for (stateIndex = 0; stateIndex < STATE_LENGTH; stateIndex++) {
scratchpadIndexSave = scratchpadIndex;
scratchpadIndex += (scratchpadIndex < 365 ? 364 : -365);
ctx->state[stateIndex] = TRUTH_TABLE[scratchpad[scratchpadIndexSave ] + scratchpad[scratchpadIndex ] * 3 + 4];
}
}
return Qnil;
}
|
#version ⇒ Object
12 13 14 |
# File 'lib/iota/crypto/curl_c.rb', line 12 def version "C" end |