#include "blake_small.h"
#include "blake_common.h"
-#define DEBUG 0
-#define DEBUG_2 0
+#define BUG_1 1 /* bug compatibility for zero length message */
+#define BUG_2 1 /* bug compatibility for messages of length%512=505...511 */
-#define BUG_1 0 /* bug compatibility for zero length message */
-#define BUG_2 0 /* bug compatibility for messages of length%512=505...511 */
-
-
-#if DEBUG_2
- #include "cli.h"
-#endif
-
-#if DEBUG
- #include "cli.h"
- void dump_v(uint32_t* v){
- uint8_t i;
- cli_putstr_P(PSTR("\r\n=== v dump ==="));
- for(i=0; i<16; ++i){
- if(i%8==0)
- cli_putstr_P(PSTR("\r\n\t"));
- cli_hexdump_rev(v+i, 4);
- cli_putc(' ');
- }
- }
-#else
- #define dump_v(v)
-#endif
uint32_t blake_c[] PROGMEM = {
0x243F6A88, 0x85A308D3,
((0x00ff0000&(a))>>8)| \
(a)>>24 )
-void blake_small_g(uint8_t r, uint8_t i, uint32_t* v, const uint32_t* m){
- uint8_t a,b,c,d, s0, s1;
- a = pgm_read_byte(blake_index_lut+4*i+0);
- b = pgm_read_byte(blake_index_lut+4*i+1);
- c = pgm_read_byte(blake_index_lut+4*i+2);
- d = pgm_read_byte(blake_index_lut+4*i+3);
- s0 = pgm_read_byte(blake_sigma+16*r+2*i+0);
- s1 = pgm_read_byte(blake_sigma+16*r+2*i+1);
-#if DEBUG
- if(i==0){
- cli_putstr_P(PSTR("\r\n s0 = "));
- cli_hexdump(&s0, 1);
- cli_putstr_P(PSTR(" s1 = "));
- cli_hexdump(&s1, 1);
- cli_putstr_P(PSTR("\r\n m[s0] = "));
- cli_hexdump_rev(m+s0, 4);
- cli_putstr_P(PSTR("\r\n m[s1] = "));
- cli_hexdump_rev(m+s1, 4);
- }
-#endif
- v[a] += v[b] + (m[s0] ^ pgm_read_dword(&(blake_c[s1])));
- v[d] = ROTR32(v[d]^v[a], 16);
- v[c] += v[d];
- v[b] = ROTR32(v[b]^v[c], 12);
- v[a] += v[b] + (m[s1] ^ pgm_read_dword(&(blake_c[s0])));
- v[d] = ROTR32(v[d]^v[a], 8);
- v[c] += v[d];
- v[b] = ROTR32(v[b]^v[c], 7);
-
-}
-
void blake_small_expand(uint32_t* v, const blake_small_ctx_t* ctx){
uint8_t i;
memcpy(v, ctx->h, 8*4);
void blake_small_compress(uint32_t* v,const void* m){
uint8_t r,i;
-#if DEBUG
- cli_putstr_P(PSTR("\r\n== compress 32 =="));
- dump_v(v);
-#endif
-#if DEBUG_2
- cli_putstr_P(PSTR("\r\n=== message block ===\r\n m ="));
- cli_hexdump_block(m, 512/8, 4, 16);
-#endif
+ uint8_t a,b,c,d, s0, s1;
+ uint32_t lv[4];
for(r=0; r<10; ++r){
for(i=0; i<8; ++i){
- blake_small_g(r, i, v, (uint32_t*)m);
-#if DEBUG
- if(1){
- cli_putstr_P(PSTR("\r\n ROUND: "));
- cli_hexdump(&r,1);
- cli_putstr_P(PSTR(" I: "));
- cli_hexdump(&i,1);
- dump_v(v);
- }
-#endif
+ // blake_small_g(r, i, v, (uint32_t*)m);
+ a = pgm_read_byte(blake_index_lut+4*i+0);
+ b = pgm_read_byte(blake_index_lut+4*i+1);
+ c = pgm_read_byte(blake_index_lut+4*i+2);
+ d = pgm_read_byte(blake_index_lut+4*i+3);
+ s0 = pgm_read_byte(blake_sigma+16*r+2*i+0);
+ s1 = pgm_read_byte(blake_sigma+16*r+2*i+1);
+ lv[0] = v[a];
+ lv[1] = v[b];
+ lv[2] = v[c];
+ lv[3] = v[d];
+
+ lv[0] += lv[1] + (((uint32_t*)m)[s0] ^ pgm_read_dword(&(blake_c[s1])));
+ lv[3] = ROTR32(lv[3]^lv[0], 16);
+ lv[2] += lv[3];
+ lv[1] = ROTR32(lv[1]^lv[2], 12);
+ lv[0] += lv[1] + (((uint32_t*)m)[s1] ^ pgm_read_dword(&(blake_c[s0])));
+ lv[3] = ROTR32(lv[3]^lv[0], 8);
+ lv[2] += lv[3];
+ lv[1] = ROTR32(lv[1]^lv[2], 7);
+
+ v[a] = lv[0];
+ v[b] = lv[1];
+ v[c] = lv[2];
+ v[d] = lv[3];
+
}
}
}