1736d6639SKyle Evans /* 2736d6639SKyle Evans * Copyright (C) 2017 - This file is part of libecc project 3736d6639SKyle Evans * 4736d6639SKyle Evans * Authors: 5736d6639SKyle Evans * Ryad BENADJILA <ryadbenadjila@gmail.com> 6736d6639SKyle Evans * Arnaud EBALARD <arnaud.ebalard@ssi.gouv.fr> 7736d6639SKyle Evans * Jean-Pierre FLORI <jean-pierre.flori@ssi.gouv.fr> 8736d6639SKyle Evans * 9736d6639SKyle Evans * Contributors: 10736d6639SKyle Evans * Nicolas VIVET <nicolas.vivet@ssi.gouv.fr> 11736d6639SKyle Evans * Karim KHALFALLAH <karim.khalfallah@ssi.gouv.fr> 12736d6639SKyle Evans * 13736d6639SKyle Evans * This software is licensed under a dual BSD and GPL v2 license. 14736d6639SKyle Evans * See LICENSE file at the root folder of the project. 15736d6639SKyle Evans */ 16736d6639SKyle Evans #ifndef __SHA2_H__ 17736d6639SKyle Evans #define __SHA2_H__ 18736d6639SKyle Evans 19736d6639SKyle Evans #include <libecc/words/words.h> 20736d6639SKyle Evans 21736d6639SKyle Evans /* Useful primitives for handling 128-bit */ 22736d6639SKyle Evans 23736d6639SKyle Evans /* Add a 128-bit to a 64-bit element and store the result 24736d6639SKyle Evans * in the input 25736d6639SKyle Evans */ 26736d6639SKyle Evans #define ADD_UINT128_UINT64(low,high,toadd) do {\ 27736d6639SKyle Evans (low) += (toadd);\ 28736d6639SKyle Evans if((low) < (toadd)){\ 29736d6639SKyle Evans (high)++;\ 30736d6639SKyle Evans }\ 31736d6639SKyle Evans } while(0) 32736d6639SKyle Evans 33736d6639SKyle Evans /* Store a 128-bit element in big endian format */ 34736d6639SKyle Evans #define PUT_UINT128_BE(low,high,b,i) do {\ 35736d6639SKyle Evans PUT_UINT64_BE((high), (b), (i));\ 36736d6639SKyle Evans PUT_UINT64_BE((low), (b), (i)+8);\ 37736d6639SKyle Evans } while(0) 38736d6639SKyle Evans 39736d6639SKyle Evans /* Multiply a 128-bit element by 8 and store it in big endian 40736d6639SKyle Evans * format 41736d6639SKyle Evans */ 42736d6639SKyle Evans #define PUT_MUL8_UINT128_BE(low,high,b,i) do {\ 43736d6639SKyle Evans u64 reslow, reshigh;\ 44736d6639SKyle Evans reslow = (low) << 3;\ 45736d6639SKyle Evans reshigh = ((low) >> 61) ^ ((high) << 3);\ 46736d6639SKyle Evans PUT_UINT128_BE(reslow,reshigh,(b),(i));\ 47736d6639SKyle Evans } while(0) 48736d6639SKyle Evans 49736d6639SKyle Evans /* 50736d6639SKyle Evans * 32-bit integer manipulation macros (big endian) 51736d6639SKyle Evans */ 52736d6639SKyle Evans #ifndef GET_UINT32_BE 53736d6639SKyle Evans #define GET_UINT32_BE(n, b, i) \ 54736d6639SKyle Evans do { \ 55736d6639SKyle Evans (n) = ( ((u32) (b)[(i) ]) << 24 ) \ 56736d6639SKyle Evans | ( ((u32) (b)[(i) + 1]) << 16 ) \ 57736d6639SKyle Evans | ( ((u32) (b)[(i) + 2]) << 8 ) \ 58736d6639SKyle Evans | ( ((u32) (b)[(i) + 3]) ); \ 59736d6639SKyle Evans } while( 0 ) 60736d6639SKyle Evans #endif 61736d6639SKyle Evans 62736d6639SKyle Evans #ifndef PUT_UINT32_BE 63736d6639SKyle Evans #define PUT_UINT32_BE(n, b, i) \ 64736d6639SKyle Evans do { \ 65736d6639SKyle Evans (b)[(i) ] = (u8) ( (n) >> 24 ); \ 66736d6639SKyle Evans (b)[(i) + 1] = (u8) ( (n) >> 16 ); \ 67736d6639SKyle Evans (b)[(i) + 2] = (u8) ( (n) >> 8 ); \ 68736d6639SKyle Evans (b)[(i) + 3] = (u8) ( (n) ); \ 69736d6639SKyle Evans } while( 0 ) 70736d6639SKyle Evans #endif 71736d6639SKyle Evans 72736d6639SKyle Evans /* 73736d6639SKyle Evans * 64-bit integer manipulation macros (big endian) 74736d6639SKyle Evans */ 75736d6639SKyle Evans #ifndef GET_UINT64_BE 76736d6639SKyle Evans #define GET_UINT64_BE(n,b,i) \ 77736d6639SKyle Evans do { \ 78736d6639SKyle Evans (n) = ( ((u64) (b)[(i) ]) << 56 ) \ 79736d6639SKyle Evans | ( ((u64) (b)[(i) + 1]) << 48 ) \ 80736d6639SKyle Evans | ( ((u64) (b)[(i) + 2]) << 40 ) \ 81736d6639SKyle Evans | ( ((u64) (b)[(i) + 3]) << 32 ) \ 82736d6639SKyle Evans | ( ((u64) (b)[(i) + 4]) << 24 ) \ 83736d6639SKyle Evans | ( ((u64) (b)[(i) + 5]) << 16 ) \ 84736d6639SKyle Evans | ( ((u64) (b)[(i) + 6]) << 8 ) \ 85736d6639SKyle Evans | ( ((u64) (b)[(i) + 7]) ); \ 86736d6639SKyle Evans } while( 0 ) 87736d6639SKyle Evans #endif /* GET_UINT64_BE */ 88736d6639SKyle Evans 89736d6639SKyle Evans #ifndef PUT_UINT64_BE 90736d6639SKyle Evans #define PUT_UINT64_BE(n,b,i) \ 91736d6639SKyle Evans do { \ 92736d6639SKyle Evans (b)[(i) ] = (u8) ( (n) >> 56 ); \ 93736d6639SKyle Evans (b)[(i) + 1] = (u8) ( (n) >> 48 ); \ 94736d6639SKyle Evans (b)[(i) + 2] = (u8) ( (n) >> 40 ); \ 95736d6639SKyle Evans (b)[(i) + 3] = (u8) ( (n) >> 32 ); \ 96736d6639SKyle Evans (b)[(i) + 4] = (u8) ( (n) >> 24 ); \ 97736d6639SKyle Evans (b)[(i) + 5] = (u8) ( (n) >> 16 ); \ 98736d6639SKyle Evans (b)[(i) + 6] = (u8) ( (n) >> 8 ); \ 99736d6639SKyle Evans (b)[(i) + 7] = (u8) ( (n) ); \ 100736d6639SKyle Evans } while( 0 ) 101736d6639SKyle Evans #endif /* PUT_UINT64_BE */ 102736d6639SKyle Evans 103736d6639SKyle Evans /* Useful macros for the SHA-2 core function */ 104736d6639SKyle Evans #define CH(x, y, z) (((x) & (y)) ^ ((~(x)) & (z))) 105736d6639SKyle Evans #define MAJ(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) 106736d6639SKyle Evans 107736d6639SKyle Evans #define UPDATEW(w, i, sha_type) ((w)[(i)] = SIGMA_MIN1_##sha_type((w)[(i)-2]) + (w)[(i)-7] + SIGMA_MIN0_##sha_type((w)[(i)-15]) + (w)[(i)-16]) 108736d6639SKyle Evans 109736d6639SKyle Evans #define SHA2CORE(a, b, c, d, e, f, g, h, w, k, sha_word_type, sha_type) do {\ 110736d6639SKyle Evans sha_word_type t1, t2;\ 111736d6639SKyle Evans t1 = (h) + SIGMA_MAJ1_##sha_type((e)) + CH((e), (f), (g)) + (k) + (w);\ 112736d6639SKyle Evans t2 = SIGMA_MAJ0_##sha_type((a)) + MAJ((a), (b), (c));\ 113736d6639SKyle Evans (h) = (g);\ 114736d6639SKyle Evans (g) = (f);\ 115736d6639SKyle Evans (f) = (e);\ 116736d6639SKyle Evans (e) = (d) + t1;\ 117736d6639SKyle Evans (d) = (c);\ 118736d6639SKyle Evans (c) = (b);\ 119736d6639SKyle Evans (b) = (a);\ 120736d6639SKyle Evans (a) = t1 + t2;\ 121736d6639SKyle Evans } while(0) 122736d6639SKyle Evans 123736d6639SKyle Evans #if (defined(WITH_HASH_SHA224) || defined(WITH_HASH_SHA256)) 124736d6639SKyle Evans 125736d6639SKyle Evans /**********************************************/ 126736d6639SKyle Evans 127736d6639SKyle Evans /* SHA-224 and SHA-256 */ 128736d6639SKyle Evans #define SHR_SHA256(x, n) (((u32)(x)) >> (n)) 129736d6639SKyle Evans #define ROTR_SHA256(x, n) ((((u32)(x)) >> (n)) | (((u32)(x)) << (32-(n)))) 130736d6639SKyle Evans #define SIGMA_MAJ0_SHA256(x) (ROTR_SHA256(x, 2) ^ ROTR_SHA256(x, 13) ^ ROTR_SHA256(x, 22)) 131736d6639SKyle Evans #define SIGMA_MAJ1_SHA256(x) (ROTR_SHA256(x, 6) ^ ROTR_SHA256(x, 11) ^ ROTR_SHA256(x, 25)) 132736d6639SKyle Evans #define SIGMA_MIN0_SHA256(x) (ROTR_SHA256(x, 7) ^ ROTR_SHA256(x, 18) ^ SHR_SHA256(x, 3)) 133736d6639SKyle Evans #define SIGMA_MIN1_SHA256(x) (ROTR_SHA256(x, 17) ^ ROTR_SHA256(x, 19) ^ SHR_SHA256(x, 10)) 134736d6639SKyle Evans #define SHA2CORE_SHA256(a, b, c, d, e, f, g, h, w, k) \ 135736d6639SKyle Evans SHA2CORE(a, b, c, d, e, f, g, h, w, k, u32, SHA256) 136736d6639SKyle Evans #define UPDATEW_SHA256(w, i) UPDATEW(w, i, SHA256) 137736d6639SKyle Evans static const u32 K_SHA256[] = { 138736d6639SKyle Evans 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 139736d6639SKyle Evans 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 140736d6639SKyle Evans 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 141736d6639SKyle Evans 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 142736d6639SKyle Evans 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, 143736d6639SKyle Evans 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 144736d6639SKyle Evans 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 145736d6639SKyle Evans 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, 146736d6639SKyle Evans 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 147736d6639SKyle Evans 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 148736d6639SKyle Evans 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 149736d6639SKyle Evans 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 150736d6639SKyle Evans 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 151736d6639SKyle Evans 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 152736d6639SKyle Evans 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 153736d6639SKyle Evans 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2, 154736d6639SKyle Evans }; 155736d6639SKyle Evans 156736d6639SKyle Evans /**********************************************/ 157736d6639SKyle Evans #endif 158736d6639SKyle Evans 159736d6639SKyle Evans #if (defined(WITH_HASH_SHA384) || defined(WITH_HASH_SHA512)) 160736d6639SKyle Evans 161736d6639SKyle Evans /**********************************************/ 162736d6639SKyle Evans 163736d6639SKyle Evans /* SHA-384 and SHA-512 */ 164736d6639SKyle Evans #define SHR_SHA512(x, n) (((u64)(x)) >> (n)) 165736d6639SKyle Evans #define ROTR_SHA512(x, n) ((((u64)(x)) >> (n)) | (((u64)(x)) << (64-(n)))) 166736d6639SKyle Evans #define SIGMA_MAJ0_SHA512(x) (ROTR_SHA512(x, 28) ^ ROTR_SHA512(x, 34) ^ ROTR_SHA512(x, 39)) 167736d6639SKyle Evans #define SIGMA_MAJ1_SHA512(x) (ROTR_SHA512(x, 14) ^ ROTR_SHA512(x, 18) ^ ROTR_SHA512(x, 41)) 168736d6639SKyle Evans #define SIGMA_MIN0_SHA512(x) (ROTR_SHA512(x, 1) ^ ROTR_SHA512(x, 8) ^ SHR_SHA512(x, 7)) 169736d6639SKyle Evans #define SIGMA_MIN1_SHA512(x) (ROTR_SHA512(x, 19) ^ ROTR_SHA512(x, 61) ^ SHR_SHA512(x, 6)) 170736d6639SKyle Evans #define SHA2CORE_SHA512(a, b, c, d, e, f, g, h, w, k) \ 171736d6639SKyle Evans SHA2CORE(a, b, c, d, e, f, g, h, w, k, u64, SHA512) 172736d6639SKyle Evans #define UPDATEW_SHA512(w, i) UPDATEW(w, i, SHA512) 173736d6639SKyle Evans static const u64 K_SHA512[] = { 174736d6639SKyle Evans (u64)(0x428A2F98D728AE22), (u64)(0x7137449123EF65CD), 175736d6639SKyle Evans (u64)(0xB5C0FBCFEC4D3B2F), (u64)(0xE9B5DBA58189DBBC), 176736d6639SKyle Evans (u64)(0x3956C25BF348B538), (u64)(0x59F111F1B605D019), 177736d6639SKyle Evans (u64)(0x923F82A4AF194F9B), (u64)(0xAB1C5ED5DA6D8118), 178736d6639SKyle Evans (u64)(0xD807AA98A3030242), (u64)(0x12835B0145706FBE), 179736d6639SKyle Evans (u64)(0x243185BE4EE4B28C), (u64)(0x550C7DC3D5FFB4E2), 180736d6639SKyle Evans (u64)(0x72BE5D74F27B896F), (u64)(0x80DEB1FE3B1696B1), 181736d6639SKyle Evans (u64)(0x9BDC06A725C71235), (u64)(0xC19BF174CF692694), 182736d6639SKyle Evans (u64)(0xE49B69C19EF14AD2), (u64)(0xEFBE4786384F25E3), 183736d6639SKyle Evans (u64)(0x0FC19DC68B8CD5B5), (u64)(0x240CA1CC77AC9C65), 184736d6639SKyle Evans (u64)(0x2DE92C6F592B0275), (u64)(0x4A7484AA6EA6E483), 185736d6639SKyle Evans (u64)(0x5CB0A9DCBD41FBD4), (u64)(0x76F988DA831153B5), 186736d6639SKyle Evans (u64)(0x983E5152EE66DFAB), (u64)(0xA831C66D2DB43210), 187736d6639SKyle Evans (u64)(0xB00327C898FB213F), (u64)(0xBF597FC7BEEF0EE4), 188736d6639SKyle Evans (u64)(0xC6E00BF33DA88FC2), (u64)(0xD5A79147930AA725), 189736d6639SKyle Evans (u64)(0x06CA6351E003826F), (u64)(0x142929670A0E6E70), 190736d6639SKyle Evans (u64)(0x27B70A8546D22FFC), (u64)(0x2E1B21385C26C926), 191736d6639SKyle Evans (u64)(0x4D2C6DFC5AC42AED), (u64)(0x53380D139D95B3DF), 192736d6639SKyle Evans (u64)(0x650A73548BAF63DE), (u64)(0x766A0ABB3C77B2A8), 193736d6639SKyle Evans (u64)(0x81C2C92E47EDAEE6), (u64)(0x92722C851482353B), 194736d6639SKyle Evans (u64)(0xA2BFE8A14CF10364), (u64)(0xA81A664BBC423001), 195736d6639SKyle Evans (u64)(0xC24B8B70D0F89791), (u64)(0xC76C51A30654BE30), 196736d6639SKyle Evans (u64)(0xD192E819D6EF5218), (u64)(0xD69906245565A910), 197736d6639SKyle Evans (u64)(0xF40E35855771202A), (u64)(0x106AA07032BBD1B8), 198736d6639SKyle Evans (u64)(0x19A4C116B8D2D0C8), (u64)(0x1E376C085141AB53), 199736d6639SKyle Evans (u64)(0x2748774CDF8EEB99), (u64)(0x34B0BCB5E19B48A8), 200736d6639SKyle Evans (u64)(0x391C0CB3C5C95A63), (u64)(0x4ED8AA4AE3418ACB), 201736d6639SKyle Evans (u64)(0x5B9CCA4F7763E373), (u64)(0x682E6FF3D6B2B8A3), 202736d6639SKyle Evans (u64)(0x748F82EE5DEFB2FC), (u64)(0x78A5636F43172F60), 203736d6639SKyle Evans (u64)(0x84C87814A1F0AB72), (u64)(0x8CC702081A6439EC), 204736d6639SKyle Evans (u64)(0x90BEFFFA23631E28), (u64)(0xA4506CEBDE82BDE9), 205736d6639SKyle Evans (u64)(0xBEF9A3F7B2C67915), (u64)(0xC67178F2E372532B), 206736d6639SKyle Evans (u64)(0xCA273ECEEA26619C), (u64)(0xD186B8C721C0C207), 207736d6639SKyle Evans (u64)(0xEADA7DD6CDE0EB1E), (u64)(0xF57D4F7FEE6ED178), 208736d6639SKyle Evans (u64)(0x06F067AA72176FBA), (u64)(0x0A637DC5A2C898A6), 209736d6639SKyle Evans (u64)(0x113F9804BEF90DAE), (u64)(0x1B710B35131C471B), 210736d6639SKyle Evans (u64)(0x28DB77F523047D84), (u64)(0x32CAAB7B40C72493), 211736d6639SKyle Evans (u64)(0x3C9EBE0A15C9BEBC), (u64)(0x431D67C49C100D4C), 212736d6639SKyle Evans (u64)(0x4CC5D4BECB3E42B6), (u64)(0x597F299CFC657E2A), 213736d6639SKyle Evans (u64)(0x5FCB6FAB3AD6FAEC), (u64)(0x6C44198C4A475817) 214736d6639SKyle Evans }; 215736d6639SKyle Evans 216736d6639SKyle Evans /**********************************************/ 217736d6639SKyle Evans #endif 218736d6639SKyle Evans 219736d6639SKyle Evans #endif /* __SHA2_H__ */ 220