Path: blob/main/crypto/openssl/providers/implementations/digests/blake2_impl.h
48383 views
/*1* Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved.2*3* Licensed under the Apache License 2.0 (the "License"). You may not use4* this file except in compliance with the License. You can obtain a copy5* in the file LICENSE in the source distribution or at6* https://www.openssl.org/source/license.html7*/89/*10* Derived from the BLAKE2 reference implementation written by Samuel Neves.11* Copyright 2012, Samuel Neves <[email protected]>12* More information about the BLAKE2 hash function and its implementations13* can be found at https://blake2.net.14*/1516#include <string.h>17#include "internal/endian.h"1819static ossl_inline uint32_t load32(const uint8_t *src)20{21DECLARE_IS_ENDIAN;2223if (IS_LITTLE_ENDIAN) {24uint32_t w;25memcpy(&w, src, sizeof(w));26return w;27} else {28uint32_t w = ((uint32_t)src[0])29| ((uint32_t)src[1] << 8)30| ((uint32_t)src[2] << 16)31| ((uint32_t)src[3] << 24);32return w;33}34}3536static ossl_inline uint64_t load64(const uint8_t *src)37{38DECLARE_IS_ENDIAN;3940if (IS_LITTLE_ENDIAN) {41uint64_t w;42memcpy(&w, src, sizeof(w));43return w;44} else {45uint64_t w = ((uint64_t)src[0])46| ((uint64_t)src[1] << 8)47| ((uint64_t)src[2] << 16)48| ((uint64_t)src[3] << 24)49| ((uint64_t)src[4] << 32)50| ((uint64_t)src[5] << 40)51| ((uint64_t)src[6] << 48)52| ((uint64_t)src[7] << 56);53return w;54}55}5657static ossl_inline void store32(uint8_t *dst, uint32_t w)58{59DECLARE_IS_ENDIAN;6061if (IS_LITTLE_ENDIAN) {62memcpy(dst, &w, sizeof(w));63} else {64uint8_t *p = (uint8_t *)dst;65int i;6667for (i = 0; i < 4; i++)68p[i] = (uint8_t)(w >> (8 * i));69}70}7172static ossl_inline void store64(uint8_t *dst, uint64_t w)73{74DECLARE_IS_ENDIAN;7576if (IS_LITTLE_ENDIAN) {77memcpy(dst, &w, sizeof(w));78} else {79uint8_t *p = (uint8_t *)dst;80int i;8182for (i = 0; i < 8; i++)83p[i] = (uint8_t)(w >> (8 * i));84}85}8687static ossl_inline uint64_t load48(const uint8_t *src)88{89uint64_t w = ((uint64_t)src[0])90| ((uint64_t)src[1] << 8)91| ((uint64_t)src[2] << 16)92| ((uint64_t)src[3] << 24)93| ((uint64_t)src[4] << 32)94| ((uint64_t)src[5] << 40);95return w;96}9798static ossl_inline void store48(uint8_t *dst, uint64_t w)99{100uint8_t *p = (uint8_t *)dst;101p[0] = (uint8_t)w;102p[1] = (uint8_t)(w>>8);103p[2] = (uint8_t)(w>>16);104p[3] = (uint8_t)(w>>24);105p[4] = (uint8_t)(w>>32);106p[5] = (uint8_t)(w>>40);107}108109static ossl_inline uint32_t rotr32(const uint32_t w, const unsigned int c)110{111return (w >> c) | (w << (32 - c));112}113114static ossl_inline uint64_t rotr64(const uint64_t w, const unsigned int c)115{116return (w >> c) | (w << (64 - c));117}118119120