/*
- * Copyright 2016-2017 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved.
*
- * Licensed under the OpenSSL license (the "License"). You may not use
+ * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
}
}
-/* init2 xors IV with input parameter block */
+/* init xors IV with input parameter block and sets the output length */
static void blake2s_init_param(BLAKE2S_CTX *S, const BLAKE2S_PARAM *P)
{
const uint8_t *p = (const uint8_t *)(P);
size_t i;
+
+ blake2s_init0(S);
+ S->outlen = P->digest_length;
/* The param struct is carefully hand packed, and should be 32 bytes on
* every platform. */
assert(sizeof(BLAKE2S_PARAM) == 32);
- blake2s_init0(S);
/* IV XOR ParamBlock */
for (i = 0; i < 8; ++i) {
S->h[i] ^= load32(&p[i*4]);
*/
int BLAKE2s_Final(unsigned char *md, BLAKE2S_CTX *c)
{
+ uint8_t outbuffer[BLAKE2S_OUTBYTES] = {0};
int i;
blake2s_set_lastblock(c);
/* Output full hash to temp buffer */
for (i = 0; i < 8; ++i) {
- store32(md + sizeof(c->h[i]) * i, c->h[i]);
+ store32(outbuffer + sizeof(c->h[i]) * i, c->h[i]);
}
+ memcpy(md, outbuffer, c->outlen);
OPENSSL_cleanse(c, sizeof(BLAKE2S_CTX));
return 1;
}