forked from chuanwc/node-multi-hashing-1
-
Notifications
You must be signed in to change notification settings - Fork 6
/
phi.c
94 lines (75 loc) · 2.64 KB
/
phi.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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
#include "phi.h"
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include "sha3/sph_skein.h"
#include "sha3/sph_jh.h"
#include "sha3/sph_cubehash.h"
#include "sha3/sph_fugue.h"
#include "sha3/sph_gost.h"
#include "sha3/sph_echo.h"
void phi1612_hash(const char* input, char* output, uint32_t len)
{
sph_skein512_context ctx_skein;
sph_jh512_context ctx_jh;
sph_cubehash512_context ctx_cubehash;
sph_fugue512_context ctx_fugue;
sph_gost512_context ctx_gost;
sph_echo512_context ctx_echo;
uint8_t hash[64 * 6];
sph_skein512_init(&ctx_skein);
sph_skein512 (&ctx_skein, input, len);
sph_skein512_close(&ctx_skein, hash);
sph_jh512_init(&ctx_jh);
sph_jh512 (&ctx_jh, hash, 64);
sph_jh512_close(&ctx_jh, hash + 1*64);
sph_cubehash512_init(&ctx_cubehash);
sph_cubehash512 (&ctx_cubehash, hash + 1*64, 64);
sph_cubehash512_close(&ctx_cubehash, hash + 2*64);
sph_fugue512_init(&ctx_fugue);
sph_fugue512 (&ctx_fugue, hash + 2*64, 64);
sph_fugue512_close(&ctx_fugue, hash + 3*64);
sph_gost512_init(&ctx_gost);
sph_gost512 (&ctx_gost, hash + 3*64, 64);
sph_gost512_close(&ctx_gost, hash + 4*64);
sph_echo512_init(&ctx_echo);
sph_echo512 (&ctx_echo, hash + 4*64, 64);
sph_echo512_close(&ctx_echo, hash + 5*64);
memcpy(output, hash + 5*64, 32);
}
void phi2_hash(const char* input, char* output, uint32_t len)
{
unsigned char hash[64], hashA[64], hashB[64];
sph_cubehash512_context ctx_cubehash;
sph_jh512_context ctx_jh;
sph_gost512_context ctx_gost;
sph_echo512_context ctx_echo;
sph_skein512_context ctx_skein;
sph_cubehash512_init(&ctx_cubehash);
sph_cubehash512(&ctx_cubehash, input, len);
sph_cubehash512_close(&ctx_cubehash, hashB);
LYRA2_old(&hashA[ 0], 32, &hashB[ 0], 32, &hashB[ 0], 32, 1, 8, 8);
LYRA2_old(&hashA[32], 32, &hashB[32], 32, &hashB[32], 32, 1, 8, 8);
sph_jh512_init(&ctx_jh);
sph_jh512(&ctx_jh, hashA, 64);
sph_jh512_close(&ctx_jh, hash);
if (hash[0] & 1) {
sph_gost512_init(&ctx_gost);
sph_gost512(&ctx_gost, hash, 64);
sph_gost512_close(&ctx_gost, hash);
} else {
sph_echo512_init(&ctx_echo);
sph_echo512(&ctx_echo, hash, 64);
sph_echo512_close(&ctx_echo, hash);
sph_echo512_init(&ctx_echo);
sph_echo512(&ctx_echo, hash, 64);
sph_echo512_close(&ctx_echo, hash);
}
sph_skein512_init(&ctx_skein);
sph_skein512(&ctx_skein, hash, 64);
sph_skein512_close(&ctx_skein, hash);
for (int i=0; i<32; i++)
hash[i] ^= hash[i+32];
memcpy(output, hash, 32);
}