|
1 | 1 | from starkware.cairo.common.alloc import alloc
|
2 | 2 | from starkware.cairo.common.cairo_blake2s.blake2s import blake_with_opcode
|
3 |
| -from starkware.cairo.common.cairo_blake2s.blake2s import BLAKE2S_FINALIZE_INSTRUCTION |
4 | 3 |
|
5 | 4 | // Computes blake2s of `input` of size 16 felts, representing 32 bits each.
|
6 | 5 | // The initial state is the standard BLAKE2s IV XORed with the parameter block P[0] = 0x01010020.
|
7 | 6 | func blake_with_opcode_for_single_16_length_word(data: felt*, out: felt*, initial_state: felt*) {
|
| 7 | + const BLAKE2S_FINALIZE_OPCODE_EXT = 2; |
| 8 | + const OP0_REG = 1; // State is fp-based. |
| 9 | + const OP1_FP = 3; // Data is fp-based. |
| 10 | + const AP_ADD1 = 11; // Increment ap by 1 after the instruction. |
| 11 | + const BLAKE2S_FLAGS = 2 ** OP0_REG + 2 ** OP1_FP + 2 ** AP_ADD1; |
| 12 | +
|
| 13 | + const STATE_OFFSET = -3; |
| 14 | + const MESSAGE_OFFSET = -5; |
| 15 | + const COUNTER_OFFSET = -1; |
| 16 | +
|
| 17 | + const POS_STATE_OFFSET = 2 ** 15 + STATE_OFFSET; |
| 18 | + const POS_MESSAGE_OFFSET = 2 ** 15 + MESSAGE_OFFSET; |
| 19 | + const POS_COUNTER_OFFSET = 2 ** 15 + COUNTER_OFFSET; |
| 20 | +
|
| 21 | + const BLAKE2S_FINALIZE_INSTRUCTION = POS_COUNTER_OFFSET + POS_STATE_OFFSET * 2 ** 16 + |
| 22 | + POS_MESSAGE_OFFSET * 2 ** 32 + BLAKE2S_FLAGS * 2 ** 48 + BLAKE2S_FINALIZE_OPCODE_EXT * 2 ** |
| 23 | + 63; |
| 24 | +
|
8 | 25 | tempvar counter = 64;
|
9 |
| - [ap] = initial_state, ap++; |
10 |
| - [ap] = data, ap++; |
11 |
| - [ap] = counter, ap++; |
12 | 26 | [ap] = out;
|
| 27 | + static_assert [ap + COUNTER_OFFSET] == counter; |
| 28 | + static_assert [fp + STATE_OFFSET] == initial_state; |
| 29 | + static_assert [fp + MESSAGE_OFFSET] == data; |
13 | 30 | dw BLAKE2S_FINALIZE_INSTRUCTION;
|
14 |
| - // Increment AP after blake opcode. |
15 |
| - ap += 1; |
16 | 31 | return ();
|
17 | 32 | }
|
18 | 33 |
|
|
0 commit comments