2 * Copyright 2016-2017 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the OpenSSL license (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
11 * Derived from the BLAKE2 reference implementation written by Samuel Neves.
12 * Copyright 2012, Samuel Neves <sneves@dei.uc.pt>
13 * More information about the BLAKE2 hash function and its implementations
14 * can be found at https://blake2.net.
19 static ossl_inline uint32_t load32(const uint8_t *src)
26 if (is_endian.little) {
28 memcpy(&w, src, sizeof(w));
31 uint32_t w = ((uint32_t)src[0])
32 | ((uint32_t)src[1] << 8)
33 | ((uint32_t)src[2] << 16)
34 | ((uint32_t)src[3] << 24);
39 static ossl_inline uint64_t load64(const uint8_t *src)
46 if (is_endian.little) {
48 memcpy(&w, src, sizeof(w));
51 uint64_t w = ((uint64_t)src[0])
52 | ((uint64_t)src[1] << 8)
53 | ((uint64_t)src[2] << 16)
54 | ((uint64_t)src[3] << 24)
55 | ((uint64_t)src[4] << 32)
56 | ((uint64_t)src[5] << 40)
57 | ((uint64_t)src[6] << 48)
58 | ((uint64_t)src[7] << 56);
63 static ossl_inline void store32(uint8_t *dst, uint32_t w)
70 if (is_endian.little) {
71 memcpy(dst, &w, sizeof(w));
73 uint8_t *p = (uint8_t *)dst;
76 for (i = 0; i < 4; i++)
77 p[i] = (uint8_t)(w >> (8 * i));
81 static ossl_inline void store64(uint8_t *dst, uint64_t w)
88 if (is_endian.little) {
89 memcpy(dst, &w, sizeof(w));
91 uint8_t *p = (uint8_t *)dst;
94 for (i = 0; i < 8; i++)
95 p[i] = (uint8_t)(w >> (8 * i));
99 static ossl_inline uint64_t load48(const uint8_t *src)
101 uint64_t w = ((uint64_t)src[0])
102 | ((uint64_t)src[1] << 8)
103 | ((uint64_t)src[2] << 16)
104 | ((uint64_t)src[3] << 24)
105 | ((uint64_t)src[4] << 32)
106 | ((uint64_t)src[5] << 40);
110 static ossl_inline void store48(uint8_t *dst, uint64_t w)
112 uint8_t *p = (uint8_t *)dst;
114 p[1] = (uint8_t)(w>>8);
115 p[2] = (uint8_t)(w>>16);
116 p[3] = (uint8_t)(w>>24);
117 p[4] = (uint8_t)(w>>32);
118 p[5] = (uint8_t)(w>>40);
121 static ossl_inline uint32_t rotr32(const uint32_t w, const unsigned int c)
123 return (w >> c) | (w << (32 - c));
126 static ossl_inline uint64_t rotr64(const uint64_t w, const unsigned int c)
128 return (w >> c) | (w << (64 - c));