void calculateAddress(const uint8_t* data, size_t size, char* nemAddress) { unsigned char sha3result[32]; Keccak_HashInstance _hctx, *hctx = &_hctx; Keccak_HashInitialize_SHA3_256(hctx); Keccak_HashUpdate(hctx, data, size * 8); Keccak_HashSqueeze(hctx, sha3result, 256); unsigned char r160result[25]; computeRIPEMD160(sha3result, 32, r160result + 1); r160result[0] = 0x68; Keccak_HashInitialize_SHA3_256(hctx); Keccak_HashUpdate(hctx, r160result, 21 * 8); Keccak_HashSqueeze(hctx, sha3result, 256); *(uint32_t*)(r160result + 21) = *(uint32_t*)(sha3result); base32_encode(r160result, 25, (unsigned char*)nemAddress); nemAddress[40] = 0; }
int SHAKE80(const unsigned char *dataIn, size_t nBitsIn, unsigned char *md, int nOutBytes) { Keccak_HashInstance h; if (md == NULL || nOutBytes == 0) { return 0; } if (nOutBytes > SHAKE_MAX_BITS / 8) { nOutBytes = SHAKE_MAX_BITS / 8; } Keccak_HashInitialize(&h, SHAKE80_R, SHAKE80_C, 0, SHAKE80_P); Keccak_HashUpdate(&h, dataIn, (DataLength)nBitsIn); Keccak_HashFinal(&h, NULL); Keccak_HashSqueeze(&h, md, nOutBytes * 8); return nOutBytes; }
static PyObject * SHA3_digest(SHAobject *self, PyObject *unused) { unsigned char *digest = malloc(self->outputlen / 8 + 1); //[MAX_DIGEST_SIZE]; SHAobject temp; SHAcopy(self, &temp); Keccak_HashFinal(&temp.state, digest); if (self->hashbitlen > 512) { // SHAKE Keccak_HashSqueeze(&temp.state, digest, self->outputlen); } PyObject *ret = PyBytes_FromStringAndSize((const char *)digest, self->outputlen / 8); free(digest); return ret; }