7 #include "crypto_hashblocks_sha256.h"
8 #include "crypto_auth.h"
10 #define blocks crypto_hashblocks_sha256
12 typedef unsigned int uint32
;
14 static const char iv
[32] = {
25 int crypto_auth(unsigned char *out
,const unsigned char *in
,unsigned long long inlen
,const unsigned char *k
)
28 unsigned char padded
[128];
30 unsigned long long bits
= 512 + (inlen
<< 3);
32 for (i
= 0;i
< 32;++i
) h
[i
] = iv
[i
];
34 for (i
= 0;i
< 32;++i
) padded
[i
] = k
[i
] ^ 0x36;
35 for (i
= 32;i
< 64;++i
) padded
[i
] = 0x36;
43 for (i
= 0;i
< inlen
;++i
) padded
[i
] = in
[i
];
47 for (i
= inlen
+ 1;i
< 56;++i
) padded
[i
] = 0;
48 padded
[56] = bits
>> 56;
49 padded
[57] = bits
>> 48;
50 padded
[58] = bits
>> 40;
51 padded
[59] = bits
>> 32;
52 padded
[60] = bits
>> 24;
53 padded
[61] = bits
>> 16;
54 padded
[62] = bits
>> 8;
58 for (i
= inlen
+ 1;i
< 120;++i
) padded
[i
] = 0;
59 padded
[120] = bits
>> 56;
60 padded
[121] = bits
>> 48;
61 padded
[122] = bits
>> 40;
62 padded
[123] = bits
>> 32;
63 padded
[124] = bits
>> 24;
64 padded
[125] = bits
>> 16;
65 padded
[126] = bits
>> 8;
70 for (i
= 0;i
< 32;++i
) padded
[i
] = k
[i
] ^ 0x5c;
71 for (i
= 32;i
< 64;++i
) padded
[i
] = 0x5c;
72 for (i
= 0;i
< 32;++i
) padded
[64 + i
] = h
[i
];
74 for (i
= 0;i
< 32;++i
) out
[i
] = iv
[i
];
76 for (i
= 32;i
< 64;++i
) padded
[64 + i
] = 0;
77 padded
[64 + 32] = 0x80;
80 blocks(out
,padded
,128);