Extract CryptoNote crypto sources from upstream (fa1608cf). Build as static libcryptonote.a via CMake with compat stubs for external dependencies (warnings, logging, varint, profiling). 37 upstream files, 10 compat stubs, 680KB static library. Co-Authored-By: Charon <charon@lethean.io>
129 lines
3.5 KiB
C
Executable file
129 lines
3.5 KiB
C
Executable file
// Copyright (c) 2014-2018 Zano Project
|
||
// Copyright (c) 2014-2018 The Louisdor Project
|
||
// Copyright (c) 2012-2013 The Boolberry developers
|
||
// Copyright (c) 2017-2025 Lethean (https://lt.hn)
|
||
//
|
||
// Licensed under the European Union Public Licence (EUPL) version 1.2.
|
||
// You may obtain a copy of the licence at:
|
||
//
|
||
// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl
|
||
//
|
||
// The EUPL is a copyleft licence that is compatible with the MIT/X11
|
||
// licence used by the original projects; the MIT terms are therefore
|
||
// considered “grandfathered” under the EUPL for this code.
|
||
//
|
||
// SPDX‑License‑Identifier: EUPL-1.2
|
||
//
|
||
|
||
// keccak.c
|
||
// 19-Nov-11 Markku-Juhani O. Saarinen <mjos@iki.fi>
|
||
// A baseline Keccak (3rd round) implementation.
|
||
|
||
#include "hash-ops.h"
|
||
#include "keccak.h"
|
||
|
||
const uint64_t keccakf_rndc[24] =
|
||
{
|
||
0x0000000000000001, 0x0000000000008082, 0x800000000000808a,
|
||
0x8000000080008000, 0x000000000000808b, 0x0000000080000001,
|
||
0x8000000080008081, 0x8000000000008009, 0x000000000000008a,
|
||
0x0000000000000088, 0x0000000080008009, 0x000000008000000a,
|
||
0x000000008000808b, 0x800000000000008b, 0x8000000000008089,
|
||
0x8000000000008003, 0x8000000000008002, 0x8000000000000080,
|
||
0x000000000000800a, 0x800000008000000a, 0x8000000080008081,
|
||
0x8000000000008080, 0x0000000080000001, 0x8000000080008008
|
||
};
|
||
|
||
const int keccakf_rotc[24] =
|
||
{
|
||
1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14,
|
||
27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44
|
||
};
|
||
|
||
const int keccakf_piln[24] =
|
||
{
|
||
10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4,
|
||
15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1
|
||
};
|
||
|
||
// update the state with given number of rounds
|
||
|
||
void keccakf(uint64_t st[25], int rounds)
|
||
{
|
||
int i, j, round;
|
||
uint64_t t, bc[5];
|
||
|
||
for (round = 0; round < rounds; round++) {
|
||
|
||
// Theta
|
||
for (i = 0; i < 5; i++)
|
||
bc[i] = st[i] ^ st[i + 5] ^ st[i + 10] ^ st[i + 15] ^ st[i + 20];
|
||
|
||
for (i = 0; i < 5; i++) {
|
||
t = bc[(i + 4) % 5] ^ ROTL64(bc[(i + 1) % 5], 1);
|
||
for (j = 0; j < 25; j += 5)
|
||
st[j + i] ^= t;
|
||
}
|
||
|
||
// Rho Pi
|
||
t = st[1];
|
||
for (i = 0; i < 24; i++) {
|
||
j = keccakf_piln[i];
|
||
bc[0] = st[j];
|
||
st[j] = ROTL64(t, keccakf_rotc[i]);
|
||
t = bc[0];
|
||
}
|
||
|
||
// Chi
|
||
for (j = 0; j < 25; j += 5) {
|
||
for (i = 0; i < 5; i++)
|
||
bc[i] = st[j + i];
|
||
for (i = 0; i < 5; i++)
|
||
st[j + i] ^= (~bc[(i + 1) % 5]) & bc[(i + 2) % 5];
|
||
}
|
||
|
||
// Iota
|
||
st[0] ^= keccakf_rndc[round];
|
||
}
|
||
}
|
||
|
||
// compute a keccak hash (md) of given byte length from "in"
|
||
typedef uint64_t state_t[25];
|
||
|
||
int keccak(const uint8_t *in, int inlen, uint8_t *md, int mdlen)
|
||
{
|
||
state_t st;
|
||
uint8_t temp[144];
|
||
int i, rsiz, rsizw;
|
||
|
||
rsiz = sizeof(state_t) == mdlen ? HASH_DATA_AREA : 200 - 2 * mdlen;
|
||
rsizw = rsiz / 8;
|
||
|
||
memset(st, 0, sizeof(st));
|
||
|
||
for ( ; inlen >= rsiz; inlen -= rsiz, in += rsiz) {
|
||
for (i = 0; i < rsizw; i++)
|
||
st[i] ^= ((uint64_t *) in)[i];
|
||
keccakf(st, KECCAK_ROUNDS);
|
||
}
|
||
|
||
// last block and padding
|
||
memcpy(temp, in, inlen);
|
||
temp[inlen++] = 1;
|
||
memset(temp + inlen, 0, rsiz - inlen);
|
||
temp[rsiz - 1] |= 0x80;
|
||
|
||
for (i = 0; i < rsizw; i++)
|
||
st[i] ^= ((uint64_t *) temp)[i];
|
||
|
||
keccakf(st, KECCAK_ROUNDS);
|
||
|
||
memcpy(md, st, mdlen);
|
||
|
||
return 0;
|
||
}
|
||
|
||
void keccak1600(const uint8_t *in, int inlen, uint8_t *md)
|
||
{
|
||
keccak(in, inlen, md, sizeof(state_t));
|
||
}
|