mirror of
https://github.com/Waujito/youtubeUnblock.git
synced 2026-01-03 15:18:46 +03:00
Add crypto files
This commit is contained in:
4
Kbuild
4
Kbuild
@@ -1,3 +1,3 @@
|
|||||||
obj-m := kyoutubeUnblock.o
|
obj-m := kyoutubeUnblock.o
|
||||||
kyoutubeUnblock-objs := kytunblock.o mangle.o quic.o utils.o kargs.o tls.o getopt.o args.o
|
kyoutubeUnblock-objs := src/kytunblock.o src/mangle.o src/quic.o src/utils.o src/kargs.o src/tls.o src/getopt.o src/args.o deps/cyclone/aes.o deps/cyclone/cpu_endian.o deps/cyclone/ecb.o deps/cyclone/gcm.o deps/cyclone/hkdf.o deps/cyclone/hmac.o deps/cyclone/sha256.o
|
||||||
ccflags-y := -std=gnu99 -DKERNEL_SPACE -Wno-error -Wno-declaration-after-statement
|
ccflags-y := -std=gnu99 -DKERNEL_SPACE -Wno-error -Wno-declaration-after-statement -I$(src)/src -I$(src)/deps/cyclone/include
|
||||||
|
|||||||
24
deps/cyclone/Makefile
vendored
Normal file
24
deps/cyclone/Makefile
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
SRCS := $(shell find -name "*.c")
|
||||||
|
OBJS := $(SRCS:%.c=build/%.o)
|
||||||
|
override CFLAGS += -Iinclude -Wno-pedantic
|
||||||
|
LIBNAME := libcyclone.a
|
||||||
|
CC := gcc
|
||||||
|
|
||||||
|
|
||||||
|
run: $(OBJS)
|
||||||
|
@echo "AR $(LIBNAME)"
|
||||||
|
@ar rcs libcyclone.a $(OBJS)
|
||||||
|
|
||||||
|
prep_dirs:
|
||||||
|
mkdir build
|
||||||
|
|
||||||
|
|
||||||
|
build/%.o: %.c prep_dirs
|
||||||
|
$(CC) $(CFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@rm $(OBJS) || true
|
||||||
|
@rm libcyclone.a || true
|
||||||
|
@rm -rf build || true
|
||||||
|
|
||||||
|
|
||||||
577
deps/cyclone/aes.c
vendored
Normal file
577
deps/cyclone/aes.c
vendored
Normal file
@@ -0,0 +1,577 @@
|
|||||||
|
/**
|
||||||
|
* @file aes.c
|
||||||
|
* @brief AES (Advanced Encryption Standard)
|
||||||
|
*
|
||||||
|
* @section License
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010-2024 Oryx Embedded SARL. All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is part of CycloneCRYPTO Open.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* @section Description
|
||||||
|
*
|
||||||
|
* AES is an encryption standard based on Rijndael algorithm, a symmetric block
|
||||||
|
* cipher that can process data blocks of 128 bits, using cipher keys with
|
||||||
|
* lengths of 128, 192, and 256 bits. Refer to FIPS 197 for more details
|
||||||
|
*
|
||||||
|
* @author Oryx Embedded SARL (www.oryx-embedded.com)
|
||||||
|
* @version 2.4.4
|
||||||
|
**/
|
||||||
|
|
||||||
|
//Switch to the appropriate trace level
|
||||||
|
#define TRACE_LEVEL CRYPTO_TRACE_LEVEL
|
||||||
|
|
||||||
|
//Dependencies
|
||||||
|
#include "core/crypto.h"
|
||||||
|
#include "cipher/aes.h"
|
||||||
|
|
||||||
|
//Check crypto library configuration
|
||||||
|
#if (AES_SUPPORT == ENABLED)
|
||||||
|
|
||||||
|
//Substitution table used by encryption algorithm (S-box)
|
||||||
|
static const uint8_t sbox[256] =
|
||||||
|
{
|
||||||
|
0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
|
||||||
|
0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
|
||||||
|
0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
|
||||||
|
0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
|
||||||
|
0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
|
||||||
|
0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
|
||||||
|
0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
|
||||||
|
0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
|
||||||
|
0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
|
||||||
|
0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
|
||||||
|
0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
|
||||||
|
0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
|
||||||
|
0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
|
||||||
|
0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
|
||||||
|
0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
|
||||||
|
0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
|
||||||
|
};
|
||||||
|
|
||||||
|
//Substitution table used by decryption algorithm (inverse S-box)
|
||||||
|
static const uint8_t isbox[256] =
|
||||||
|
{
|
||||||
|
0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
|
||||||
|
0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
|
||||||
|
0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
|
||||||
|
0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
|
||||||
|
0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
|
||||||
|
0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
|
||||||
|
0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
|
||||||
|
0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
|
||||||
|
0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
|
||||||
|
0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
|
||||||
|
0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
|
||||||
|
0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
|
||||||
|
0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
|
||||||
|
0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
|
||||||
|
0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
|
||||||
|
0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
|
||||||
|
};
|
||||||
|
|
||||||
|
//Precalculated table (encryption)
|
||||||
|
static const uint32_t te[256] =
|
||||||
|
{
|
||||||
|
0xA56363C6, 0x847C7CF8, 0x997777EE, 0x8D7B7BF6, 0x0DF2F2FF, 0xBD6B6BD6, 0xB16F6FDE, 0x54C5C591,
|
||||||
|
0x50303060, 0x03010102, 0xA96767CE, 0x7D2B2B56, 0x19FEFEE7, 0x62D7D7B5, 0xE6ABAB4D, 0x9A7676EC,
|
||||||
|
0x45CACA8F, 0x9D82821F, 0x40C9C989, 0x877D7DFA, 0x15FAFAEF, 0xEB5959B2, 0xC947478E, 0x0BF0F0FB,
|
||||||
|
0xECADAD41, 0x67D4D4B3, 0xFDA2A25F, 0xEAAFAF45, 0xBF9C9C23, 0xF7A4A453, 0x967272E4, 0x5BC0C09B,
|
||||||
|
0xC2B7B775, 0x1CFDFDE1, 0xAE93933D, 0x6A26264C, 0x5A36366C, 0x413F3F7E, 0x02F7F7F5, 0x4FCCCC83,
|
||||||
|
0x5C343468, 0xF4A5A551, 0x34E5E5D1, 0x08F1F1F9, 0x937171E2, 0x73D8D8AB, 0x53313162, 0x3F15152A,
|
||||||
|
0x0C040408, 0x52C7C795, 0x65232346, 0x5EC3C39D, 0x28181830, 0xA1969637, 0x0F05050A, 0xB59A9A2F,
|
||||||
|
0x0907070E, 0x36121224, 0x9B80801B, 0x3DE2E2DF, 0x26EBEBCD, 0x6927274E, 0xCDB2B27F, 0x9F7575EA,
|
||||||
|
0x1B090912, 0x9E83831D, 0x742C2C58, 0x2E1A1A34, 0x2D1B1B36, 0xB26E6EDC, 0xEE5A5AB4, 0xFBA0A05B,
|
||||||
|
0xF65252A4, 0x4D3B3B76, 0x61D6D6B7, 0xCEB3B37D, 0x7B292952, 0x3EE3E3DD, 0x712F2F5E, 0x97848413,
|
||||||
|
0xF55353A6, 0x68D1D1B9, 0x00000000, 0x2CEDEDC1, 0x60202040, 0x1FFCFCE3, 0xC8B1B179, 0xED5B5BB6,
|
||||||
|
0xBE6A6AD4, 0x46CBCB8D, 0xD9BEBE67, 0x4B393972, 0xDE4A4A94, 0xD44C4C98, 0xE85858B0, 0x4ACFCF85,
|
||||||
|
0x6BD0D0BB, 0x2AEFEFC5, 0xE5AAAA4F, 0x16FBFBED, 0xC5434386, 0xD74D4D9A, 0x55333366, 0x94858511,
|
||||||
|
0xCF45458A, 0x10F9F9E9, 0x06020204, 0x817F7FFE, 0xF05050A0, 0x443C3C78, 0xBA9F9F25, 0xE3A8A84B,
|
||||||
|
0xF35151A2, 0xFEA3A35D, 0xC0404080, 0x8A8F8F05, 0xAD92923F, 0xBC9D9D21, 0x48383870, 0x04F5F5F1,
|
||||||
|
0xDFBCBC63, 0xC1B6B677, 0x75DADAAF, 0x63212142, 0x30101020, 0x1AFFFFE5, 0x0EF3F3FD, 0x6DD2D2BF,
|
||||||
|
0x4CCDCD81, 0x140C0C18, 0x35131326, 0x2FECECC3, 0xE15F5FBE, 0xA2979735, 0xCC444488, 0x3917172E,
|
||||||
|
0x57C4C493, 0xF2A7A755, 0x827E7EFC, 0x473D3D7A, 0xAC6464C8, 0xE75D5DBA, 0x2B191932, 0x957373E6,
|
||||||
|
0xA06060C0, 0x98818119, 0xD14F4F9E, 0x7FDCDCA3, 0x66222244, 0x7E2A2A54, 0xAB90903B, 0x8388880B,
|
||||||
|
0xCA46468C, 0x29EEEEC7, 0xD3B8B86B, 0x3C141428, 0x79DEDEA7, 0xE25E5EBC, 0x1D0B0B16, 0x76DBDBAD,
|
||||||
|
0x3BE0E0DB, 0x56323264, 0x4E3A3A74, 0x1E0A0A14, 0xDB494992, 0x0A06060C, 0x6C242448, 0xE45C5CB8,
|
||||||
|
0x5DC2C29F, 0x6ED3D3BD, 0xEFACAC43, 0xA66262C4, 0xA8919139, 0xA4959531, 0x37E4E4D3, 0x8B7979F2,
|
||||||
|
0x32E7E7D5, 0x43C8C88B, 0x5937376E, 0xB76D6DDA, 0x8C8D8D01, 0x64D5D5B1, 0xD24E4E9C, 0xE0A9A949,
|
||||||
|
0xB46C6CD8, 0xFA5656AC, 0x07F4F4F3, 0x25EAEACF, 0xAF6565CA, 0x8E7A7AF4, 0xE9AEAE47, 0x18080810,
|
||||||
|
0xD5BABA6F, 0x887878F0, 0x6F25254A, 0x722E2E5C, 0x241C1C38, 0xF1A6A657, 0xC7B4B473, 0x51C6C697,
|
||||||
|
0x23E8E8CB, 0x7CDDDDA1, 0x9C7474E8, 0x211F1F3E, 0xDD4B4B96, 0xDCBDBD61, 0x868B8B0D, 0x858A8A0F,
|
||||||
|
0x907070E0, 0x423E3E7C, 0xC4B5B571, 0xAA6666CC, 0xD8484890, 0x05030306, 0x01F6F6F7, 0x120E0E1C,
|
||||||
|
0xA36161C2, 0x5F35356A, 0xF95757AE, 0xD0B9B969, 0x91868617, 0x58C1C199, 0x271D1D3A, 0xB99E9E27,
|
||||||
|
0x38E1E1D9, 0x13F8F8EB, 0xB398982B, 0x33111122, 0xBB6969D2, 0x70D9D9A9, 0x898E8E07, 0xA7949433,
|
||||||
|
0xB69B9B2D, 0x221E1E3C, 0x92878715, 0x20E9E9C9, 0x49CECE87, 0xFF5555AA, 0x78282850, 0x7ADFDFA5,
|
||||||
|
0x8F8C8C03, 0xF8A1A159, 0x80898909, 0x170D0D1A, 0xDABFBF65, 0x31E6E6D7, 0xC6424284, 0xB86868D0,
|
||||||
|
0xC3414182, 0xB0999929, 0x772D2D5A, 0x110F0F1E, 0xCBB0B07B, 0xFC5454A8, 0xD6BBBB6D, 0x3A16162C
|
||||||
|
};
|
||||||
|
|
||||||
|
//Precalculated table (decryption)
|
||||||
|
static const uint32_t td[256] =
|
||||||
|
{
|
||||||
|
0x50A7F451, 0x5365417E, 0xC3A4171A, 0x965E273A, 0xCB6BAB3B, 0xF1459D1F, 0xAB58FAAC, 0x9303E34B,
|
||||||
|
0x55FA3020, 0xF66D76AD, 0x9176CC88, 0x254C02F5, 0xFCD7E54F, 0xD7CB2AC5, 0x80443526, 0x8FA362B5,
|
||||||
|
0x495AB1DE, 0x671BBA25, 0x980EEA45, 0xE1C0FE5D, 0x02752FC3, 0x12F04C81, 0xA397468D, 0xC6F9D36B,
|
||||||
|
0xE75F8F03, 0x959C9215, 0xEB7A6DBF, 0xDA595295, 0x2D83BED4, 0xD3217458, 0x2969E049, 0x44C8C98E,
|
||||||
|
0x6A89C275, 0x78798EF4, 0x6B3E5899, 0xDD71B927, 0xB64FE1BE, 0x17AD88F0, 0x66AC20C9, 0xB43ACE7D,
|
||||||
|
0x184ADF63, 0x82311AE5, 0x60335197, 0x457F5362, 0xE07764B1, 0x84AE6BBB, 0x1CA081FE, 0x942B08F9,
|
||||||
|
0x58684870, 0x19FD458F, 0x876CDE94, 0xB7F87B52, 0x23D373AB, 0xE2024B72, 0x578F1FE3, 0x2AAB5566,
|
||||||
|
0x0728EBB2, 0x03C2B52F, 0x9A7BC586, 0xA50837D3, 0xF2872830, 0xB2A5BF23, 0xBA6A0302, 0x5C8216ED,
|
||||||
|
0x2B1CCF8A, 0x92B479A7, 0xF0F207F3, 0xA1E2694E, 0xCDF4DA65, 0xD5BE0506, 0x1F6234D1, 0x8AFEA6C4,
|
||||||
|
0x9D532E34, 0xA055F3A2, 0x32E18A05, 0x75EBF6A4, 0x39EC830B, 0xAAEF6040, 0x069F715E, 0x51106EBD,
|
||||||
|
0xF98A213E, 0x3D06DD96, 0xAE053EDD, 0x46BDE64D, 0xB58D5491, 0x055DC471, 0x6FD40604, 0xFF155060,
|
||||||
|
0x24FB9819, 0x97E9BDD6, 0xCC434089, 0x779ED967, 0xBD42E8B0, 0x888B8907, 0x385B19E7, 0xDBEEC879,
|
||||||
|
0x470A7CA1, 0xE90F427C, 0xC91E84F8, 0x00000000, 0x83868009, 0x48ED2B32, 0xAC70111E, 0x4E725A6C,
|
||||||
|
0xFBFF0EFD, 0x5638850F, 0x1ED5AE3D, 0x27392D36, 0x64D90F0A, 0x21A65C68, 0xD1545B9B, 0x3A2E3624,
|
||||||
|
0xB1670A0C, 0x0FE75793, 0xD296EEB4, 0x9E919B1B, 0x4FC5C080, 0xA220DC61, 0x694B775A, 0x161A121C,
|
||||||
|
0x0ABA93E2, 0xE52AA0C0, 0x43E0223C, 0x1D171B12, 0x0B0D090E, 0xADC78BF2, 0xB9A8B62D, 0xC8A91E14,
|
||||||
|
0x8519F157, 0x4C0775AF, 0xBBDD99EE, 0xFD607FA3, 0x9F2601F7, 0xBCF5725C, 0xC53B6644, 0x347EFB5B,
|
||||||
|
0x7629438B, 0xDCC623CB, 0x68FCEDB6, 0x63F1E4B8, 0xCADC31D7, 0x10856342, 0x40229713, 0x2011C684,
|
||||||
|
0x7D244A85, 0xF83DBBD2, 0x1132F9AE, 0x6DA129C7, 0x4B2F9E1D, 0xF330B2DC, 0xEC52860D, 0xD0E3C177,
|
||||||
|
0x6C16B32B, 0x99B970A9, 0xFA489411, 0x2264E947, 0xC48CFCA8, 0x1A3FF0A0, 0xD82C7D56, 0xEF903322,
|
||||||
|
0xC74E4987, 0xC1D138D9, 0xFEA2CA8C, 0x360BD498, 0xCF81F5A6, 0x28DE7AA5, 0x268EB7DA, 0xA4BFAD3F,
|
||||||
|
0xE49D3A2C, 0x0D927850, 0x9BCC5F6A, 0x62467E54, 0xC2138DF6, 0xE8B8D890, 0x5EF7392E, 0xF5AFC382,
|
||||||
|
0xBE805D9F, 0x7C93D069, 0xA92DD56F, 0xB31225CF, 0x3B99ACC8, 0xA77D1810, 0x6E639CE8, 0x7BBB3BDB,
|
||||||
|
0x097826CD, 0xF418596E, 0x01B79AEC, 0xA89A4F83, 0x656E95E6, 0x7EE6FFAA, 0x08CFBC21, 0xE6E815EF,
|
||||||
|
0xD99BE7BA, 0xCE366F4A, 0xD4099FEA, 0xD67CB029, 0xAFB2A431, 0x31233F2A, 0x3094A5C6, 0xC066A235,
|
||||||
|
0x37BC4E74, 0xA6CA82FC, 0xB0D090E0, 0x15D8A733, 0x4A9804F1, 0xF7DAEC41, 0x0E50CD7F, 0x2FF69117,
|
||||||
|
0x8DD64D76, 0x4DB0EF43, 0x544DAACC, 0xDF0496E4, 0xE3B5D19E, 0x1B886A4C, 0xB81F2CC1, 0x7F516546,
|
||||||
|
0x04EA5E9D, 0x5D358C01, 0x737487FA, 0x2E410BFB, 0x5A1D67B3, 0x52D2DB92, 0x335610E9, 0x1347D66D,
|
||||||
|
0x8C61D79A, 0x7A0CA137, 0x8E14F859, 0x893C13EB, 0xEE27A9CE, 0x35C961B7, 0xEDE51CE1, 0x3CB1477A,
|
||||||
|
0x59DFD29C, 0x3F73F255, 0x79CE1418, 0xBF37C773, 0xEACDF753, 0x5BAAFD5F, 0x146F3DDF, 0x86DB4478,
|
||||||
|
0x81F3AFCA, 0x3EC468B9, 0x2C342438, 0x5F40A3C2, 0x72C31D16, 0x0C25E2BC, 0x8B493C28, 0x41950DFF,
|
||||||
|
0x7101A839, 0xDEB30C08, 0x9CE4B4D8, 0x90C15664, 0x6184CB7B, 0x70B632D5, 0x745C6C48, 0x4257B8D0
|
||||||
|
};
|
||||||
|
|
||||||
|
//Round constant word array
|
||||||
|
static const uint32_t rcon[11] =
|
||||||
|
{
|
||||||
|
0x00000000,
|
||||||
|
0x00000001,
|
||||||
|
0x00000002,
|
||||||
|
0x00000004,
|
||||||
|
0x00000008,
|
||||||
|
0x00000010,
|
||||||
|
0x00000020,
|
||||||
|
0x00000040,
|
||||||
|
0x00000080,
|
||||||
|
0x0000001B,
|
||||||
|
0x00000036
|
||||||
|
};
|
||||||
|
|
||||||
|
//AES128-ECB OID (2.16.840.1.101.3.4.1.1)
|
||||||
|
const uint8_t AES128_ECB_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x01};
|
||||||
|
//AES128-CBC OID (2.16.840.1.101.3.4.1.2)
|
||||||
|
const uint8_t AES128_CBC_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x02};
|
||||||
|
//AES128-OFB OID (2.16.840.1.101.3.4.1.3)
|
||||||
|
const uint8_t AES128_OFB_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x03};
|
||||||
|
//AES128-CFB OID (2.16.840.1.101.3.4.1.4)
|
||||||
|
const uint8_t AES128_CFB_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x04};
|
||||||
|
//AES128-GCM OID (2.16.840.1.101.3.4.1.6)
|
||||||
|
const uint8_t AES128_GCM_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x06};
|
||||||
|
//AES128-CCM OID (2.16.840.1.101.3.4.1.7)
|
||||||
|
const uint8_t AES128_CCM_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x07};
|
||||||
|
|
||||||
|
//AES192-ECB OID (2.16.840.1.101.3.4.1.21)
|
||||||
|
const uint8_t AES192_ECB_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x15};
|
||||||
|
//AES192-CBC OID (2.16.840.1.101.3.4.1.22)
|
||||||
|
const uint8_t AES192_CBC_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x16};
|
||||||
|
//AES192-OFB OID (2.16.840.1.101.3.4.1.23)
|
||||||
|
const uint8_t AES192_OFB_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x17};
|
||||||
|
//AES192-CFB OID (2.16.840.1.101.3.4.1.24)
|
||||||
|
const uint8_t AES192_CFB_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x18};
|
||||||
|
//AES192-GCM OID (2.16.840.1.101.3.4.1.26)
|
||||||
|
const uint8_t AES192_GCM_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x1A};
|
||||||
|
//AES192-CCM OID (2.16.840.1.101.3.4.1.27)
|
||||||
|
const uint8_t AES192_CCM_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x1B};
|
||||||
|
|
||||||
|
//AES256-ECB OID (2.16.840.1.101.3.4.1.41)
|
||||||
|
const uint8_t AES256_ECB_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x29};
|
||||||
|
//AES256-CBC OID (2.16.840.1.101.3.4.1.42)
|
||||||
|
const uint8_t AES256_CBC_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x2A};
|
||||||
|
//AES256-OFB OID (2.16.840.1.101.3.4.1.43)
|
||||||
|
const uint8_t AES256_OFB_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x2B};
|
||||||
|
//AES256-CFB OID (2.16.840.1.101.3.4.1.44)
|
||||||
|
const uint8_t AES256_CFB_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x2C};
|
||||||
|
//AES256-GCM OID (2.16.840.1.101.3.4.1.46)
|
||||||
|
const uint8_t AES256_GCM_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x2E};
|
||||||
|
//AES256-CCM OID (2.16.840.1.101.3.4.1.47)
|
||||||
|
const uint8_t AES256_CCM_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x2F};
|
||||||
|
|
||||||
|
//Common interface for encryption algorithms
|
||||||
|
const CipherAlgo aesCipherAlgo =
|
||||||
|
{
|
||||||
|
"AES",
|
||||||
|
sizeof(AesContext),
|
||||||
|
CIPHER_ALGO_TYPE_BLOCK,
|
||||||
|
AES_BLOCK_SIZE,
|
||||||
|
(CipherAlgoInit) aesInit,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
(CipherAlgoEncryptBlock) aesEncryptBlock,
|
||||||
|
(CipherAlgoDecryptBlock) aesDecryptBlock,
|
||||||
|
(CipherAlgoDeinit) aesDeinit
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Key expansion
|
||||||
|
* @param[in] context Pointer to the AES context to initialize
|
||||||
|
* @param[in] key Pointer to the key
|
||||||
|
* @param[in] keyLen Length of the key
|
||||||
|
* @return Error code
|
||||||
|
**/
|
||||||
|
|
||||||
|
__weak_func error_t aesInit(AesContext *context, const uint8_t *key,
|
||||||
|
size_t keyLen)
|
||||||
|
{
|
||||||
|
uint_t i;
|
||||||
|
uint32_t temp;
|
||||||
|
size_t keyScheduleSize;
|
||||||
|
|
||||||
|
//Check parameters
|
||||||
|
if(context == NULL || key == NULL)
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
//Check the length of the key
|
||||||
|
if(keyLen == 16)
|
||||||
|
{
|
||||||
|
//10 rounds are required for 128-bit key
|
||||||
|
context->nr = 10;
|
||||||
|
}
|
||||||
|
else if(keyLen == 24)
|
||||||
|
{
|
||||||
|
//12 rounds are required for 192-bit key
|
||||||
|
context->nr = 12;
|
||||||
|
}
|
||||||
|
else if(keyLen == 32)
|
||||||
|
{
|
||||||
|
//14 rounds are required for 256-bit key
|
||||||
|
context->nr = 14;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Report an error
|
||||||
|
return ERROR_INVALID_KEY_LENGTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Determine the number of 32-bit words in the key
|
||||||
|
keyLen /= 4;
|
||||||
|
|
||||||
|
//Copy the original key
|
||||||
|
for(i = 0; i < keyLen; i++)
|
||||||
|
{
|
||||||
|
context->ek[i] = LOAD32LE(key + (i * 4));
|
||||||
|
}
|
||||||
|
|
||||||
|
//The size of the key schedule depends on the number of rounds
|
||||||
|
keyScheduleSize = 4 * (context->nr + 1);
|
||||||
|
|
||||||
|
//Generate the key schedule (encryption)
|
||||||
|
for(i = keyLen; i < keyScheduleSize; i++)
|
||||||
|
{
|
||||||
|
//Save previous word
|
||||||
|
temp = context->ek[i - 1];
|
||||||
|
|
||||||
|
//Apply transformation
|
||||||
|
if((i % keyLen) == 0)
|
||||||
|
{
|
||||||
|
context->ek[i] = sbox[(temp >> 8) & 0xFF];
|
||||||
|
context->ek[i] |= (sbox[(temp >> 16) & 0xFF] << 8);
|
||||||
|
context->ek[i] |= (sbox[(temp >> 24) & 0xFF] << 16);
|
||||||
|
context->ek[i] |= (sbox[temp & 0xFF] << 24);
|
||||||
|
context->ek[i] ^= rcon[i / keyLen];
|
||||||
|
}
|
||||||
|
else if(keyLen > 6 && (i % keyLen) == 4)
|
||||||
|
{
|
||||||
|
context->ek[i] = sbox[temp & 0xFF];
|
||||||
|
context->ek[i] |= (sbox[(temp >> 8) & 0xFF] << 8);
|
||||||
|
context->ek[i] |= (sbox[(temp >> 16) & 0xFF] << 16);
|
||||||
|
context->ek[i] |= (sbox[(temp >> 24) & 0xFF] << 24);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
context->ek[i] = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Update the key schedule
|
||||||
|
context->ek[i] ^= context->ek[i - keyLen];
|
||||||
|
}
|
||||||
|
|
||||||
|
//Generate the key schedule (decryption)
|
||||||
|
for(i = 0; i < keyScheduleSize; i++)
|
||||||
|
{
|
||||||
|
//Apply the InvMixColumns transformation to all round keys but the first
|
||||||
|
//and the last
|
||||||
|
if(i < 4 || i >= (keyScheduleSize - 4))
|
||||||
|
{
|
||||||
|
context->dk[i] = context->ek[i];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
context->dk[i] = td[sbox[context->ek[i] & 0xFF]];
|
||||||
|
temp = td[sbox[(context->ek[i] >> 8) & 0xFF]];
|
||||||
|
context->dk[i] ^= ROL32(temp, 8);
|
||||||
|
temp = td[sbox[(context->ek[i] >> 16) & 0xFF]];
|
||||||
|
context->dk[i] ^= ROL32(temp, 16);
|
||||||
|
temp = td[sbox[(context->ek[i] >> 24) & 0xFF]];
|
||||||
|
context->dk[i] ^= ROL32(temp, 24);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//No error to report
|
||||||
|
return NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Encrypt a 16-byte block using AES algorithm
|
||||||
|
* @param[in] context Pointer to the AES context
|
||||||
|
* @param[in] input Plaintext block to encrypt
|
||||||
|
* @param[out] output Ciphertext block resulting from encryption
|
||||||
|
**/
|
||||||
|
|
||||||
|
__weak_func void aesEncryptBlock(AesContext *context, const uint8_t *input,
|
||||||
|
uint8_t *output)
|
||||||
|
{
|
||||||
|
uint_t i;
|
||||||
|
uint32_t s0;
|
||||||
|
uint32_t s1;
|
||||||
|
uint32_t s2;
|
||||||
|
uint32_t s3;
|
||||||
|
uint32_t t0;
|
||||||
|
uint32_t t1;
|
||||||
|
uint32_t t2;
|
||||||
|
uint32_t t3;
|
||||||
|
uint32_t temp;
|
||||||
|
|
||||||
|
//Copy the plaintext to the state array
|
||||||
|
s0 = LOAD32LE(input + 0);
|
||||||
|
s1 = LOAD32LE(input + 4);
|
||||||
|
s2 = LOAD32LE(input + 8);
|
||||||
|
s3 = LOAD32LE(input + 12);
|
||||||
|
|
||||||
|
//Initial round key addition
|
||||||
|
s0 ^= context->ek[0];
|
||||||
|
s1 ^= context->ek[1];
|
||||||
|
s2 ^= context->ek[2];
|
||||||
|
s3 ^= context->ek[3];
|
||||||
|
|
||||||
|
//The number of rounds depends on the key length
|
||||||
|
for(i = 1; i < context->nr; i++)
|
||||||
|
{
|
||||||
|
//Apply round function
|
||||||
|
t0 = te[s0 & 0xFF];
|
||||||
|
temp = te[(s1 >> 8) & 0xFF];
|
||||||
|
t0 ^= ROL32(temp, 8);
|
||||||
|
temp = te[(s2 >> 16) & 0xFF];
|
||||||
|
t0 ^= ROL32(temp, 16);
|
||||||
|
temp = te[(s3 >> 24) & 0xFF];
|
||||||
|
t0 ^= ROL32(temp, 24);
|
||||||
|
|
||||||
|
t1 = te[s1 & 0xFF];
|
||||||
|
temp = te[(s2 >> 8) & 0xFF];
|
||||||
|
t1 ^= ROL32(temp, 8);
|
||||||
|
temp = te[(s3 >> 16) & 0xFF];
|
||||||
|
t1 ^= ROL32(temp, 16);
|
||||||
|
temp = te[(s0 >> 24) & 0xFF];
|
||||||
|
t1 ^= ROL32(temp, 24);
|
||||||
|
|
||||||
|
t2 = te[s2 & 0xFF];
|
||||||
|
temp = te[(s3 >> 8) & 0xFF];
|
||||||
|
t2 ^= ROL32(temp, 8);
|
||||||
|
temp = te[(s0 >> 16) & 0xFF];
|
||||||
|
t2 ^= ROL32(temp, 16);
|
||||||
|
temp = te[(s1 >> 24) & 0xFF];
|
||||||
|
t2 ^= ROL32(temp, 24);
|
||||||
|
|
||||||
|
t3 = te[s3 & 0xFF];
|
||||||
|
temp = te[(s0 >> 8) & 0xFF];
|
||||||
|
t3 ^= ROL32(temp, 8);
|
||||||
|
temp = te[(s1 >> 16) & 0xFF];
|
||||||
|
t3 ^= ROL32(temp, 16);
|
||||||
|
temp = te[(s2 >> 24) & 0xFF];
|
||||||
|
t3 ^= ROL32(temp, 24);
|
||||||
|
|
||||||
|
//Round key addition
|
||||||
|
s0 = t0 ^ context->ek[i * 4];
|
||||||
|
s1 = t1 ^ context->ek[i * 4 + 1];
|
||||||
|
s2 = t2 ^ context->ek[i * 4 + 2];
|
||||||
|
s3 = t3 ^ context->ek[i * 4 + 3];
|
||||||
|
}
|
||||||
|
|
||||||
|
//The last round differs slightly from the first rounds
|
||||||
|
t0 = sbox[s0 & 0xFF];
|
||||||
|
t0 |= sbox[(s1 >> 8) & 0xFF] << 8;
|
||||||
|
t0 |= sbox[(s2 >> 16) & 0xFF] << 16;
|
||||||
|
t0 |= sbox[(s3 >> 24) & 0xFF] << 24;
|
||||||
|
|
||||||
|
t1 = sbox[s1 & 0xFF];
|
||||||
|
t1 |= sbox[(s2 >> 8) & 0xFF] << 8;
|
||||||
|
t1 |= sbox[(s3 >> 16) & 0xFF] << 16;
|
||||||
|
t1 |= sbox[(s0 >> 24) & 0xFF] << 24;
|
||||||
|
|
||||||
|
t2 = sbox[s2 & 0xFF];
|
||||||
|
t2 |= sbox[(s3 >> 8) & 0xFF] << 8;
|
||||||
|
t2 |= sbox[(s0 >> 16) & 0xFF] << 16;
|
||||||
|
t2 |= sbox[(s1 >> 24) & 0xFF] << 24;
|
||||||
|
|
||||||
|
t3 = sbox[s3 & 0xFF];
|
||||||
|
t3 |= sbox[(s0 >> 8) & 0xFF] << 8;
|
||||||
|
t3 |= sbox[(s1 >> 16) & 0xFF] << 16;
|
||||||
|
t3 |= sbox[(s2 >> 24) & 0xFF] << 24;
|
||||||
|
|
||||||
|
//Last round key addition
|
||||||
|
s0 = t0 ^ context->ek[context->nr * 4];
|
||||||
|
s1 = t1 ^ context->ek[context->nr * 4 + 1];
|
||||||
|
s2 = t2 ^ context->ek[context->nr * 4 + 2];
|
||||||
|
s3 = t3 ^ context->ek[context->nr * 4 + 3];
|
||||||
|
|
||||||
|
//The final state is then copied to the output
|
||||||
|
STORE32LE(s0, output + 0);
|
||||||
|
STORE32LE(s1, output + 4);
|
||||||
|
STORE32LE(s2, output + 8);
|
||||||
|
STORE32LE(s3, output + 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Decrypt a 16-byte block using AES algorithm
|
||||||
|
* @param[in] context Pointer to the AES context
|
||||||
|
* @param[in] input Ciphertext block to decrypt
|
||||||
|
* @param[out] output Plaintext block resulting from decryption
|
||||||
|
**/
|
||||||
|
|
||||||
|
__weak_func void aesDecryptBlock(AesContext *context, const uint8_t *input,
|
||||||
|
uint8_t *output)
|
||||||
|
{
|
||||||
|
uint_t i;
|
||||||
|
uint32_t s0;
|
||||||
|
uint32_t s1;
|
||||||
|
uint32_t s2;
|
||||||
|
uint32_t s3;
|
||||||
|
uint32_t t0;
|
||||||
|
uint32_t t1;
|
||||||
|
uint32_t t2;
|
||||||
|
uint32_t t3;
|
||||||
|
uint32_t temp;
|
||||||
|
|
||||||
|
//Copy the ciphertext to the state array
|
||||||
|
s0 = LOAD32LE(input + 0);
|
||||||
|
s1 = LOAD32LE(input + 4);
|
||||||
|
s2 = LOAD32LE(input + 8);
|
||||||
|
s3 = LOAD32LE(input + 12);
|
||||||
|
|
||||||
|
//Initial round key addition
|
||||||
|
s0 ^= context->dk[context->nr * 4];
|
||||||
|
s1 ^= context->dk[context->nr * 4 + 1];
|
||||||
|
s2 ^= context->dk[context->nr * 4 + 2];
|
||||||
|
s3 ^= context->dk[context->nr * 4 + 3];
|
||||||
|
|
||||||
|
//The number of rounds depends on the key length
|
||||||
|
for(i = context->nr - 1; i >= 1; i--)
|
||||||
|
{
|
||||||
|
//Apply round function
|
||||||
|
t0 = td[s0 & 0xFF];
|
||||||
|
temp = td[(s3 >> 8) & 0xFF];
|
||||||
|
t0 ^= ROL32(temp, 8);
|
||||||
|
temp = td[(s2 >> 16) & 0xFF];
|
||||||
|
t0 ^= ROL32(temp, 16);
|
||||||
|
temp = td[(s1 >> 24) & 0xFF];
|
||||||
|
t0 ^= ROL32(temp, 24);
|
||||||
|
|
||||||
|
t1 = td[s1 & 0xFF];
|
||||||
|
temp = td[(s0 >> 8) & 0xFF];
|
||||||
|
t1 ^= ROL32(temp, 8);
|
||||||
|
temp = td[(s3 >> 16) & 0xFF];
|
||||||
|
t1 ^= ROL32(temp, 16);
|
||||||
|
temp = td[(s2 >> 24) & 0xFF];
|
||||||
|
t1 ^= ROL32(temp, 24);
|
||||||
|
|
||||||
|
t2 = td[s2 & 0xFF];
|
||||||
|
temp = td[(s1 >> 8) & 0xFF];
|
||||||
|
t2 ^= ROL32(temp, 8);
|
||||||
|
temp = td[(s0 >> 16) & 0xFF];
|
||||||
|
t2 ^= ROL32(temp, 16);
|
||||||
|
temp = td[(s3 >> 24) & 0xFF];
|
||||||
|
t2 ^= ROL32(temp, 24);
|
||||||
|
|
||||||
|
t3 = td[s3 & 0xFF];
|
||||||
|
temp = td[(s2 >> 8) & 0xFF];
|
||||||
|
t3 ^= ROL32(temp, 8);
|
||||||
|
temp = td[(s1 >> 16) & 0xFF];
|
||||||
|
t3 ^= ROL32(temp, 16);
|
||||||
|
temp = td[(s0 >> 24) & 0xFF];
|
||||||
|
t3 ^= ROL32(temp, 24);
|
||||||
|
|
||||||
|
//Round key addition
|
||||||
|
s0 = t0 ^ context->dk[i * 4];
|
||||||
|
s1 = t1 ^ context->dk[i * 4 + 1];
|
||||||
|
s2 = t2 ^ context->dk[i * 4 + 2];
|
||||||
|
s3 = t3 ^ context->dk[i * 4 + 3];
|
||||||
|
}
|
||||||
|
|
||||||
|
//The last round differs slightly from the first rounds
|
||||||
|
t0 = isbox[s0 & 0xFF];
|
||||||
|
t0 |= isbox[(s3 >> 8) & 0xFF] << 8;
|
||||||
|
t0 |= isbox[(s2 >> 16) & 0xFF] << 16;
|
||||||
|
t0 |= isbox[(s1 >> 24) & 0xFF] << 24;
|
||||||
|
|
||||||
|
t1 = isbox[s1 & 0xFF];
|
||||||
|
t1 |= isbox[(s0 >> 8) & 0xFF] << 8;
|
||||||
|
t1 |= isbox[(s3 >> 16) & 0xFF] << 16;
|
||||||
|
t1 |= isbox[(s2 >> 24) & 0xFF] << 24;
|
||||||
|
|
||||||
|
t2 = isbox[s2 & 0xFF];
|
||||||
|
t2 |= isbox[(s1 >> 8) & 0xFF] << 8;
|
||||||
|
t2 |= isbox[(s0 >> 16) & 0xFF] << 16;
|
||||||
|
t2 |= isbox[(s3 >> 24) & 0xFF] << 24;
|
||||||
|
|
||||||
|
t3 = isbox[s3 & 0xFF];
|
||||||
|
t3 |= isbox[(s2 >> 8) & 0xFF] << 8;
|
||||||
|
t3 |= isbox[(s1 >> 16) & 0xFF] << 16;
|
||||||
|
t3 |= isbox[(s0 >> 24) & 0xFF] << 24;
|
||||||
|
|
||||||
|
//Last round key addition
|
||||||
|
s0 = t0 ^ context->dk[0];
|
||||||
|
s1 = t1 ^ context->dk[1];
|
||||||
|
s2 = t2 ^ context->dk[2];
|
||||||
|
s3 = t3 ^ context->dk[3];
|
||||||
|
|
||||||
|
//The final state is then copied to the output
|
||||||
|
STORE32LE(s0, output + 0);
|
||||||
|
STORE32LE(s1, output + 4);
|
||||||
|
STORE32LE(s2, output + 8);
|
||||||
|
STORE32LE(s3, output + 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Release AES context
|
||||||
|
* @param[in] context Pointer to the AES context
|
||||||
|
**/
|
||||||
|
|
||||||
|
__weak_func void aesDeinit(AesContext *context)
|
||||||
|
{
|
||||||
|
//Clear AES context
|
||||||
|
osMemset(context, 0, sizeof(AesContext));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
151
deps/cyclone/cpu_endian.c
vendored
Normal file
151
deps/cyclone/cpu_endian.c
vendored
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
/**
|
||||||
|
* @file cpu_endian.c
|
||||||
|
* @brief Byte order conversion
|
||||||
|
*
|
||||||
|
* @section License
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010-2024 Oryx Embedded SARL. All rights reserved.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* @author Oryx Embedded SARL (www.oryx-embedded.com)
|
||||||
|
* @version 2.4.4
|
||||||
|
**/
|
||||||
|
|
||||||
|
//Dependencies
|
||||||
|
#include "cpu_endian.h"
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reverse the byte order of a 16-bit word
|
||||||
|
* @param[in] value 16-bit value
|
||||||
|
* @return 16-bit value with byte order swapped
|
||||||
|
**/
|
||||||
|
|
||||||
|
uint16_t swapInt16(uint16_t value)
|
||||||
|
{
|
||||||
|
return SWAPINT16(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reverse the byte order of a 32-bit word
|
||||||
|
* @param[in] value 32-bit value
|
||||||
|
* @return 32-bit value with byte order swapped
|
||||||
|
**/
|
||||||
|
|
||||||
|
uint32_t swapInt32(uint32_t value)
|
||||||
|
{
|
||||||
|
return SWAPINT32(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reverse the byte order of a 64-bit word
|
||||||
|
* @param[in] value 64-bit value
|
||||||
|
* @return 64-bit value with byte order swapped
|
||||||
|
**/
|
||||||
|
|
||||||
|
uint64_t swapInt64(uint64_t value)
|
||||||
|
{
|
||||||
|
return SWAPINT64(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reverse bit order in a 4-bit word
|
||||||
|
* @param[in] value 4-bit value
|
||||||
|
* @return 4-bit value with bit order reversed
|
||||||
|
**/
|
||||||
|
|
||||||
|
uint8_t reverseInt4(uint8_t value)
|
||||||
|
{
|
||||||
|
value = ((value & 0x0C) >> 2) | ((value & 0x03) << 2);
|
||||||
|
value = ((value & 0x0A) >> 1) | ((value & 0x05) << 1);
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reverse bit order in a byte
|
||||||
|
* @param[in] value 8-bit value
|
||||||
|
* @return 8-bit value with bit order reversed
|
||||||
|
**/
|
||||||
|
|
||||||
|
uint8_t reverseInt8(uint8_t value)
|
||||||
|
{
|
||||||
|
value = ((value & 0xF0) >> 4) | ((value & 0x0F) << 4);
|
||||||
|
value = ((value & 0xCC) >> 2) | ((value & 0x33) << 2);
|
||||||
|
value = ((value & 0xAA) >> 1) | ((value & 0x55) << 1);
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reverse bit order in a 16-bit word
|
||||||
|
* @param[in] value 16-bit value
|
||||||
|
* @return 16-bit value with bit order reversed
|
||||||
|
**/
|
||||||
|
|
||||||
|
uint16_t reverseInt16(uint16_t value)
|
||||||
|
{
|
||||||
|
value = ((value & 0xFF00) >> 8) | ((value & 0x00FF) << 8);
|
||||||
|
value = ((value & 0xF0F0) >> 4) | ((value & 0x0F0F) << 4);
|
||||||
|
value = ((value & 0xCCCC) >> 2) | ((value & 0x3333) << 2);
|
||||||
|
value = ((value & 0xAAAA) >> 1) | ((value & 0x5555) << 1);
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reverse bit order in a 32-bit word
|
||||||
|
* @param[in] value 32-bit value
|
||||||
|
* @return 32-bit value with bit order reversed
|
||||||
|
**/
|
||||||
|
|
||||||
|
uint32_t reverseInt32(uint32_t value)
|
||||||
|
{
|
||||||
|
value = ((value & 0xFFFF0000UL) >> 16) | ((value & 0x0000FFFFUL) << 16);
|
||||||
|
value = ((value & 0xFF00FF00UL) >> 8) | ((value & 0x00FF00FFUL) << 8);
|
||||||
|
value = ((value & 0xF0F0F0F0UL) >> 4) | ((value & 0x0F0F0F0FUL) << 4);
|
||||||
|
value = ((value & 0xCCCCCCCCUL) >> 2) | ((value & 0x33333333UL) << 2);
|
||||||
|
value = ((value & 0xAAAAAAAAUL) >> 1) | ((value & 0x55555555UL) << 1);
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reverse bit order in a 64-bit word
|
||||||
|
* @param[in] value 64-bit value
|
||||||
|
* @return 64-bit value with bit order reversed
|
||||||
|
**/
|
||||||
|
|
||||||
|
uint64_t reverseInt64(uint64_t value)
|
||||||
|
{
|
||||||
|
value = ((value & 0xFFFFFFFF00000000ULL) >> 32) | ((value & 0x00000000FFFFFFFFULL) << 32);
|
||||||
|
value = ((value & 0xFFFF0000FFFF0000ULL) >> 16) | ((value & 0x0000FFFF0000FFFFULL) << 16);
|
||||||
|
value = ((value & 0xFF00FF00FF00FF00ULL) >> 8) | ((value & 0x00FF00FF00FF00FFULL) << 8);
|
||||||
|
value = ((value & 0xF0F0F0F0F0F0F0F0ULL) >> 4) | ((value & 0x0F0F0F0F0F0F0F0FULL) << 4);
|
||||||
|
value = ((value & 0xCCCCCCCCCCCCCCCCULL) >> 2) | ((value & 0x3333333333333333ULL) << 2);
|
||||||
|
value = ((value & 0xAAAAAAAAAAAAAAAAULL) >> 1) | ((value & 0x5555555555555555ULL) << 1);
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
116
deps/cyclone/ecb.c
vendored
Normal file
116
deps/cyclone/ecb.c
vendored
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
/**
|
||||||
|
* @file ecb.c
|
||||||
|
* @brief Electronic Codebook (ECB) mode
|
||||||
|
*
|
||||||
|
* @section License
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010-2024 Oryx Embedded SARL. All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is part of CycloneCRYPTO Open.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* @section Description
|
||||||
|
*
|
||||||
|
* The Electronic Codebook (ECB) mode is a confidentiality mode that features,
|
||||||
|
* for a given key, the assignment of a fixed ciphertext block to each
|
||||||
|
* plaintext block, analogous to the assignment of code words in a codebook.
|
||||||
|
* Refer to SP 800-38A for more details
|
||||||
|
*
|
||||||
|
* @author Oryx Embedded SARL (www.oryx-embedded.com)
|
||||||
|
* @version 2.4.4
|
||||||
|
**/
|
||||||
|
|
||||||
|
//Switch to the appropriate trace level
|
||||||
|
#define TRACE_LEVEL CRYPTO_TRACE_LEVEL
|
||||||
|
|
||||||
|
//Dependencies
|
||||||
|
#include "core/crypto.h"
|
||||||
|
#include "cipher_modes/ecb.h"
|
||||||
|
|
||||||
|
//Check crypto library configuration
|
||||||
|
#if (ECB_SUPPORT == ENABLED)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief ECB encryption
|
||||||
|
* @param[in] cipher Cipher algorithm
|
||||||
|
* @param[in] context Cipher algorithm context
|
||||||
|
* @param[in] p Plaintext to be encrypted
|
||||||
|
* @param[out] c Ciphertext resulting from the encryption
|
||||||
|
* @param[in] length Total number of data bytes to be encrypted
|
||||||
|
* @return Error code
|
||||||
|
**/
|
||||||
|
|
||||||
|
__weak_func error_t ecbEncrypt(const CipherAlgo *cipher, void *context,
|
||||||
|
const uint8_t *p, uint8_t *c, size_t length)
|
||||||
|
{
|
||||||
|
//ECB mode operates in a block-by-block fashion
|
||||||
|
while(length >= cipher->blockSize)
|
||||||
|
{
|
||||||
|
//Encrypt current block
|
||||||
|
cipher->encryptBlock(context, p, c);
|
||||||
|
|
||||||
|
//Next block
|
||||||
|
p += cipher->blockSize;
|
||||||
|
c += cipher->blockSize;
|
||||||
|
length -= cipher->blockSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
//The plaintext must be a multiple of the block size
|
||||||
|
if(length != 0)
|
||||||
|
return ERROR_INVALID_LENGTH;
|
||||||
|
|
||||||
|
//Successful encryption
|
||||||
|
return NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief ECB decryption
|
||||||
|
* @param[in] cipher Cipher algorithm
|
||||||
|
* @param[in] context Cipher algorithm context
|
||||||
|
* @param[in] c Ciphertext to be decrypted
|
||||||
|
* @param[out] p Plaintext resulting from the decryption
|
||||||
|
* @param[in] length Total number of data bytes to be decrypted
|
||||||
|
* @return Error code
|
||||||
|
**/
|
||||||
|
|
||||||
|
__weak_func error_t ecbDecrypt(const CipherAlgo *cipher, void *context,
|
||||||
|
const uint8_t *c, uint8_t *p, size_t length)
|
||||||
|
{
|
||||||
|
//ECB mode operates in a block-by-block fashion
|
||||||
|
while(length >= cipher->blockSize)
|
||||||
|
{
|
||||||
|
//Decrypt current block
|
||||||
|
cipher->decryptBlock(context, c, p);
|
||||||
|
|
||||||
|
//Next block
|
||||||
|
c += cipher->blockSize;
|
||||||
|
p += cipher->blockSize;
|
||||||
|
length -= cipher->blockSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
//The ciphertext must be a multiple of the block size
|
||||||
|
if(length != 0)
|
||||||
|
return ERROR_INVALID_LENGTH;
|
||||||
|
|
||||||
|
//Successful encryption
|
||||||
|
return NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
629
deps/cyclone/gcm.c
vendored
Normal file
629
deps/cyclone/gcm.c
vendored
Normal file
@@ -0,0 +1,629 @@
|
|||||||
|
/**
|
||||||
|
* @file gcm.c
|
||||||
|
* @brief Galois/Counter Mode (GCM)
|
||||||
|
*
|
||||||
|
* @section License
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010-2024 Oryx Embedded SARL. All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is part of CycloneCRYPTO Open.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* @section Description
|
||||||
|
*
|
||||||
|
* The Galois/Counter Mode (GCM) is an authenticated encryption algorithm
|
||||||
|
* designed to provide both data authenticity (integrity) and confidentiality.
|
||||||
|
* Refer to SP 800-38D for more details
|
||||||
|
*
|
||||||
|
* @author Oryx Embedded SARL (www.oryx-embedded.com)
|
||||||
|
* @version 2.4.4
|
||||||
|
**/
|
||||||
|
|
||||||
|
//Switch to the appropriate trace level
|
||||||
|
#define TRACE_LEVEL CRYPTO_TRACE_LEVEL
|
||||||
|
|
||||||
|
//Dependencies
|
||||||
|
#include "core/crypto.h"
|
||||||
|
#include "aead/gcm.h"
|
||||||
|
|
||||||
|
//Check crypto library configuration
|
||||||
|
#if (GCM_SUPPORT == ENABLED)
|
||||||
|
|
||||||
|
//Reduction table
|
||||||
|
static const uint32_t r[GCM_TABLE_N] =
|
||||||
|
{
|
||||||
|
#if (GCM_TABLE_W == 4)
|
||||||
|
0x00000000, 0x1C200000, 0x38400000, 0x24600000, 0x70800000, 0x6CA00000, 0x48C00000, 0x54E00000,
|
||||||
|
0xE1000000, 0xFD200000, 0xD9400000, 0xC5600000, 0x91800000, 0x8DA00000, 0xA9C00000, 0xB5E00000
|
||||||
|
#else
|
||||||
|
0x00000000, 0x01C20000, 0x03840000, 0x02460000, 0x07080000, 0x06CA0000, 0x048C0000, 0x054E0000,
|
||||||
|
0x0E100000, 0x0FD20000, 0x0D940000, 0x0C560000, 0x09180000, 0x08DA0000, 0x0A9C0000, 0x0B5E0000,
|
||||||
|
0x1C200000, 0x1DE20000, 0x1FA40000, 0x1E660000, 0x1B280000, 0x1AEA0000, 0x18AC0000, 0x196E0000,
|
||||||
|
0x12300000, 0x13F20000, 0x11B40000, 0x10760000, 0x15380000, 0x14FA0000, 0x16BC0000, 0x177E0000,
|
||||||
|
0x38400000, 0x39820000, 0x3BC40000, 0x3A060000, 0x3F480000, 0x3E8A0000, 0x3CCC0000, 0x3D0E0000,
|
||||||
|
0x36500000, 0x37920000, 0x35D40000, 0x34160000, 0x31580000, 0x309A0000, 0x32DC0000, 0x331E0000,
|
||||||
|
0x24600000, 0x25A20000, 0x27E40000, 0x26260000, 0x23680000, 0x22AA0000, 0x20EC0000, 0x212E0000,
|
||||||
|
0x2A700000, 0x2BB20000, 0x29F40000, 0x28360000, 0x2D780000, 0x2CBA0000, 0x2EFC0000, 0x2F3E0000,
|
||||||
|
0x70800000, 0x71420000, 0x73040000, 0x72C60000, 0x77880000, 0x764A0000, 0x740C0000, 0x75CE0000,
|
||||||
|
0x7E900000, 0x7F520000, 0x7D140000, 0x7CD60000, 0x79980000, 0x785A0000, 0x7A1C0000, 0x7BDE0000,
|
||||||
|
0x6CA00000, 0x6D620000, 0x6F240000, 0x6EE60000, 0x6BA80000, 0x6A6A0000, 0x682C0000, 0x69EE0000,
|
||||||
|
0x62B00000, 0x63720000, 0x61340000, 0x60F60000, 0x65B80000, 0x647A0000, 0x663C0000, 0x67FE0000,
|
||||||
|
0x48C00000, 0x49020000, 0x4B440000, 0x4A860000, 0x4FC80000, 0x4E0A0000, 0x4C4C0000, 0x4D8E0000,
|
||||||
|
0x46D00000, 0x47120000, 0x45540000, 0x44960000, 0x41D80000, 0x401A0000, 0x425C0000, 0x439E0000,
|
||||||
|
0x54E00000, 0x55220000, 0x57640000, 0x56A60000, 0x53E80000, 0x522A0000, 0x506C0000, 0x51AE0000,
|
||||||
|
0x5AF00000, 0x5B320000, 0x59740000, 0x58B60000, 0x5DF80000, 0x5C3A0000, 0x5E7C0000, 0x5FBE0000,
|
||||||
|
0xE1000000, 0xE0C20000, 0xE2840000, 0xE3460000, 0xE6080000, 0xE7CA0000, 0xE58C0000, 0xE44E0000,
|
||||||
|
0xEF100000, 0xEED20000, 0xEC940000, 0xED560000, 0xE8180000, 0xE9DA0000, 0xEB9C0000, 0xEA5E0000,
|
||||||
|
0xFD200000, 0xFCE20000, 0xFEA40000, 0xFF660000, 0xFA280000, 0xFBEA0000, 0xF9AC0000, 0xF86E0000,
|
||||||
|
0xF3300000, 0xF2F20000, 0xF0B40000, 0xF1760000, 0xF4380000, 0xF5FA0000, 0xF7BC0000, 0xF67E0000,
|
||||||
|
0xD9400000, 0xD8820000, 0xDAC40000, 0xDB060000, 0xDE480000, 0xDF8A0000, 0xDDCC0000, 0xDC0E0000,
|
||||||
|
0xD7500000, 0xD6920000, 0xD4D40000, 0xD5160000, 0xD0580000, 0xD19A0000, 0xD3DC0000, 0xD21E0000,
|
||||||
|
0xC5600000, 0xC4A20000, 0xC6E40000, 0xC7260000, 0xC2680000, 0xC3AA0000, 0xC1EC0000, 0xC02E0000,
|
||||||
|
0xCB700000, 0xCAB20000, 0xC8F40000, 0xC9360000, 0xCC780000, 0xCDBA0000, 0xCFFC0000, 0xCE3E0000,
|
||||||
|
0x91800000, 0x90420000, 0x92040000, 0x93C60000, 0x96880000, 0x974A0000, 0x950C0000, 0x94CE0000,
|
||||||
|
0x9F900000, 0x9E520000, 0x9C140000, 0x9DD60000, 0x98980000, 0x995A0000, 0x9B1C0000, 0x9ADE0000,
|
||||||
|
0x8DA00000, 0x8C620000, 0x8E240000, 0x8FE60000, 0x8AA80000, 0x8B6A0000, 0x892C0000, 0x88EE0000,
|
||||||
|
0x83B00000, 0x82720000, 0x80340000, 0x81F60000, 0x84B80000, 0x857A0000, 0x873C0000, 0x86FE0000,
|
||||||
|
0xA9C00000, 0xA8020000, 0xAA440000, 0xAB860000, 0xAEC80000, 0xAF0A0000, 0xAD4C0000, 0xAC8E0000,
|
||||||
|
0xA7D00000, 0xA6120000, 0xA4540000, 0xA5960000, 0xA0D80000, 0xA11A0000, 0xA35C0000, 0xA29E0000,
|
||||||
|
0xB5E00000, 0xB4220000, 0xB6640000, 0xB7A60000, 0xB2E80000, 0xB32A0000, 0xB16C0000, 0xB0AE0000,
|
||||||
|
0xBBF00000, 0xBA320000, 0xB8740000, 0xB9B60000, 0xBCF80000, 0xBD3A0000, 0xBF7C0000, 0xBEBE0000
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialize GCM context
|
||||||
|
* @param[in] context Pointer to the GCM context
|
||||||
|
* @param[in] cipherAlgo Cipher algorithm
|
||||||
|
* @param[in] cipherContext Pointer to the cipher algorithm context
|
||||||
|
* @return Error code
|
||||||
|
**/
|
||||||
|
|
||||||
|
__weak_func error_t gcmInit(GcmContext *context, const CipherAlgo *cipherAlgo,
|
||||||
|
void *cipherContext)
|
||||||
|
{
|
||||||
|
uint_t i;
|
||||||
|
uint_t j;
|
||||||
|
uint32_t c;
|
||||||
|
uint32_t h[4];
|
||||||
|
|
||||||
|
//Check parameters
|
||||||
|
if(context == NULL || cipherAlgo == NULL || cipherContext == NULL)
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
//GCM supports only symmetric block ciphers whose block size is 128 bits
|
||||||
|
if(cipherAlgo->type != CIPHER_ALGO_TYPE_BLOCK || cipherAlgo->blockSize != 16)
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
//Save cipher algorithm context
|
||||||
|
context->cipherAlgo = cipherAlgo;
|
||||||
|
context->cipherContext = cipherContext;
|
||||||
|
|
||||||
|
//Let H = 0
|
||||||
|
h[0] = 0;
|
||||||
|
h[1] = 0;
|
||||||
|
h[2] = 0;
|
||||||
|
h[3] = 0;
|
||||||
|
|
||||||
|
//Generate the hash subkey H
|
||||||
|
context->cipherAlgo->encryptBlock(context->cipherContext, (uint8_t *) h,
|
||||||
|
(uint8_t *) h);
|
||||||
|
|
||||||
|
//Pre-compute M(0) = H * 0
|
||||||
|
j = GCM_REVERSE_BITS(0);
|
||||||
|
context->m[j][0] = 0;
|
||||||
|
context->m[j][1] = 0;
|
||||||
|
context->m[j][2] = 0;
|
||||||
|
context->m[j][3] = 0;
|
||||||
|
|
||||||
|
//Pre-compute M(1) = H * 1
|
||||||
|
j = GCM_REVERSE_BITS(1);
|
||||||
|
context->m[j][0] = betoh32(h[3]);
|
||||||
|
context->m[j][1] = betoh32(h[2]);
|
||||||
|
context->m[j][2] = betoh32(h[1]);
|
||||||
|
context->m[j][3] = betoh32(h[0]);
|
||||||
|
|
||||||
|
//Pre-compute all multiples of H (Shoup's method)
|
||||||
|
for(i = 2; i < GCM_TABLE_N; i++)
|
||||||
|
{
|
||||||
|
//Odd value?
|
||||||
|
if((i & 1) != 0)
|
||||||
|
{
|
||||||
|
//Compute M(i) = M(i - 1) + H
|
||||||
|
j = GCM_REVERSE_BITS(i - 1);
|
||||||
|
h[0] = context->m[j][0];
|
||||||
|
h[1] = context->m[j][1];
|
||||||
|
h[2] = context->m[j][2];
|
||||||
|
h[3] = context->m[j][3];
|
||||||
|
|
||||||
|
//An addition in GF(2^128) is identical to a bitwise exclusive-OR
|
||||||
|
//operation
|
||||||
|
j = GCM_REVERSE_BITS(1);
|
||||||
|
h[0] ^= context->m[j][0];
|
||||||
|
h[1] ^= context->m[j][1];
|
||||||
|
h[2] ^= context->m[j][2];
|
||||||
|
h[3] ^= context->m[j][3];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Compute M(i) = M(i / 2) * x
|
||||||
|
j = GCM_REVERSE_BITS(i / 2);
|
||||||
|
h[0] = context->m[j][0];
|
||||||
|
h[1] = context->m[j][1];
|
||||||
|
h[2] = context->m[j][2];
|
||||||
|
h[3] = context->m[j][3];
|
||||||
|
|
||||||
|
//The multiplication of a polynomial by x in GF(2^128) corresponds
|
||||||
|
//to a shift of indices
|
||||||
|
c = h[0] & 0x01;
|
||||||
|
h[0] = (h[0] >> 1) | (h[1] << 31);
|
||||||
|
h[1] = (h[1] >> 1) | (h[2] << 31);
|
||||||
|
h[2] = (h[2] >> 1) | (h[3] << 31);
|
||||||
|
h[3] >>= 1;
|
||||||
|
|
||||||
|
//If the highest term of the result is equal to one, then perform
|
||||||
|
//reduction
|
||||||
|
h[3] ^= r[GCM_REVERSE_BITS(1)] & ~(c - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Save M(i)
|
||||||
|
j = GCM_REVERSE_BITS(i);
|
||||||
|
context->m[j][0] = h[0];
|
||||||
|
context->m[j][1] = h[1];
|
||||||
|
context->m[j][2] = h[2];
|
||||||
|
context->m[j][3] = h[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
//Successful initialization
|
||||||
|
return NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Authenticated encryption using GCM
|
||||||
|
* @param[in] context Pointer to the GCM context
|
||||||
|
* @param[in] iv Initialization vector
|
||||||
|
* @param[in] ivLen Length of the initialization vector
|
||||||
|
* @param[in] a Additional authenticated data
|
||||||
|
* @param[in] aLen Length of the additional data
|
||||||
|
* @param[in] p Plaintext to be encrypted
|
||||||
|
* @param[out] c Ciphertext resulting from the encryption
|
||||||
|
* @param[in] length Total number of data bytes to be encrypted
|
||||||
|
* @param[out] t Authentication tag
|
||||||
|
* @param[in] tLen Length of the authentication tag
|
||||||
|
* @return Error code
|
||||||
|
**/
|
||||||
|
|
||||||
|
__weak_func error_t gcmEncrypt(GcmContext *context, const uint8_t *iv,
|
||||||
|
size_t ivLen, const uint8_t *a, size_t aLen, const uint8_t *p,
|
||||||
|
uint8_t *c, size_t length, uint8_t *t, size_t tLen)
|
||||||
|
{
|
||||||
|
size_t k;
|
||||||
|
size_t n;
|
||||||
|
uint8_t b[16];
|
||||||
|
uint8_t j[16];
|
||||||
|
uint8_t s[16];
|
||||||
|
|
||||||
|
//Make sure the GCM context is valid
|
||||||
|
if(context == NULL)
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
//The length of the IV shall meet SP 800-38D requirements
|
||||||
|
if(ivLen < 1)
|
||||||
|
return ERROR_INVALID_LENGTH;
|
||||||
|
|
||||||
|
//Check the length of the authentication tag
|
||||||
|
if(tLen < 4 || tLen > 16)
|
||||||
|
return ERROR_INVALID_LENGTH;
|
||||||
|
|
||||||
|
//Check whether the length of the IV is 96 bits
|
||||||
|
if(ivLen == 12)
|
||||||
|
{
|
||||||
|
//When the length of the IV is 96 bits, the padding string is appended
|
||||||
|
//to the IV to form the pre-counter block
|
||||||
|
osMemcpy(j, iv, 12);
|
||||||
|
STORE32BE(1, j + 12);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Initialize GHASH calculation
|
||||||
|
osMemset(j, 0, 16);
|
||||||
|
|
||||||
|
//Length of the IV
|
||||||
|
n = ivLen;
|
||||||
|
|
||||||
|
//Process the initialization vector
|
||||||
|
while(n > 0)
|
||||||
|
{
|
||||||
|
//The IV is processed in a block-by-block fashion
|
||||||
|
k = MIN(n, 16);
|
||||||
|
|
||||||
|
//Apply GHASH function
|
||||||
|
gcmXorBlock(j, j, iv, k);
|
||||||
|
gcmMul(context, j);
|
||||||
|
|
||||||
|
//Next block
|
||||||
|
iv += k;
|
||||||
|
n -= k;
|
||||||
|
}
|
||||||
|
|
||||||
|
//The string is appended with 64 additional 0 bits, followed by the
|
||||||
|
//64-bit representation of the length of the IV
|
||||||
|
osMemset(b, 0, 8);
|
||||||
|
STORE64BE(ivLen * 8, b + 8);
|
||||||
|
|
||||||
|
//The GHASH function is applied to the resulting string to form the
|
||||||
|
//pre-counter block
|
||||||
|
gcmXorBlock(j, j, b, 16);
|
||||||
|
gcmMul(context, j);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Compute MSB(CIPH(J(0)))
|
||||||
|
context->cipherAlgo->encryptBlock(context->cipherContext, j, b);
|
||||||
|
osMemcpy(t, b, tLen);
|
||||||
|
|
||||||
|
//Initialize GHASH calculation
|
||||||
|
osMemset(s, 0, 16);
|
||||||
|
//Length of the AAD
|
||||||
|
n = aLen;
|
||||||
|
|
||||||
|
//Process AAD
|
||||||
|
while(n > 0)
|
||||||
|
{
|
||||||
|
//Additional data are processed in a block-by-block fashion
|
||||||
|
k = MIN(n, 16);
|
||||||
|
|
||||||
|
//Apply GHASH function
|
||||||
|
gcmXorBlock(s, s, a, k);
|
||||||
|
gcmMul(context, s);
|
||||||
|
|
||||||
|
//Next block
|
||||||
|
a += k;
|
||||||
|
n -= k;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Length of the plaintext
|
||||||
|
n = length;
|
||||||
|
|
||||||
|
//Process plaintext
|
||||||
|
while(n > 0)
|
||||||
|
{
|
||||||
|
//The encryption operates in a block-by-block fashion
|
||||||
|
k = MIN(n, 16);
|
||||||
|
|
||||||
|
//Increment counter
|
||||||
|
gcmIncCounter(j);
|
||||||
|
|
||||||
|
//Encrypt plaintext
|
||||||
|
context->cipherAlgo->encryptBlock(context->cipherContext, j, b);
|
||||||
|
gcmXorBlock(c, p, b, k);
|
||||||
|
|
||||||
|
//Apply GHASH function
|
||||||
|
gcmXorBlock(s, s, c, k);
|
||||||
|
gcmMul(context, s);
|
||||||
|
|
||||||
|
//Next block
|
||||||
|
p += k;
|
||||||
|
c += k;
|
||||||
|
n -= k;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Append the 64-bit representation of the length of the AAD and the
|
||||||
|
//ciphertext
|
||||||
|
STORE64BE(aLen * 8, b);
|
||||||
|
STORE64BE(length * 8, b + 8);
|
||||||
|
|
||||||
|
//The GHASH function is applied to the result to produce a single output
|
||||||
|
//block S
|
||||||
|
gcmXorBlock(s, s, b, 16);
|
||||||
|
gcmMul(context, s);
|
||||||
|
|
||||||
|
//Let T = MSB(GCTR(J(0), S)
|
||||||
|
gcmXorBlock(t, t, s, tLen);
|
||||||
|
|
||||||
|
//Successful encryption
|
||||||
|
return NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Authenticated decryption using GCM
|
||||||
|
* @param[in] context Pointer to the GCM context
|
||||||
|
* @param[in] iv Initialization vector
|
||||||
|
* @param[in] ivLen Length of the initialization vector
|
||||||
|
* @param[in] a Additional authenticated data
|
||||||
|
* @param[in] aLen Length of the additional data
|
||||||
|
* @param[in] c Ciphertext to be decrypted
|
||||||
|
* @param[out] p Plaintext resulting from the decryption
|
||||||
|
* @param[in] length Total number of data bytes to be decrypted
|
||||||
|
* @param[in] t Authentication tag
|
||||||
|
* @param[in] tLen Length of the authentication tag
|
||||||
|
* @return Error code
|
||||||
|
**/
|
||||||
|
|
||||||
|
__weak_func error_t gcmDecrypt(GcmContext *context, const uint8_t *iv,
|
||||||
|
size_t ivLen, const uint8_t *a, size_t aLen, const uint8_t *c,
|
||||||
|
uint8_t *p, size_t length, const uint8_t *t, size_t tLen)
|
||||||
|
{
|
||||||
|
uint8_t mask;
|
||||||
|
size_t k;
|
||||||
|
size_t n;
|
||||||
|
uint8_t b[16];
|
||||||
|
uint8_t j[16];
|
||||||
|
uint8_t r[16];
|
||||||
|
uint8_t s[16];
|
||||||
|
|
||||||
|
//Make sure the GCM context is valid
|
||||||
|
if(context == NULL)
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
//The length of the IV shall meet SP 800-38D requirements
|
||||||
|
if(ivLen < 1)
|
||||||
|
return ERROR_INVALID_LENGTH;
|
||||||
|
|
||||||
|
//Check the length of the authentication tag
|
||||||
|
if(tLen < 4 || tLen > 16)
|
||||||
|
return ERROR_INVALID_LENGTH;
|
||||||
|
|
||||||
|
//Check whether the length of the IV is 96 bits
|
||||||
|
if(ivLen == 12)
|
||||||
|
{
|
||||||
|
//When the length of the IV is 96 bits, the padding string is appended
|
||||||
|
//to the IV to form the pre-counter block
|
||||||
|
osMemcpy(j, iv, 12);
|
||||||
|
STORE32BE(1, j + 12);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Initialize GHASH calculation
|
||||||
|
osMemset(j, 0, 16);
|
||||||
|
|
||||||
|
//Length of the IV
|
||||||
|
n = ivLen;
|
||||||
|
|
||||||
|
//Process the initialization vector
|
||||||
|
while(n > 0)
|
||||||
|
{
|
||||||
|
//The IV is processed in a block-by-block fashion
|
||||||
|
k = MIN(n, 16);
|
||||||
|
|
||||||
|
//Apply GHASH function
|
||||||
|
gcmXorBlock(j, j, iv, k);
|
||||||
|
gcmMul(context, j);
|
||||||
|
|
||||||
|
//Next block
|
||||||
|
iv += k;
|
||||||
|
n -= k;
|
||||||
|
}
|
||||||
|
|
||||||
|
//The string is appended with 64 additional 0 bits, followed by the
|
||||||
|
//64-bit representation of the length of the IV
|
||||||
|
osMemset(b, 0, 8);
|
||||||
|
STORE64BE(ivLen * 8, b + 8);
|
||||||
|
|
||||||
|
//The GHASH function is applied to the resulting string to form the
|
||||||
|
//pre-counter block
|
||||||
|
gcmXorBlock(j, j, b, 16);
|
||||||
|
gcmMul(context, j);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Compute MSB(CIPH(J(0)))
|
||||||
|
context->cipherAlgo->encryptBlock(context->cipherContext, j, b);
|
||||||
|
osMemcpy(r, b, tLen);
|
||||||
|
|
||||||
|
//Initialize GHASH calculation
|
||||||
|
osMemset(s, 0, 16);
|
||||||
|
//Length of the AAD
|
||||||
|
n = aLen;
|
||||||
|
|
||||||
|
//Process AAD
|
||||||
|
while(n > 0)
|
||||||
|
{
|
||||||
|
//Additional data are processed in a block-by-block fashion
|
||||||
|
k = MIN(n, 16);
|
||||||
|
|
||||||
|
//Apply GHASH function
|
||||||
|
gcmXorBlock(s, s, a, k);
|
||||||
|
gcmMul(context, s);
|
||||||
|
|
||||||
|
//Next block
|
||||||
|
a += k;
|
||||||
|
n -= k;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Length of the ciphertext
|
||||||
|
n = length;
|
||||||
|
|
||||||
|
//Process ciphertext
|
||||||
|
while(n > 0)
|
||||||
|
{
|
||||||
|
//The decryption operates in a block-by-block fashion
|
||||||
|
k = MIN(n, 16);
|
||||||
|
|
||||||
|
//Apply GHASH function
|
||||||
|
gcmXorBlock(s, s, c, k);
|
||||||
|
gcmMul(context, s);
|
||||||
|
|
||||||
|
//Increment counter
|
||||||
|
gcmIncCounter(j);
|
||||||
|
|
||||||
|
//Decrypt ciphertext
|
||||||
|
context->cipherAlgo->encryptBlock(context->cipherContext, j, b);
|
||||||
|
gcmXorBlock(p, c, b, k);
|
||||||
|
|
||||||
|
//Next block
|
||||||
|
c += k;
|
||||||
|
p += k;
|
||||||
|
n -= k;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Append the 64-bit representation of the length of the AAD and the
|
||||||
|
//ciphertext
|
||||||
|
STORE64BE(aLen * 8, b);
|
||||||
|
STORE64BE(length * 8, b + 8);
|
||||||
|
|
||||||
|
//The GHASH function is applied to the result to produce a single output
|
||||||
|
//block S
|
||||||
|
gcmXorBlock(s, s, b, 16);
|
||||||
|
gcmMul(context, s);
|
||||||
|
|
||||||
|
//Let R = MSB(GCTR(J(0), S))
|
||||||
|
gcmXorBlock(r, r, s, tLen);
|
||||||
|
|
||||||
|
//The calculated tag is bitwise compared to the received tag. The message
|
||||||
|
//is authenticated if and only if the tags match
|
||||||
|
for(mask = 0, n = 0; n < tLen; n++)
|
||||||
|
{
|
||||||
|
mask |= r[n] ^ t[n];
|
||||||
|
}
|
||||||
|
|
||||||
|
//Return status code
|
||||||
|
return (mask == 0) ? NO_ERROR : ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Multiplication operation in GF(2^128)
|
||||||
|
* @param[in] context Pointer to the GCM context
|
||||||
|
* @param[in, out] x 16-byte block to be multiplied by H
|
||||||
|
**/
|
||||||
|
|
||||||
|
__weak_func void gcmMul(GcmContext *context, uint8_t *x)
|
||||||
|
{
|
||||||
|
int_t i;
|
||||||
|
uint8_t b;
|
||||||
|
uint8_t c;
|
||||||
|
uint32_t z[4];
|
||||||
|
|
||||||
|
//Let Z = 0
|
||||||
|
z[0] = 0;
|
||||||
|
z[1] = 0;
|
||||||
|
z[2] = 0;
|
||||||
|
z[3] = 0;
|
||||||
|
|
||||||
|
//Fast table-driven implementation (Shoup's method)
|
||||||
|
for(i = 15; i >= 0; i--)
|
||||||
|
{
|
||||||
|
#if (GCM_TABLE_W == 4)
|
||||||
|
//Get the lower nibble
|
||||||
|
b = x[i] & 0x0F;
|
||||||
|
|
||||||
|
//Multiply 4 bits at a time
|
||||||
|
c = z[0] & 0x0F;
|
||||||
|
z[0] = (z[0] >> 4) | (z[1] << 28);
|
||||||
|
z[1] = (z[1] >> 4) | (z[2] << 28);
|
||||||
|
z[2] = (z[2] >> 4) | (z[3] << 28);
|
||||||
|
z[3] >>= 4;
|
||||||
|
|
||||||
|
z[0] ^= context->m[b][0];
|
||||||
|
z[1] ^= context->m[b][1];
|
||||||
|
z[2] ^= context->m[b][2];
|
||||||
|
z[3] ^= context->m[b][3];
|
||||||
|
|
||||||
|
//Perform reduction
|
||||||
|
z[3] ^= r[c];
|
||||||
|
|
||||||
|
//Get the upper nibble
|
||||||
|
b = (x[i] >> 4) & 0x0F;
|
||||||
|
|
||||||
|
//Multiply 4 bits at a time
|
||||||
|
c = z[0] & 0x0F;
|
||||||
|
z[0] = (z[0] >> 4) | (z[1] << 28);
|
||||||
|
z[1] = (z[1] >> 4) | (z[2] << 28);
|
||||||
|
z[2] = (z[2] >> 4) | (z[3] << 28);
|
||||||
|
z[3] >>= 4;
|
||||||
|
|
||||||
|
z[0] ^= context->m[b][0];
|
||||||
|
z[1] ^= context->m[b][1];
|
||||||
|
z[2] ^= context->m[b][2];
|
||||||
|
z[3] ^= context->m[b][3];
|
||||||
|
|
||||||
|
//Perform reduction
|
||||||
|
z[3] ^= r[c];
|
||||||
|
#else
|
||||||
|
//Get current byte
|
||||||
|
b = x[i];
|
||||||
|
|
||||||
|
//Multiply 8 bits at a time
|
||||||
|
c = z[0] & 0xFF;
|
||||||
|
z[0] = (z[0] >> 8) | (z[1] << 24);
|
||||||
|
z[1] = (z[1] >> 8) | (z[2] << 24);
|
||||||
|
z[2] = (z[2] >> 8) | (z[3] << 24);
|
||||||
|
z[3] >>= 8;
|
||||||
|
|
||||||
|
z[0] ^= context->m[b][0];
|
||||||
|
z[1] ^= context->m[b][1];
|
||||||
|
z[2] ^= context->m[b][2];
|
||||||
|
z[3] ^= context->m[b][3];
|
||||||
|
|
||||||
|
//Perform reduction
|
||||||
|
z[3] ^= r[c];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
//Save the result
|
||||||
|
STORE32BE(z[3], x);
|
||||||
|
STORE32BE(z[2], x + 4);
|
||||||
|
STORE32BE(z[1], x + 8);
|
||||||
|
STORE32BE(z[0], x + 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief XOR operation
|
||||||
|
* @param[out] x Block resulting from the XOR operation
|
||||||
|
* @param[in] a First block
|
||||||
|
* @param[in] b Second block
|
||||||
|
* @param[in] n Size of the block
|
||||||
|
**/
|
||||||
|
|
||||||
|
void gcmXorBlock(uint8_t *x, const uint8_t *a, const uint8_t *b, size_t n)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
//Perform XOR operation
|
||||||
|
for(i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
x[i] = a[i] ^ b[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Increment counter block
|
||||||
|
* @param[in,out] ctr Pointer to the counter block
|
||||||
|
**/
|
||||||
|
|
||||||
|
void gcmIncCounter(uint8_t *ctr)
|
||||||
|
{
|
||||||
|
uint16_t temp;
|
||||||
|
|
||||||
|
//The function increments the right-most 32 bits of the block. The remaining
|
||||||
|
//left-most 96 bits remain unchanged
|
||||||
|
temp = ctr[15] + 1;
|
||||||
|
ctr[15] = temp & 0xFF;
|
||||||
|
temp = (temp >> 8) + ctr[14];
|
||||||
|
ctr[14] = temp & 0xFF;
|
||||||
|
temp = (temp >> 8) + ctr[13];
|
||||||
|
ctr[13] = temp & 0xFF;
|
||||||
|
temp = (temp >> 8) + ctr[12];
|
||||||
|
ctr[12] = temp & 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
226
deps/cyclone/hkdf.c
vendored
Normal file
226
deps/cyclone/hkdf.c
vendored
Normal file
@@ -0,0 +1,226 @@
|
|||||||
|
/**
|
||||||
|
* @file hkdf.c
|
||||||
|
* @brief HKDF (HMAC-based Key Derivation Function)
|
||||||
|
*
|
||||||
|
* @section License
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010-2024 Oryx Embedded SARL. All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is part of CycloneCRYPTO Open.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* @section Description
|
||||||
|
*
|
||||||
|
* HKDF is a simple HMAC-based key derivation function which can be used as a
|
||||||
|
* building block in various protocols and applications. Refer to RFC 5869 for
|
||||||
|
* more details
|
||||||
|
*
|
||||||
|
* @author Oryx Embedded SARL (www.oryx-embedded.com)
|
||||||
|
* @version 2.4.4
|
||||||
|
**/
|
||||||
|
|
||||||
|
//Switch to the appropriate trace level
|
||||||
|
#define TRACE_LEVEL CRYPTO_TRACE_LEVEL
|
||||||
|
|
||||||
|
//Dependencies
|
||||||
|
#include "core/crypto.h"
|
||||||
|
#include "kdf/hkdf.h"
|
||||||
|
#include "mac/hmac.h"
|
||||||
|
|
||||||
|
//Check crypto library configuration
|
||||||
|
#if (HKDF_SUPPORT == ENABLED)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief HKDF key derivation function
|
||||||
|
* @param[in] hash Underlying hash function
|
||||||
|
* @param[in] ikm input keying material
|
||||||
|
* @param[in] ikmLen Length in the input keying material
|
||||||
|
* @param[in] salt Optional salt value (a non-secret random value)
|
||||||
|
* @param[in] saltLen Length of the salt
|
||||||
|
* @param[in] info Optional application specific information
|
||||||
|
* @param[in] infoLen Length of the application specific information
|
||||||
|
* @param[out] okm output keying material
|
||||||
|
* @param[in] okmLen Length of the output keying material
|
||||||
|
* @return Error code
|
||||||
|
**/
|
||||||
|
|
||||||
|
error_t hkdf(const HashAlgo *hash, const uint8_t *ikm, size_t ikmLen,
|
||||||
|
const uint8_t *salt, size_t saltLen, const uint8_t *info, size_t infoLen,
|
||||||
|
uint8_t *okm, size_t okmLen)
|
||||||
|
{
|
||||||
|
error_t error;
|
||||||
|
uint8_t prk[MAX_HASH_DIGEST_SIZE];
|
||||||
|
|
||||||
|
//Perform HKDF extract step
|
||||||
|
error = hkdfExtract(hash, ikm, ikmLen, salt, saltLen, prk);
|
||||||
|
|
||||||
|
//Check status code
|
||||||
|
if(!error)
|
||||||
|
{
|
||||||
|
//Perform HKDF expand step
|
||||||
|
error = hkdfExpand(hash, prk, hash->digestSize, info, infoLen,
|
||||||
|
okm, okmLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Return status code
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief HKDF extract step
|
||||||
|
* @param[in] hash Underlying hash function
|
||||||
|
* @param[in] ikm input keying material
|
||||||
|
* @param[in] ikmLen Length in the input keying material
|
||||||
|
* @param[in] salt Optional salt value (a non-secret random value)
|
||||||
|
* @param[in] saltLen Length of the salt
|
||||||
|
* @param[out] prk Pseudorandom key
|
||||||
|
* @return Error code
|
||||||
|
**/
|
||||||
|
|
||||||
|
error_t hkdfExtract(const HashAlgo *hash, const uint8_t *ikm, size_t ikmLen,
|
||||||
|
const uint8_t *salt, size_t saltLen, uint8_t *prk)
|
||||||
|
{
|
||||||
|
#if (CRYPTO_STATIC_MEM_SUPPORT == DISABLED)
|
||||||
|
HmacContext *hmacContext;
|
||||||
|
#else
|
||||||
|
HmacContext hmacContext[1];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Check parameters
|
||||||
|
if(hash == NULL || ikm == NULL || prk == NULL)
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
//The salt parameter is optional
|
||||||
|
if(salt == NULL && saltLen != 0)
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
#if (CRYPTO_STATIC_MEM_SUPPORT == DISABLED)
|
||||||
|
//Allocate a memory buffer to hold the HMAC context
|
||||||
|
hmacContext = cryptoAllocMem(sizeof(HmacContext));
|
||||||
|
//Failed to allocate memory?
|
||||||
|
if(hmacContext == NULL)
|
||||||
|
return ERROR_OUT_OF_MEMORY;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//The salt parameter is optional
|
||||||
|
if(salt == NULL)
|
||||||
|
{
|
||||||
|
//If the salt is not provided, it is set to a string of HashLen zeros
|
||||||
|
osMemset(hmacContext->digest, 0, hash->digestSize);
|
||||||
|
salt = hmacContext->digest;
|
||||||
|
saltLen = hash->digestSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Compute PRK = HMAC-Hash(salt, IKM)
|
||||||
|
hmacInit(hmacContext, hash, salt, saltLen);
|
||||||
|
hmacUpdate(hmacContext, ikm, ikmLen);
|
||||||
|
hmacFinal(hmacContext, prk);
|
||||||
|
|
||||||
|
#if (CRYPTO_STATIC_MEM_SUPPORT == DISABLED)
|
||||||
|
//Free previously allocated memory
|
||||||
|
cryptoFreeMem(hmacContext);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Successful processing
|
||||||
|
return NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief HKDF expand step
|
||||||
|
* @param[in] hash Underlying hash function
|
||||||
|
* @param[in] prk Pseudorandom key
|
||||||
|
* @param[in] prkLen Length of the pseudorandom key
|
||||||
|
* @param[in] info Optional application specific information
|
||||||
|
* @param[in] infoLen Length of the application specific information
|
||||||
|
* @param[out] okm output keying material
|
||||||
|
* @param[in] okmLen Length of the output keying material
|
||||||
|
* @return Error code
|
||||||
|
**/
|
||||||
|
|
||||||
|
error_t hkdfExpand(const HashAlgo *hash, const uint8_t *prk, size_t prkLen,
|
||||||
|
const uint8_t *info, size_t infoLen, uint8_t *okm, size_t okmLen)
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
size_t tLen;
|
||||||
|
uint8_t t[MAX_HASH_DIGEST_SIZE];
|
||||||
|
#if (CRYPTO_STATIC_MEM_SUPPORT == DISABLED)
|
||||||
|
HmacContext *hmacContext;
|
||||||
|
#else
|
||||||
|
HmacContext hmacContext[1];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Check parameters
|
||||||
|
if(hash == NULL || prk == NULL || okm == NULL)
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
//The application specific information parameter is optional
|
||||||
|
if(info == NULL && infoLen != 0)
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
//PRK must be at least HashLen octets
|
||||||
|
if(prkLen < hash->digestSize)
|
||||||
|
return ERROR_INVALID_LENGTH;
|
||||||
|
|
||||||
|
//Check the length of the output keying material
|
||||||
|
if(okmLen > (255 * hash->digestSize))
|
||||||
|
return ERROR_INVALID_LENGTH;
|
||||||
|
|
||||||
|
#if (CRYPTO_STATIC_MEM_SUPPORT == DISABLED)
|
||||||
|
//Allocate a memory buffer to hold the HMAC context
|
||||||
|
hmacContext = cryptoAllocMem(sizeof(HmacContext));
|
||||||
|
//Failed to allocate memory?
|
||||||
|
if(hmacContext == NULL)
|
||||||
|
return ERROR_OUT_OF_MEMORY;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//T(0) is an empty string (zero length)
|
||||||
|
tLen = 0;
|
||||||
|
|
||||||
|
//Iterate as many times as required
|
||||||
|
for(i = 1; okmLen > 0; i++)
|
||||||
|
{
|
||||||
|
//Compute T(i) = HMAC-Hash(PRK, T(i-1) | info | i)
|
||||||
|
hmacInit(hmacContext, hash, prk, prkLen);
|
||||||
|
hmacUpdate(hmacContext, t, tLen);
|
||||||
|
hmacUpdate(hmacContext, info, infoLen);
|
||||||
|
hmacUpdate(hmacContext, &i, sizeof(i));
|
||||||
|
hmacFinal(hmacContext, t);
|
||||||
|
|
||||||
|
//Number of octets in the current block
|
||||||
|
tLen = MIN(okmLen, hash->digestSize);
|
||||||
|
//Save the resulting block
|
||||||
|
osMemcpy(okm, t, tLen);
|
||||||
|
|
||||||
|
//Point to the next block
|
||||||
|
okm += tLen;
|
||||||
|
okmLen -= tLen;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if (CRYPTO_STATIC_MEM_SUPPORT == DISABLED)
|
||||||
|
//Free previously allocated memory
|
||||||
|
cryptoFreeMem(hmacContext);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Successful processing
|
||||||
|
return NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
303
deps/cyclone/hmac.c
vendored
Normal file
303
deps/cyclone/hmac.c
vendored
Normal file
@@ -0,0 +1,303 @@
|
|||||||
|
/**
|
||||||
|
* @file hmac.c
|
||||||
|
* @brief HMAC (Keyed-Hashing for Message Authentication)
|
||||||
|
*
|
||||||
|
* @section License
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010-2024 Oryx Embedded SARL. All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is part of CycloneCRYPTO Open.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* @section Description
|
||||||
|
*
|
||||||
|
* HMAC is a mechanism for message authentication using cryptographic hash
|
||||||
|
* functions. HMAC can be used with any iterative cryptographic hash
|
||||||
|
* function (MD5, SHA-1 or SHA-256) in combination with a secret shared
|
||||||
|
* key. Refer to RFC 2104 for more details
|
||||||
|
*
|
||||||
|
* @author Oryx Embedded SARL (www.oryx-embedded.com)
|
||||||
|
* @version 2.4.4
|
||||||
|
**/
|
||||||
|
|
||||||
|
//Switch to the appropriate trace level
|
||||||
|
#define TRACE_LEVEL CRYPTO_TRACE_LEVEL
|
||||||
|
|
||||||
|
//Dependencies
|
||||||
|
#include "core/crypto.h"
|
||||||
|
#include "mac/hmac.h"
|
||||||
|
|
||||||
|
//Check crypto library configuration
|
||||||
|
#if (HMAC_SUPPORT == ENABLED)
|
||||||
|
|
||||||
|
//HMAC with MD5 OID (1.3.6.1.5.5.8.1.1)
|
||||||
|
const uint8_t HMAC_WITH_MD5_OID[8] = {0x2B, 0x06, 0x01, 0x05, 0x05, 0x08, 0x01, 0x01};
|
||||||
|
//HMAC with Tiger OID (1.3.6.1.5.5.8.1.3)
|
||||||
|
const uint8_t HMAC_WITH_TIGER_OID[8] = {0x2B, 0x06, 0x01, 0x05, 0x05, 0x08, 0x01, 0x03};
|
||||||
|
//HMAC with RIPEMD-160 OID (1.3.6.1.5.5.8.1.4)
|
||||||
|
const uint8_t HMAC_WITH_RIPEMD160_OID[8] = {0x2B, 0x06, 0x01, 0x05, 0x05, 0x08, 0x01, 0x04};
|
||||||
|
//HMAC with SHA-1 OID (1.2.840.113549.2.7)
|
||||||
|
const uint8_t HMAC_WITH_SHA1_OID[8] = {0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x07};
|
||||||
|
//HMAC with SHA-224 OID (1.2.840.113549.2.8)
|
||||||
|
const uint8_t HMAC_WITH_SHA224_OID[8] = {0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x08};
|
||||||
|
//HMAC with SHA-256 OID (1.2.840.113549.2.9)
|
||||||
|
const uint8_t HMAC_WITH_SHA256_OID[8] = {0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x09};
|
||||||
|
//HMAC with SHA-384 OID (1.2.840.113549.2.10)
|
||||||
|
const uint8_t HMAC_WITH_SHA384_OID[8] = {0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x0A};
|
||||||
|
//HMAC with SHA-512 OID (1.2.840.113549.2.11)
|
||||||
|
const uint8_t HMAC_WITH_SHA512_OID[8] = {0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x0B};
|
||||||
|
//HMAC with SHA-512/224 OID (1.2.840.113549.2.12)
|
||||||
|
const uint8_t HMAC_WITH_SHA512_224_OID[8] = {0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x0C};
|
||||||
|
//HMAC with SHA-512/256 OID (1.2.840.113549.2.13)
|
||||||
|
const uint8_t HMAC_WITH_SHA512_256_OID[8] = {0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x0D};
|
||||||
|
//HMAC with SHA-3-224 OID (2.16.840.1.101.3.4.2.13)
|
||||||
|
const uint8_t HMAC_WITH_SHA3_224_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x0D};
|
||||||
|
//HMAC with SHA-3-256 OID (2.16.840.1.101.3.4.2.14)
|
||||||
|
const uint8_t HMAC_WITH_SHA3_256_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x0E};
|
||||||
|
//HMAC with SHA-3-384 OID (2.16.840.1.101.3.4.2.15)
|
||||||
|
const uint8_t HMAC_WITH_SHA3_384_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x0F};
|
||||||
|
//HMAC with SHA-3-512 OID (2.16.840.1.101.3.4.2.16)
|
||||||
|
const uint8_t HMAC_WITH_SHA3_512_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x10};
|
||||||
|
//HMAC with SM3 OID (1.2.156.10197.1.401.3.1)
|
||||||
|
const uint8_t HMAC_WITH_SM3_OID[10] = {0x2A, 0x81, 0x1C, 0xCF, 0x55, 0x01, 0x82, 0x91, 0x03, 0x01};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Compute HMAC using the specified hash function
|
||||||
|
* @param[in] hash Hash algorithm used to compute HMAC
|
||||||
|
* @param[in] key Key to use in the hash algorithm
|
||||||
|
* @param[in] keyLen Length of the key
|
||||||
|
* @param[in] data The input data for which to compute the hash code
|
||||||
|
* @param[in] dataLen Length of the input data
|
||||||
|
* @param[out] digest The computed HMAC value
|
||||||
|
* @return Error code
|
||||||
|
**/
|
||||||
|
|
||||||
|
__weak_func error_t hmacCompute(const HashAlgo *hash, const void *key, size_t keyLen,
|
||||||
|
const void *data, size_t dataLen, uint8_t *digest)
|
||||||
|
{
|
||||||
|
error_t error;
|
||||||
|
#if (CRYPTO_STATIC_MEM_SUPPORT == DISABLED)
|
||||||
|
HmacContext *context;
|
||||||
|
#else
|
||||||
|
HmacContext context[1];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (CRYPTO_STATIC_MEM_SUPPORT == DISABLED)
|
||||||
|
//Allocate a memory buffer to hold the HMAC context
|
||||||
|
context = cryptoAllocMem(sizeof(HmacContext));
|
||||||
|
//Failed to allocate memory?
|
||||||
|
if(context == NULL)
|
||||||
|
return ERROR_OUT_OF_MEMORY;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Initialize the HMAC context
|
||||||
|
error = hmacInit(context, hash, key, keyLen);
|
||||||
|
|
||||||
|
//Check status code
|
||||||
|
if(!error)
|
||||||
|
{
|
||||||
|
//Digest the message
|
||||||
|
hmacUpdate(context, data, dataLen);
|
||||||
|
//Finalize the HMAC computation
|
||||||
|
hmacFinal(context, digest);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if (CRYPTO_STATIC_MEM_SUPPORT == DISABLED)
|
||||||
|
//Free previously allocated memory
|
||||||
|
cryptoFreeMem(context);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Return status code
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialize HMAC calculation
|
||||||
|
* @param[in] context Pointer to the HMAC context to initialize
|
||||||
|
* @param[in] hash Hash algorithm used to compute HMAC
|
||||||
|
* @param[in] key Key to use in the hash algorithm
|
||||||
|
* @param[in] keyLen Length of the key
|
||||||
|
* @return Error code
|
||||||
|
**/
|
||||||
|
|
||||||
|
__weak_func error_t hmacInit(HmacContext *context, const HashAlgo *hash,
|
||||||
|
const void *key, size_t keyLen)
|
||||||
|
{
|
||||||
|
uint_t i;
|
||||||
|
|
||||||
|
//Check parameters
|
||||||
|
if(context == NULL || hash == NULL)
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
//Make sure the supplied key is valid
|
||||||
|
if(key == NULL && keyLen != 0)
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
//Hash algorithm used to compute HMAC
|
||||||
|
context->hash = hash;
|
||||||
|
|
||||||
|
//The key is longer than the block size?
|
||||||
|
if(keyLen > hash->blockSize)
|
||||||
|
{
|
||||||
|
//Initialize the hash function context
|
||||||
|
hash->init(&context->hashContext);
|
||||||
|
//Digest the original key
|
||||||
|
hash->update(&context->hashContext, key, keyLen);
|
||||||
|
//Finalize the message digest computation
|
||||||
|
hash->final(&context->hashContext, context->key);
|
||||||
|
|
||||||
|
//Key is padded to the right with extra zeros
|
||||||
|
osMemset(context->key + hash->digestSize, 0,
|
||||||
|
hash->blockSize - hash->digestSize);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Copy the key
|
||||||
|
osMemcpy(context->key, key, keyLen);
|
||||||
|
//Key is padded to the right with extra zeros
|
||||||
|
osMemset(context->key + keyLen, 0, hash->blockSize - keyLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
//XOR the resulting key with ipad
|
||||||
|
for(i = 0; i < hash->blockSize; i++)
|
||||||
|
{
|
||||||
|
context->key[i] ^= HMAC_IPAD;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Initialize context for the first pass
|
||||||
|
hash->init(&context->hashContext);
|
||||||
|
//Start with the inner pad
|
||||||
|
hash->update(&context->hashContext, context->key, hash->blockSize);
|
||||||
|
|
||||||
|
//Successful initialization
|
||||||
|
return NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Update the HMAC context with a portion of the message being hashed
|
||||||
|
* @param[in] context Pointer to the HMAC context
|
||||||
|
* @param[in] data Pointer to the buffer being hashed
|
||||||
|
* @param[in] length Length of the buffer
|
||||||
|
**/
|
||||||
|
|
||||||
|
__weak_func void hmacUpdate(HmacContext *context, const void *data, size_t length)
|
||||||
|
{
|
||||||
|
const HashAlgo *hash;
|
||||||
|
|
||||||
|
//Hash algorithm used to compute HMAC
|
||||||
|
hash = context->hash;
|
||||||
|
//Digest the message (first pass)
|
||||||
|
hash->update(&context->hashContext, data, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Finish the HMAC calculation
|
||||||
|
* @param[in] context Pointer to the HMAC context
|
||||||
|
* @param[out] digest Calculated HMAC value (optional parameter)
|
||||||
|
**/
|
||||||
|
|
||||||
|
__weak_func void hmacFinal(HmacContext *context, uint8_t *digest)
|
||||||
|
{
|
||||||
|
uint_t i;
|
||||||
|
const HashAlgo *hash;
|
||||||
|
|
||||||
|
//Hash algorithm used to compute HMAC
|
||||||
|
hash = context->hash;
|
||||||
|
//Finish the first pass
|
||||||
|
hash->final(&context->hashContext, context->digest);
|
||||||
|
|
||||||
|
//XOR the original key with opad
|
||||||
|
for(i = 0; i < hash->blockSize; i++)
|
||||||
|
{
|
||||||
|
context->key[i] ^= HMAC_IPAD ^ HMAC_OPAD;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Initialize context for the second pass
|
||||||
|
hash->init(&context->hashContext);
|
||||||
|
//Start with outer pad
|
||||||
|
hash->update(&context->hashContext, context->key, hash->blockSize);
|
||||||
|
//Then digest the result of the first hash
|
||||||
|
hash->update(&context->hashContext, context->digest, hash->digestSize);
|
||||||
|
//Finish the second pass
|
||||||
|
hash->final(&context->hashContext, context->digest);
|
||||||
|
|
||||||
|
//Copy the resulting HMAC value
|
||||||
|
if(digest != NULL)
|
||||||
|
{
|
||||||
|
osMemcpy(digest, context->digest, hash->digestSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Release HMAC context
|
||||||
|
* @param[in] context Pointer to the HMAC context
|
||||||
|
**/
|
||||||
|
|
||||||
|
void hmacDeinit(HmacContext *context)
|
||||||
|
{
|
||||||
|
//Make sure the HMAC context is valid
|
||||||
|
if(context != NULL)
|
||||||
|
{
|
||||||
|
//Clear HMAC context
|
||||||
|
osMemset(context, 0, sizeof(HmacContext));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Finish the HMAC calculation (no padding added)
|
||||||
|
* @param[in] context Pointer to the HMAC context
|
||||||
|
* @param[out] digest Calculated HMAC value (optional parameter)
|
||||||
|
**/
|
||||||
|
|
||||||
|
void hmacFinalRaw(HmacContext *context, uint8_t *digest)
|
||||||
|
{
|
||||||
|
uint_t i;
|
||||||
|
const HashAlgo *hash;
|
||||||
|
|
||||||
|
//Hash algorithm used to compute HMAC
|
||||||
|
hash = context->hash;
|
||||||
|
|
||||||
|
//XOR the original key with opad
|
||||||
|
for(i = 0; i < hash->blockSize; i++)
|
||||||
|
{
|
||||||
|
context->key[i] ^= HMAC_IPAD ^ HMAC_OPAD;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Initialize context for the second pass
|
||||||
|
hash->init(&context->hashContext);
|
||||||
|
//Start with outer pad
|
||||||
|
hash->update(&context->hashContext, context->key, hash->blockSize);
|
||||||
|
//Then digest the result of the first hash
|
||||||
|
hash->update(&context->hashContext, context->digest, hash->digestSize);
|
||||||
|
//Finish the second pass
|
||||||
|
hash->final(&context->hashContext, context->digest);
|
||||||
|
|
||||||
|
//Copy the resulting HMAC value
|
||||||
|
if(digest != NULL)
|
||||||
|
{
|
||||||
|
osMemcpy(digest, context->digest, hash->digestSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
92
deps/cyclone/include/aead/gcm.h
vendored
Normal file
92
deps/cyclone/include/aead/gcm.h
vendored
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
/**
|
||||||
|
* @file gcm.h
|
||||||
|
* @brief Galois/Counter Mode (GCM)
|
||||||
|
*
|
||||||
|
* @section License
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010-2024 Oryx Embedded SARL. All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is part of CycloneCRYPTO Open.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* @author Oryx Embedded SARL (www.oryx-embedded.com)
|
||||||
|
* @version 2.4.4
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef _GCM_H
|
||||||
|
#define _GCM_H
|
||||||
|
|
||||||
|
//Dependencies
|
||||||
|
#include "core/crypto.h"
|
||||||
|
|
||||||
|
//Precalculated table width, in bits
|
||||||
|
#ifndef GCM_TABLE_W
|
||||||
|
#define GCM_TABLE_W 4
|
||||||
|
#elif (GCM_TABLE_W != 4 && GCM_TABLE_W != 8)
|
||||||
|
#error GCM_TABLE_W parameter is not valid
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//4-bit or 8-bit precalculated table?
|
||||||
|
#if (GCM_TABLE_W == 4)
|
||||||
|
#define GCM_TABLE_N 16
|
||||||
|
#define GCM_REVERSE_BITS(n) reverseInt4(n)
|
||||||
|
#else
|
||||||
|
#define GCM_TABLE_N 256
|
||||||
|
#define GCM_REVERSE_BITS(n) reverseInt8(n)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//C++ guard
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief GCM context
|
||||||
|
**/
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
const CipherAlgo *cipherAlgo; ///<Cipher algorithm
|
||||||
|
void *cipherContext; ///<Cipher algorithm context
|
||||||
|
uint32_t m[GCM_TABLE_N][4]; ///<Precalculated table
|
||||||
|
} GcmContext;
|
||||||
|
|
||||||
|
|
||||||
|
//GCM related functions
|
||||||
|
error_t gcmInit(GcmContext *context, const CipherAlgo *cipherAlgo,
|
||||||
|
void *cipherContext);
|
||||||
|
|
||||||
|
error_t gcmEncrypt(GcmContext *context, const uint8_t *iv,
|
||||||
|
size_t ivLen, const uint8_t *a, size_t aLen, const uint8_t *p,
|
||||||
|
uint8_t *c, size_t length, uint8_t *t, size_t tLen);
|
||||||
|
|
||||||
|
error_t gcmDecrypt(GcmContext *context, const uint8_t *iv,
|
||||||
|
size_t ivLen, const uint8_t *a, size_t aLen, const uint8_t *c,
|
||||||
|
uint8_t *p, size_t length, const uint8_t *t, size_t tLen);
|
||||||
|
|
||||||
|
void gcmMul(GcmContext *context, uint8_t *x);
|
||||||
|
void gcmXorBlock(uint8_t *x, const uint8_t *a, const uint8_t *b, size_t n);
|
||||||
|
void gcmIncCounter(uint8_t *ctr);
|
||||||
|
|
||||||
|
//C++ guard
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
103
deps/cyclone/include/cipher/aes.h
vendored
Normal file
103
deps/cyclone/include/cipher/aes.h
vendored
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
/**
|
||||||
|
* @file aes.h
|
||||||
|
* @brief AES (Advanced Encryption Standard)
|
||||||
|
*
|
||||||
|
* @section License
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010-2024 Oryx Embedded SARL. All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is part of CycloneCRYPTO Open.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* @author Oryx Embedded SARL (www.oryx-embedded.com)
|
||||||
|
* @version 2.4.4
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef _AES_H
|
||||||
|
#define _AES_H
|
||||||
|
|
||||||
|
//Dependencies
|
||||||
|
#include "core/crypto.h"
|
||||||
|
|
||||||
|
//Application specific context
|
||||||
|
#ifndef AES_PRIVATE_CONTEXT
|
||||||
|
#define AES_PRIVATE_CONTEXT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//AES block size
|
||||||
|
#define AES_BLOCK_SIZE 16
|
||||||
|
//Common interface for encryption algorithms
|
||||||
|
#define AES_CIPHER_ALGO (&aesCipherAlgo)
|
||||||
|
|
||||||
|
//C++ guard
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief AES algorithm context
|
||||||
|
**/
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint_t nr;
|
||||||
|
uint32_t ek[60];
|
||||||
|
uint32_t dk[60];
|
||||||
|
AES_PRIVATE_CONTEXT
|
||||||
|
} AesContext;
|
||||||
|
|
||||||
|
|
||||||
|
//AES related constants
|
||||||
|
extern const uint8_t AES128_ECB_OID[9];
|
||||||
|
extern const uint8_t AES128_CBC_OID[9];
|
||||||
|
extern const uint8_t AES128_OFB_OID[9];
|
||||||
|
extern const uint8_t AES128_CFB_OID[9];
|
||||||
|
extern const uint8_t AES128_GCM_OID[9];
|
||||||
|
extern const uint8_t AES128_CCM_OID[9];
|
||||||
|
extern const uint8_t AES192_ECB_OID[9];
|
||||||
|
extern const uint8_t AES192_CBC_OID[9];
|
||||||
|
extern const uint8_t AES192_OFB_OID[9];
|
||||||
|
extern const uint8_t AES192_CFB_OID[9];
|
||||||
|
extern const uint8_t AES192_GCM_OID[9];
|
||||||
|
extern const uint8_t AES192_CCM_OID[9];
|
||||||
|
extern const uint8_t AES256_ECB_OID[9];
|
||||||
|
extern const uint8_t AES256_CBC_OID[9];
|
||||||
|
extern const uint8_t AES256_OFB_OID[9];
|
||||||
|
extern const uint8_t AES256_CFB_OID[9];
|
||||||
|
extern const uint8_t AES256_GCM_OID[9];
|
||||||
|
extern const uint8_t AES256_CCM_OID[9];
|
||||||
|
extern const CipherAlgo aesCipherAlgo;
|
||||||
|
|
||||||
|
//AES related functions
|
||||||
|
error_t aesInit(AesContext *context, const uint8_t *key, size_t keyLen);
|
||||||
|
|
||||||
|
void aesEncryptBlock(AesContext *context, const uint8_t *input,
|
||||||
|
uint8_t *output);
|
||||||
|
|
||||||
|
void aesDecryptBlock(AesContext *context, const uint8_t *input,
|
||||||
|
uint8_t *output);
|
||||||
|
|
||||||
|
void aesDeinit(AesContext *context);
|
||||||
|
|
||||||
|
//C++ guard
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
54
deps/cyclone/include/cipher_modes/ecb.h
vendored
Normal file
54
deps/cyclone/include/cipher_modes/ecb.h
vendored
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
/**
|
||||||
|
* @file ecb.h
|
||||||
|
* @brief Electronic Codebook (ECB) mode
|
||||||
|
*
|
||||||
|
* @section License
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010-2024 Oryx Embedded SARL. All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is part of CycloneCRYPTO Open.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* @author Oryx Embedded SARL (www.oryx-embedded.com)
|
||||||
|
* @version 2.4.4
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef _ECB_H
|
||||||
|
#define _ECB_H
|
||||||
|
|
||||||
|
//Dependencies
|
||||||
|
#include "core/crypto.h"
|
||||||
|
|
||||||
|
//C++ guard
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//ECB encryption and decryption routines
|
||||||
|
error_t ecbEncrypt(const CipherAlgo *cipher, void *context,
|
||||||
|
const uint8_t *p, uint8_t *c, size_t length);
|
||||||
|
|
||||||
|
error_t ecbDecrypt(const CipherAlgo *cipher, void *context,
|
||||||
|
const uint8_t *c, uint8_t *p, size_t length);
|
||||||
|
|
||||||
|
//C++ guard
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
283
deps/cyclone/include/compiler_port.h
vendored
Normal file
283
deps/cyclone/include/compiler_port.h
vendored
Normal file
@@ -0,0 +1,283 @@
|
|||||||
|
/**
|
||||||
|
* @file compiler_port.h
|
||||||
|
* @brief Compiler specific definitions
|
||||||
|
*
|
||||||
|
* @section License
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010-2024 Oryx Embedded SARL. All rights reserved.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* @author Oryx Embedded SARL (www.oryx-embedded.com)
|
||||||
|
* @version 2.4.4
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef _COMPILER_PORT_H
|
||||||
|
#define _COMPILER_PORT_H
|
||||||
|
|
||||||
|
//Dependencies
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
|
//ARM compiler V6?
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
|
||||||
|
#include <stdarg.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//C++ guard
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Types
|
||||||
|
typedef char char_t;
|
||||||
|
typedef signed int int_t;
|
||||||
|
typedef unsigned int uint_t;
|
||||||
|
|
||||||
|
#if !defined(R_TYPEDEFS_H) && !defined(USE_CHIBIOS_2)
|
||||||
|
typedef int bool_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//ARM compiler?
|
||||||
|
#if defined(__CC_ARM)
|
||||||
|
#undef PRIu8
|
||||||
|
#undef PRIu16
|
||||||
|
#define PRIu8 "u"
|
||||||
|
#define PRIu16 "u"
|
||||||
|
#define PRIuSIZE "u"
|
||||||
|
#define PRIXSIZE "X"
|
||||||
|
#define PRIuTIME "lu"
|
||||||
|
//Microchip XC32 compiler?
|
||||||
|
#elif defined(__XC32)
|
||||||
|
#if defined(__C32_LEGACY_LIBC__)
|
||||||
|
#define PRIuSIZE "lu"
|
||||||
|
#define PRIXSIZE "lX"
|
||||||
|
#define PRIuTIME "lu"
|
||||||
|
#else
|
||||||
|
#define PRIuSIZE "u"
|
||||||
|
#define PRIXSIZE "X"
|
||||||
|
#define PRIuTIME "u"
|
||||||
|
#endif
|
||||||
|
//NXP MCUXpresso compiler?
|
||||||
|
#elif defined(__MCUXPRESSO)
|
||||||
|
#undef PRIu64
|
||||||
|
#define PRIu64 "llu"
|
||||||
|
#define PRIuSIZE "u"
|
||||||
|
#define PRIXSIZE "X"
|
||||||
|
#define PRIuTIME "lu"
|
||||||
|
//NXP CodeWarrior compiler?
|
||||||
|
#elif defined(__CWCC__)
|
||||||
|
#define PRIu8 "u"
|
||||||
|
#define PRIu16 "u"
|
||||||
|
#define PRIu32 "u"
|
||||||
|
#define PRIx8 "x"
|
||||||
|
#define PRIx16 "x"
|
||||||
|
#define PRIx32 "x"
|
||||||
|
#define PRIX8 "X"
|
||||||
|
#define PRIX16 "X"
|
||||||
|
#define PRIX32 "X"
|
||||||
|
#define PRIuSIZE "u"
|
||||||
|
#define PRIXSIZE "X"
|
||||||
|
#define PRIuTIME "u"
|
||||||
|
//Espressif ESP-IDF compiler?
|
||||||
|
#elif defined(IDF_VER)
|
||||||
|
#undef PRIu8
|
||||||
|
#undef PRIu16
|
||||||
|
#undef PRIx8
|
||||||
|
#undef PRIx16
|
||||||
|
#undef PRIX8
|
||||||
|
#undef PRIX16
|
||||||
|
#define PRIu8 "u"
|
||||||
|
#define PRIu16 "u"
|
||||||
|
#define PRIx8 "x"
|
||||||
|
#define PRIx16 "x"
|
||||||
|
#define PRIX8 "X"
|
||||||
|
#define PRIX16 "X"
|
||||||
|
#define PRIuSIZE "u"
|
||||||
|
#define PRIXSIZE "X"
|
||||||
|
#define PRIuTIME "lu"
|
||||||
|
//Linux/FreeBSD GCC compiler
|
||||||
|
#elif defined(__linux__) || defined(__FreeBSD__)
|
||||||
|
#define PRIuSIZE "zu"
|
||||||
|
#define PRIXSIZE "zX"
|
||||||
|
#define PRIuTIME "lu"
|
||||||
|
//Win32 compiler?
|
||||||
|
#elif defined(_WIN32)
|
||||||
|
#define PRIuSIZE "Iu"
|
||||||
|
#define PRIXSIZE "IX"
|
||||||
|
#define PRIuTIME "lu"
|
||||||
|
//GCC compiler (with newlib-nano runtime library)?
|
||||||
|
#elif defined(__GNUC__) && defined(_NANO_FORMATTED_IO) && (_NANO_FORMATTED_IO != 0)
|
||||||
|
#undef PRIu8
|
||||||
|
#undef PRIu16
|
||||||
|
#undef PRIx8
|
||||||
|
#undef PRIx16
|
||||||
|
#undef PRIX8
|
||||||
|
#undef PRIX16
|
||||||
|
#define PRIu8 "u"
|
||||||
|
#define PRIu16 "u"
|
||||||
|
#define PRIx8 "x"
|
||||||
|
#define PRIx16 "x"
|
||||||
|
#define PRIX8 "X"
|
||||||
|
#define PRIX16 "X"
|
||||||
|
#define PRIuSIZE "u"
|
||||||
|
#define PRIXSIZE "X"
|
||||||
|
#define PRIuTIME "u"
|
||||||
|
//GCC compiler (with newlib-standard runtime library)?
|
||||||
|
#else
|
||||||
|
#define PRIuSIZE "u"
|
||||||
|
#define PRIXSIZE "X"
|
||||||
|
#define PRIuTIME "lu"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//ARM compiler V6?
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
|
||||||
|
int vsnprintf(char *dest, size_t size, const char *format, va_list ap);
|
||||||
|
char *strtok_r(char *s, const char *delim, char **last);
|
||||||
|
//GCC compiler (for PowerPC architecture)?
|
||||||
|
#elif defined(__GNUC__) && defined(__PPC_EABI__)
|
||||||
|
typedef uint32_t time_t;
|
||||||
|
int strcasecmp(const char *s1, const char *s2);
|
||||||
|
int strncasecmp(const char *s1, const char *s2, size_t n);
|
||||||
|
char *strtok_r(char *s, const char *delim, char **last);
|
||||||
|
//GCC compiler?
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
int strcasecmp(const char *s1, const char *s2);
|
||||||
|
int strncasecmp(const char *s1, const char *s2, size_t n);
|
||||||
|
char *strtok_r(char *s, const char *delim, char **last);
|
||||||
|
//Tasking compiler?
|
||||||
|
#elif defined(__TASKING__)
|
||||||
|
char *strtok_r(char *s, const char *delim, char **last);
|
||||||
|
//Microchip XC32 compiler?
|
||||||
|
#elif defined(__XC32)
|
||||||
|
#define sprintf _sprintf
|
||||||
|
int sprintf(char *str, const char *format, ...);
|
||||||
|
int strcasecmp(const char *s1, const char *s2);
|
||||||
|
int strncasecmp(const char *s1, const char *s2, size_t n);
|
||||||
|
char *strtok_r(char *s, const char *delim, char **last);
|
||||||
|
//NXP CodeWarrior compiler?
|
||||||
|
#elif defined(__CWCC__)
|
||||||
|
typedef uint32_t time_t;
|
||||||
|
int strcasecmp(const char *s1, const char *s2);
|
||||||
|
int strncasecmp(const char *s1, const char *s2, size_t n);
|
||||||
|
char *strtok_r(char *s, const char *delim, char **last);
|
||||||
|
//Renesas CC-RX compiler?
|
||||||
|
#elif defined(__CCRX__)
|
||||||
|
int strcasecmp(const char *s1, const char *s2);
|
||||||
|
int strncasecmp(const char *s1, const char *s2, size_t n);
|
||||||
|
char *strtok_r(char *s, const char *delim, char **last);
|
||||||
|
//TI ARM compiler?
|
||||||
|
#elif defined(__TI_ARM__)
|
||||||
|
int strcasecmp(const char *s1, const char *s2);
|
||||||
|
int strncasecmp(const char *s1, const char *s2, size_t n);
|
||||||
|
char *strtok_r(char *s, const char *delim, char **last);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//ARM compiler V6?
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
|
||||||
|
#undef __packed_struct
|
||||||
|
#define __packed_struct struct __attribute__((packed))
|
||||||
|
#undef __packed_union
|
||||||
|
#define __packed_union union __attribute__((packed))
|
||||||
|
//GCC compiler?
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
#undef __packed_struct
|
||||||
|
#define __packed_struct struct __attribute__((__packed__))
|
||||||
|
#undef __packed_union
|
||||||
|
#define __packed_union union __attribute__((__packed__))
|
||||||
|
//ARM compiler?
|
||||||
|
#elif defined(__CC_ARM)
|
||||||
|
#pragma anon_unions
|
||||||
|
#undef __packed_struct
|
||||||
|
#define __packed_struct __packed struct
|
||||||
|
#undef __packed_union
|
||||||
|
#define __packed_union __packed union
|
||||||
|
//IAR compiler?
|
||||||
|
#elif defined(__IAR_SYSTEMS_ICC__)
|
||||||
|
#undef __packed_struct
|
||||||
|
#define __packed_struct __packed struct
|
||||||
|
#undef __packed_union
|
||||||
|
#define __packed_union __packed union
|
||||||
|
//Tasking compiler?
|
||||||
|
#elif defined(__TASKING__)
|
||||||
|
#undef __packed_struct
|
||||||
|
#define __packed_struct struct __packed__
|
||||||
|
#undef __packed_union
|
||||||
|
#define __packed_union union __packed__
|
||||||
|
//NXP CodeWarrior compiler?
|
||||||
|
#elif defined(__CWCC__)
|
||||||
|
#undef __packed_struct
|
||||||
|
#define __packed_struct struct
|
||||||
|
#undef __packed_union
|
||||||
|
#define __packed_union union
|
||||||
|
//Renesas CC-RX compiler?
|
||||||
|
#elif defined(__CCRX__)
|
||||||
|
#undef __packed_struct
|
||||||
|
#define __packed_struct struct
|
||||||
|
#undef __packed_union
|
||||||
|
#define __packed_union union
|
||||||
|
//TI ARM compiler?
|
||||||
|
#elif defined(__TI_ARM__)
|
||||||
|
#undef __packed_struct
|
||||||
|
#define __packed_struct struct __attribute__((__packed__))
|
||||||
|
#undef __packed_union
|
||||||
|
#define __packed_union union __attribute__((__packed__))
|
||||||
|
//Win32 compiler?
|
||||||
|
#elif defined(_WIN32)
|
||||||
|
#undef interface
|
||||||
|
#undef __packed_struct
|
||||||
|
#define __packed_struct struct
|
||||||
|
#undef __packed_union
|
||||||
|
#define __packed_union union
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __weak_func
|
||||||
|
//ARM compiler V6?
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
|
||||||
|
#define __weak_func __attribute__((weak))
|
||||||
|
//GCC compiler?
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
#define __weak_func __attribute__((weak))
|
||||||
|
//ARM compiler?
|
||||||
|
#elif defined(__CC_ARM)
|
||||||
|
#define __weak_func __weak
|
||||||
|
//IAR compiler?
|
||||||
|
#elif defined(__IAR_SYSTEMS_ICC__)
|
||||||
|
#define __weak_func __weak
|
||||||
|
//Tasking compiler?
|
||||||
|
#elif defined(__TASKING__)
|
||||||
|
#define __weak_func __attribute__((weak))
|
||||||
|
//NXP CodeWarrior compiler?
|
||||||
|
#elif defined(__CWCC__)
|
||||||
|
#define __weak_func
|
||||||
|
//Renesas CC-RX compiler?
|
||||||
|
#elif defined(__CCRX__)
|
||||||
|
#define __weak_func
|
||||||
|
//TI ARM compiler?
|
||||||
|
#elif defined(__TI_ARM__)
|
||||||
|
#define __weak_func __attribute__((weak))
|
||||||
|
//Win32 compiler?
|
||||||
|
#elif defined(_WIN32)
|
||||||
|
#define __weak_func
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//C++ guard
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
1119
deps/cyclone/include/core/crypto.h
vendored
Normal file
1119
deps/cyclone/include/core/crypto.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
68
deps/cyclone/include/core/crypto_legacy.h
vendored
Normal file
68
deps/cyclone/include/core/crypto_legacy.h
vendored
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
/**
|
||||||
|
* @file crypto_legacy.h
|
||||||
|
* @brief Legacy definitions
|
||||||
|
*
|
||||||
|
* @section License
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010-2024 Oryx Embedded SARL. All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is part of CycloneCRYPTO Open.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* @author Oryx Embedded SARL (www.oryx-embedded.com)
|
||||||
|
* @version 2.4.4
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef _CRYPTO_LEGACY_H
|
||||||
|
#define _CRYPTO_LEGACY_H
|
||||||
|
|
||||||
|
//Deprecated functions
|
||||||
|
#define mpiReadRaw(r, data, length) mpiImport(r, data, length, MPI_FORMAT_BIG_ENDIAN)
|
||||||
|
#define mpiWriteRaw(a, data, length) mpiExport(a, data, length, MPI_FORMAT_BIG_ENDIAN)
|
||||||
|
|
||||||
|
#ifdef CURVE25519_SUPPORT
|
||||||
|
#define X25519_SUPPORT CURVE25519_SUPPORT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CURVE448_SUPPORT
|
||||||
|
#define X448_SUPPORT CURVE448_SUPPORT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ecdsaGenerateKeyPair ecGenerateKeyPair
|
||||||
|
#define ecdsaGeneratePrivateKey ecGeneratePrivateKey
|
||||||
|
#define ecdsaGeneratePublicKey ecGeneratePublicKey
|
||||||
|
|
||||||
|
#define MAX_HASH_CONTEXT_SIZE sizeof(HashContext)
|
||||||
|
#define MAX_CIPHER_CONTEXT_SIZE sizeof(CipherContext)
|
||||||
|
|
||||||
|
#ifdef SAMD51_CRYPTO_PUKCC_SUPPORT
|
||||||
|
#define SAMD51_CRYPTO_PKC_SUPPORT SAMD51_CRYPTO_PUKCC_SUPPORT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SAME54_CRYPTO_PUKCC_SUPPORT
|
||||||
|
#define SAME54_CRYPTO_PKC_SUPPORT SAME54_CRYPTO_PUKCC_SUPPORT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define yarrowRelease yarrowDeinit
|
||||||
|
|
||||||
|
#define X509CertificateInfo X509CertInfo
|
||||||
|
#define X509SignatureAlgoId X509SignAlgoId
|
||||||
|
|
||||||
|
#define EddsaMessageChunk DataChunk
|
||||||
|
|
||||||
|
#endif
|
||||||
481
deps/cyclone/include/cpu_endian.h
vendored
Normal file
481
deps/cyclone/include/cpu_endian.h
vendored
Normal file
@@ -0,0 +1,481 @@
|
|||||||
|
/**
|
||||||
|
* @file cpu_endian.h
|
||||||
|
* @brief Byte order conversion
|
||||||
|
*
|
||||||
|
* @section License
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010-2024 Oryx Embedded SARL. All rights reserved.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* @author Oryx Embedded SARL (www.oryx-embedded.com)
|
||||||
|
* @version 2.4.4
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef _CPU_ENDIAN_H
|
||||||
|
#define _CPU_ENDIAN_H
|
||||||
|
|
||||||
|
//Dependencies
|
||||||
|
#include "os_port.h"
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
|
//Undefine conflicting definitions
|
||||||
|
#ifdef HTONS
|
||||||
|
#undef HTONS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HTONL
|
||||||
|
#undef HTONL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HTONLL
|
||||||
|
#undef HTONLL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef htons
|
||||||
|
#undef htons
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef htonl
|
||||||
|
#undef htonl
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef htonll
|
||||||
|
#undef htonll
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef NTOHS
|
||||||
|
#undef NTOHS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef NTOHL
|
||||||
|
#undef NTOHL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef NTOHLL
|
||||||
|
#undef NTOHLL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ntohs
|
||||||
|
#undef ntohs
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ntohl
|
||||||
|
#undef ntohl
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ntohll
|
||||||
|
#undef ntohll
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HTOLE16
|
||||||
|
#undef HTOLE16
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HTOLE32
|
||||||
|
#undef HTOLE32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HTOLE64
|
||||||
|
#undef HTOLE64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef htole16
|
||||||
|
#undef htole16
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef htole32
|
||||||
|
#undef htole32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef htole64
|
||||||
|
#undef htole64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef LETOH16
|
||||||
|
#undef LETOH16
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef LETOH32
|
||||||
|
#undef LETOH32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef LETOH64
|
||||||
|
#undef LETOH64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef letoh16
|
||||||
|
#undef letoh16
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef letoh32
|
||||||
|
#undef letoh32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef letoh64
|
||||||
|
#undef letoh64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HTOBE16
|
||||||
|
#undef HTOBE16
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HTOBE32
|
||||||
|
#undef HTOBE32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HTOBE64
|
||||||
|
#undef HTOBE64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef htobe16
|
||||||
|
#undef htobe16
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef htobe32
|
||||||
|
#undef htobe32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef htobe64
|
||||||
|
#undef htobe64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETOH16
|
||||||
|
#undef BETOH16
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETOH32
|
||||||
|
#undef BETOH32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETOH64
|
||||||
|
#undef BETOH64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef betoh16
|
||||||
|
#undef betoh16
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef betoh32
|
||||||
|
#undef betoh32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef betoh64
|
||||||
|
#undef betoh64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Load unaligned 16-bit integer (little-endian encoding)
|
||||||
|
#define LOAD16LE(p) ( \
|
||||||
|
((uint16_t)(((uint8_t *)(p))[0]) << 0) | \
|
||||||
|
((uint16_t)(((uint8_t *)(p))[1]) << 8))
|
||||||
|
|
||||||
|
//Load unaligned 16-bit integer (big-endian encoding)
|
||||||
|
#define LOAD16BE(p) ( \
|
||||||
|
((uint16_t)(((uint8_t *)(p))[0]) << 8) | \
|
||||||
|
((uint16_t)(((uint8_t *)(p))[1]) << 0))
|
||||||
|
|
||||||
|
//Load unaligned 24-bit integer (little-endian encoding)
|
||||||
|
#define LOAD24LE(p) ( \
|
||||||
|
((uint32_t)(((uint8_t *)(p))[0]) << 0)| \
|
||||||
|
((uint32_t)(((uint8_t *)(p))[1]) << 8) | \
|
||||||
|
((uint32_t)(((uint8_t *)(p))[2]) << 16))
|
||||||
|
|
||||||
|
//Load unaligned 24-bit integer (big-endian encoding)
|
||||||
|
#define LOAD24BE(p) ( \
|
||||||
|
((uint32_t)(((uint8_t *)(p))[0]) << 16) | \
|
||||||
|
((uint32_t)(((uint8_t *)(p))[1]) << 8) | \
|
||||||
|
((uint32_t)(((uint8_t *)(p))[2]) << 0))
|
||||||
|
|
||||||
|
//Load unaligned 32-bit integer (little-endian encoding)
|
||||||
|
#define LOAD32LE(p) ( \
|
||||||
|
((uint32_t)(((uint8_t *)(p))[0]) << 0) | \
|
||||||
|
((uint32_t)(((uint8_t *)(p))[1]) << 8) | \
|
||||||
|
((uint32_t)(((uint8_t *)(p))[2]) << 16) | \
|
||||||
|
((uint32_t)(((uint8_t *)(p))[3]) << 24))
|
||||||
|
|
||||||
|
//Load unaligned 32-bit integer (big-endian encoding)
|
||||||
|
#define LOAD32BE(p) ( \
|
||||||
|
((uint32_t)(((uint8_t *)(p))[0]) << 24) | \
|
||||||
|
((uint32_t)(((uint8_t *)(p))[1]) << 16) | \
|
||||||
|
((uint32_t)(((uint8_t *)(p))[2]) << 8) | \
|
||||||
|
((uint32_t)(((uint8_t *)(p))[3]) << 0))
|
||||||
|
|
||||||
|
//Load unaligned 48-bit integer (little-endian encoding)
|
||||||
|
#define LOAD48LE(p) ( \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[0]) << 0) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[1]) << 8) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[2]) << 16) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[3]) << 24) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[4]) << 32) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[5]) << 40)
|
||||||
|
|
||||||
|
//Load unaligned 48-bit integer (big-endian encoding)
|
||||||
|
#define LOAD48BE(p) ( \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[0]) << 40) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[1]) << 32) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[2]) << 24) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[3]) << 16) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[4]) << 8) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[5]) << 0))
|
||||||
|
|
||||||
|
//Load unaligned 64-bit integer (little-endian encoding)
|
||||||
|
#define LOAD64LE(p) ( \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[0]) << 0) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[1]) << 8) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[2]) << 16) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[3]) << 24) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[4]) << 32) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[5]) << 40) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[6]) << 48) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[7]) << 56))
|
||||||
|
|
||||||
|
//Load unaligned 64-bit integer (big-endian encoding)
|
||||||
|
#define LOAD64BE(p) ( \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[0]) << 56) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[1]) << 48) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[2]) << 40) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[3]) << 32) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[4]) << 24) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[5]) << 16) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[6]) << 8) | \
|
||||||
|
((uint64_t)(((uint8_t *)(p))[7]) << 0))
|
||||||
|
|
||||||
|
//Store unaligned 16-bit integer (little-endian encoding)
|
||||||
|
#define STORE16LE(a, p) \
|
||||||
|
((uint8_t *)(p))[0] = ((uint16_t)(a) >> 0) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[1] = ((uint16_t)(a) >> 8) & 0xFFU
|
||||||
|
|
||||||
|
//Store unaligned 16-bit integer (big-endian encoding)
|
||||||
|
#define STORE16BE(a, p) \
|
||||||
|
((uint8_t *)(p))[0] = ((uint16_t)(a) >> 8) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[1] = ((uint16_t)(a) >> 0) & 0xFFU
|
||||||
|
|
||||||
|
//Store unaligned 24-bit integer (little-endian encoding)
|
||||||
|
#define STORE24LE(a, p) \
|
||||||
|
((uint8_t *)(p))[0] = ((uint32_t)(a) >> 0) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[1] = ((uint32_t)(a) >> 8) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[2] = ((uint32_t)(a) >> 16) & 0xFFU
|
||||||
|
|
||||||
|
//Store unaligned 24-bit integer (big-endian encoding)
|
||||||
|
#define STORE24BE(a, p) \
|
||||||
|
((uint8_t *)(p))[0] = ((uint32_t)(a) >> 16) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[1] = ((uint32_t)(a) >> 8) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[2] = ((uint32_t)(a) >> 0) & 0xFFU
|
||||||
|
|
||||||
|
//Store unaligned 32-bit integer (little-endian encoding)
|
||||||
|
#define STORE32LE(a, p) \
|
||||||
|
((uint8_t *)(p))[0] = ((uint32_t)(a) >> 0) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[1] = ((uint32_t)(a) >> 8) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[2] = ((uint32_t)(a) >> 16) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[3] = ((uint32_t)(a) >> 24) & 0xFFU
|
||||||
|
|
||||||
|
//Store unaligned 32-bit integer (big-endian encoding)
|
||||||
|
#define STORE32BE(a, p) \
|
||||||
|
((uint8_t *)(p))[0] = ((uint32_t)(a) >> 24) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[1] = ((uint32_t)(a) >> 16) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[2] = ((uint32_t)(a) >> 8) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[3] = ((uint32_t)(a) >> 0) & 0xFFU
|
||||||
|
|
||||||
|
//Store unaligned 48-bit integer (little-endian encoding)
|
||||||
|
#define STORE48LE(a, p) \
|
||||||
|
((uint8_t *)(p))[0] = ((uint64_t)(a) >> 0) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[1] = ((uint64_t)(a) >> 8) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[2] = ((uint64_t)(a) >> 16) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[3] = ((uint64_t)(a) >> 24) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[4] = ((uint64_t)(a) >> 32) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[5] = ((uint64_t)(a) >> 40) & 0xFFU,
|
||||||
|
|
||||||
|
//Store unaligned 48-bit integer (big-endian encoding)
|
||||||
|
#define STORE48BE(a, p) \
|
||||||
|
((uint8_t *)(p))[0] = ((uint64_t)(a) >> 40) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[1] = ((uint64_t)(a) >> 32) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[2] = ((uint64_t)(a) >> 24) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[3] = ((uint64_t)(a) >> 16) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[4] = ((uint64_t)(a) >> 8) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[5] = ((uint64_t)(a) >> 0) & 0xFFU
|
||||||
|
|
||||||
|
//Store unaligned 64-bit integer (little-endian encoding)
|
||||||
|
#define STORE64LE(a, p) \
|
||||||
|
((uint8_t *)(p))[0] = ((uint64_t)(a) >> 0) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[1] = ((uint64_t)(a) >> 8) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[2] = ((uint64_t)(a) >> 16) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[3] = ((uint64_t)(a) >> 24) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[4] = ((uint64_t)(a) >> 32) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[5] = ((uint64_t)(a) >> 40) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[6] = ((uint64_t)(a) >> 48) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[7] = ((uint64_t)(a) >> 56) & 0xFFU
|
||||||
|
|
||||||
|
//Store unaligned 64-bit integer (big-endian encoding)
|
||||||
|
#define STORE64BE(a, p) \
|
||||||
|
((uint8_t *)(p))[0] = ((uint64_t)(a) >> 56) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[1] = ((uint64_t)(a) >> 48) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[2] = ((uint64_t)(a) >> 40) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[3] = ((uint64_t)(a) >> 32) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[4] = ((uint64_t)(a) >> 24) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[5] = ((uint64_t)(a) >> 16) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[6] = ((uint64_t)(a) >> 8) & 0xFFU, \
|
||||||
|
((uint8_t *)(p))[7] = ((uint64_t)(a) >> 0) & 0xFFU
|
||||||
|
|
||||||
|
//Swap a 16-bit integer
|
||||||
|
#define SWAPINT16(x) ( \
|
||||||
|
(((uint16_t)(x) & 0x00FFU) << 8) | \
|
||||||
|
(((uint16_t)(x) & 0xFF00U) >> 8))
|
||||||
|
|
||||||
|
//Swap a 32-bit integer
|
||||||
|
#define SWAPINT32(x) ( \
|
||||||
|
(((uint32_t)(x) & 0x000000FFUL) << 24) | \
|
||||||
|
(((uint32_t)(x) & 0x0000FF00UL) << 8) | \
|
||||||
|
(((uint32_t)(x) & 0x00FF0000UL) >> 8) | \
|
||||||
|
(((uint32_t)(x) & 0xFF000000UL) >> 24))
|
||||||
|
|
||||||
|
//Swap a 64-bit integer
|
||||||
|
#define SWAPINT64(x) ( \
|
||||||
|
(((uint64_t)(x) & 0x00000000000000FFULL) << 56) | \
|
||||||
|
(((uint64_t)(x) & 0x000000000000FF00ULL) << 40) | \
|
||||||
|
(((uint64_t)(x) & 0x0000000000FF0000ULL) << 24) | \
|
||||||
|
(((uint64_t)(x) & 0x00000000FF000000ULL) << 8) | \
|
||||||
|
(((uint64_t)(x) & 0x000000FF00000000ULL) >> 8) | \
|
||||||
|
(((uint64_t)(x) & 0x0000FF0000000000ULL) >> 24) | \
|
||||||
|
(((uint64_t)(x) & 0x00FF000000000000ULL) >> 40) | \
|
||||||
|
(((uint64_t)(x) & 0xFF00000000000000ULL) >> 56))
|
||||||
|
|
||||||
|
//Big-endian machine?
|
||||||
|
#if (__BYTE_ORDER == __BIG_ENDIAN)
|
||||||
|
//Host byte order to network byte order
|
||||||
|
#define HTONS(value) (value)
|
||||||
|
#define HTONL(value) (value)
|
||||||
|
#define HTONLL(value) (value)
|
||||||
|
#define htons(value) ((uint16_t) (value))
|
||||||
|
#define htonl(value) ((uint32_t) (value))
|
||||||
|
#define htonll(value) ((uint64_t) (value))
|
||||||
|
|
||||||
|
//Network byte order to host byte order
|
||||||
|
#define NTOHS(value) (value)
|
||||||
|
#define NTOHL(value) (value)
|
||||||
|
#define NTOHLL(value) (value)
|
||||||
|
#define ntohs(value) ((uint16_t) (value))
|
||||||
|
#define ntohl(value) ((uint32_t) (value))
|
||||||
|
#define ntohll(value) ((uint64_t) (value))
|
||||||
|
|
||||||
|
//Host byte order to little-endian byte order
|
||||||
|
#define HTOLE16(value) SWAPINT16(value)
|
||||||
|
#define HTOLE32(value) SWAPINT32(value)
|
||||||
|
#define HTOLE64(value) SWAPINT64(value)
|
||||||
|
#define htole16(value) swapInt16((uint16_t) (value))
|
||||||
|
#define htole32(value) swapInt32((uint32_t) (value))
|
||||||
|
#define htole64(value) swapInt64((uint64_t) (value))
|
||||||
|
|
||||||
|
//Little-endian byte order to host byte order
|
||||||
|
#define LETOH16(value) SWAPINT16(value)
|
||||||
|
#define LETOH32(value) SWAPINT32(value)
|
||||||
|
#define LETOH64(value) SWAPINT64(value)
|
||||||
|
#define letoh16(value) swapInt16((uint16_t) (value))
|
||||||
|
#define letoh32(value) swapInt32((uint32_t) (value))
|
||||||
|
#define letoh64(value) swapInt64((uint64_t) (value))
|
||||||
|
|
||||||
|
//Host byte order to big-endian byte order
|
||||||
|
#define HTOBE16(value) (value)
|
||||||
|
#define HTOBE32(value) (value)
|
||||||
|
#define HTOBE64(value) (value)
|
||||||
|
#define htobe16(value) ((uint16_t) (value))
|
||||||
|
#define htobe32(value) ((uint32_t) (value))
|
||||||
|
#define htobe64(value) ((uint64_t) (value))
|
||||||
|
|
||||||
|
//Big-endian byte order to host byte order
|
||||||
|
#define BETOH16(value) (value)
|
||||||
|
#define BETOH32(value) (value)
|
||||||
|
#define BETOH64(value) (value)
|
||||||
|
#define betoh16(value) ((uint16_t) (value))
|
||||||
|
#define betoh32(value) ((uint32_t) (value))
|
||||||
|
#define betoh64(value) ((uint64_t) (value))
|
||||||
|
|
||||||
|
//Little-endian machine?
|
||||||
|
#else
|
||||||
|
|
||||||
|
//Host byte order to network byte order
|
||||||
|
#define HTONS(value) SWAPINT16(value)
|
||||||
|
#define HTONL(value) SWAPINT32(value)
|
||||||
|
#define HTONLL(value) SWAPINT64(value)
|
||||||
|
#define htons(value) swapInt16((uint16_t) (value))
|
||||||
|
#define htonl(value) swapInt32((uint32_t) (value))
|
||||||
|
#define htonll(value) swapInt64((uint64_t) (value))
|
||||||
|
|
||||||
|
//Network byte order to host byte order
|
||||||
|
#define NTOHS(value) SWAPINT16(value)
|
||||||
|
#define NTOHL(value) SWAPINT32(value)
|
||||||
|
#define NTOHLL(value) SWAPINT64(value)
|
||||||
|
#define ntohs(value) swapInt16((uint16_t) (value))
|
||||||
|
#define ntohl(value) swapInt32((uint32_t) (value))
|
||||||
|
#define ntohll(value) swapInt64((uint64_t) (value))
|
||||||
|
|
||||||
|
//Host byte order to little-endian byte order
|
||||||
|
#define HTOLE16(value) (value)
|
||||||
|
#define HTOLE32(value) (value)
|
||||||
|
#define HTOLE64(value) (value)
|
||||||
|
#define htole16(value) ((uint16_t) (value))
|
||||||
|
#define htole32(value) ((uint32_t) (value))
|
||||||
|
#define htole64(value) ((uint64_t) (value))
|
||||||
|
|
||||||
|
//Little-endian byte order to host byte order
|
||||||
|
#define LETOH16(value) (value)
|
||||||
|
#define LETOH32(value) (value)
|
||||||
|
#define LETOH64(value) (value)
|
||||||
|
#define letoh16(value) ((uint16_t) (value))
|
||||||
|
#define letoh32(value) ((uint32_t) (value))
|
||||||
|
#define letoh64(value) ((uint64_t) (value))
|
||||||
|
|
||||||
|
//Host byte order to big-endian byte order
|
||||||
|
#define HTOBE16(value) SWAPINT16(value)
|
||||||
|
#define HTOBE32(value) SWAPINT32(value)
|
||||||
|
#define HTOBE64(value) SWAPINT64(value)
|
||||||
|
#define htobe16(value) swapInt16((uint16_t) (value))
|
||||||
|
#define htobe32(value) swapInt32((uint32_t) (value))
|
||||||
|
#define htobe64(value) swapInt64((uint64_t) (value))
|
||||||
|
|
||||||
|
//Big-endian byte order to host byte order
|
||||||
|
#define BETOH16(value) SWAPINT16(value)
|
||||||
|
#define BETOH32(value) SWAPINT32(value)
|
||||||
|
#define BETOH64(value) SWAPINT64(value)
|
||||||
|
#define betoh16(value) swapInt16((uint16_t) (value))
|
||||||
|
#define betoh32(value) swapInt32((uint32_t) (value))
|
||||||
|
#define betoh64(value) swapInt64((uint64_t) (value))
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//C++ guard
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Byte order conversion functions
|
||||||
|
uint16_t swapInt16(uint16_t value);
|
||||||
|
uint32_t swapInt32(uint32_t value);
|
||||||
|
uint64_t swapInt64(uint64_t value);
|
||||||
|
|
||||||
|
//Bit reversal functions
|
||||||
|
uint8_t reverseInt4(uint8_t value);
|
||||||
|
uint8_t reverseInt8(uint8_t value);
|
||||||
|
uint16_t reverseInt16(uint16_t value);
|
||||||
|
uint32_t reverseInt32(uint32_t value);
|
||||||
|
uint64_t reverseInt64(uint64_t value);
|
||||||
|
|
||||||
|
//C++ guard
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
7
deps/cyclone/include/crypto_config.h
vendored
Normal file
7
deps/cyclone/include/crypto_config.h
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#include "os_port.h"
|
||||||
|
|
||||||
|
#define HKDF_SUPPORT ENABLED
|
||||||
|
#define SHA256_SUPPORT ENABLED
|
||||||
|
#define AES_SUPPORT ENABLED
|
||||||
|
#define ECB_SUPPORT ENABLED
|
||||||
|
#define GCM_SUPPORT ENABLED
|
||||||
320
deps/cyclone/include/error.h
vendored
Normal file
320
deps/cyclone/include/error.h
vendored
Normal file
@@ -0,0 +1,320 @@
|
|||||||
|
/**
|
||||||
|
* @file error.h
|
||||||
|
* @brief Error codes description
|
||||||
|
*
|
||||||
|
* @section License
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010-2024 Oryx Embedded SARL. All rights reserved.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* @author Oryx Embedded SARL (www.oryx-embedded.com)
|
||||||
|
* @version 2.4.4
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef _ERROR_H
|
||||||
|
#define _ERROR_H
|
||||||
|
|
||||||
|
//C++ guard
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Error codes
|
||||||
|
**/
|
||||||
|
|
||||||
|
typedef enum cyc_error_st
|
||||||
|
{
|
||||||
|
NO_ERROR = 0, ///<Success
|
||||||
|
ERROR_FAILURE = 1, ///<Generic error code
|
||||||
|
|
||||||
|
ERROR_INVALID_PARAMETER, ///<Invalid parameter
|
||||||
|
ERROR_PARAMETER_OUT_OF_RANGE, ///<Specified parameter is out of range
|
||||||
|
|
||||||
|
ERROR_BAD_CRC,
|
||||||
|
ERROR_BAD_BLOCK,
|
||||||
|
ERROR_INVALID_RECIPIENT, ///<Invalid recipient
|
||||||
|
ERROR_INVALID_INTERFACE, ///<Invalid interface
|
||||||
|
ERROR_INVALID_ENDPOINT, ///<Invalid endpoint
|
||||||
|
ERROR_INVALID_ALT_SETTING, ///<Alternate setting does not exist
|
||||||
|
ERROR_UNSUPPORTED_REQUEST, ///<Unsupported request
|
||||||
|
ERROR_UNSUPPORTED_CONFIGURATION, ///<Unsupported configuration
|
||||||
|
ERROR_UNSUPPORTED_FEATURE, ///<Unsupported feature
|
||||||
|
ERROR_ENDPOINT_BUSY, ///<Endpoint already in use
|
||||||
|
ERROR_USB_RESET,
|
||||||
|
ERROR_ABORTED,
|
||||||
|
|
||||||
|
ERROR_OUT_OF_MEMORY = 100,
|
||||||
|
ERROR_OUT_OF_RESOURCES,
|
||||||
|
ERROR_INVALID_REQUEST,
|
||||||
|
ERROR_NOT_IMPLEMENTED,
|
||||||
|
ERROR_VERSION_NOT_SUPPORTED,
|
||||||
|
ERROR_INVALID_SYNTAX,
|
||||||
|
ERROR_AUTHENTICATION_FAILED,
|
||||||
|
ERROR_UNEXPECTED_RESPONSE,
|
||||||
|
ERROR_INVALID_RESPONSE,
|
||||||
|
ERROR_UNEXPECTED_VALUE,
|
||||||
|
ERROR_WAIT_CANCELED,
|
||||||
|
|
||||||
|
ERROR_OPEN_FAILED = 200,
|
||||||
|
ERROR_CONNECTION_FAILED,
|
||||||
|
ERROR_CONNECTION_REFUSED,
|
||||||
|
ERROR_CONNECTION_CLOSING,
|
||||||
|
ERROR_CONNECTION_RESET,
|
||||||
|
ERROR_NOT_CONNECTED,
|
||||||
|
ERROR_ALREADY_CLOSED,
|
||||||
|
ERROR_ALREADY_CONNECTED,
|
||||||
|
ERROR_INVALID_SOCKET,
|
||||||
|
ERROR_PROTOCOL_UNREACHABLE,
|
||||||
|
ERROR_PORT_UNREACHABLE,
|
||||||
|
ERROR_INVALID_FRAME,
|
||||||
|
ERROR_INVALID_HEADER,
|
||||||
|
ERROR_WRONG_CHECKSUM,
|
||||||
|
ERROR_WRONG_IDENTIFIER,
|
||||||
|
ERROR_WRONG_CLIENT_ID,
|
||||||
|
ERROR_WRONG_SERVER_ID,
|
||||||
|
ERROR_WRONG_COOKIE,
|
||||||
|
ERROR_NO_RESPONSE,
|
||||||
|
ERROR_RECEIVE_QUEUE_FULL,
|
||||||
|
ERROR_TIMEOUT,
|
||||||
|
ERROR_WOULD_BLOCK,
|
||||||
|
ERROR_INVALID_NAME,
|
||||||
|
ERROR_INVALID_OPTION,
|
||||||
|
ERROR_UNEXPECTED_STATE,
|
||||||
|
ERROR_INVALID_COMMAND,
|
||||||
|
ERROR_INVALID_PROTOCOL,
|
||||||
|
ERROR_INVALID_STATUS,
|
||||||
|
ERROR_INVALID_ADDRESS,
|
||||||
|
ERROR_INVALID_PORT,
|
||||||
|
ERROR_INVALID_MESSAGE,
|
||||||
|
ERROR_INVALID_KEY,
|
||||||
|
ERROR_INVALID_KEY_LENGTH,
|
||||||
|
ERROR_INVALID_EPOCH,
|
||||||
|
ERROR_INVALID_SEQUENCE_NUMBER,
|
||||||
|
ERROR_INVALID_CHARACTER,
|
||||||
|
ERROR_INVALID_LENGTH,
|
||||||
|
ERROR_INVALID_PADDING,
|
||||||
|
ERROR_INVALID_MAC,
|
||||||
|
ERROR_INVALID_TAG,
|
||||||
|
ERROR_INVALID_TYPE,
|
||||||
|
ERROR_INVALID_VALUE,
|
||||||
|
ERROR_INVALID_CLASS,
|
||||||
|
ERROR_INVALID_VERSION,
|
||||||
|
ERROR_INVALID_PIN_CODE,
|
||||||
|
ERROR_WRONG_LENGTH,
|
||||||
|
ERROR_WRONG_TYPE,
|
||||||
|
ERROR_WRONG_ENCODING,
|
||||||
|
ERROR_WRONG_VALUE,
|
||||||
|
ERROR_INCONSISTENT_VALUE,
|
||||||
|
ERROR_UNSUPPORTED_TYPE,
|
||||||
|
ERROR_UNSUPPORTED_ALGO,
|
||||||
|
ERROR_UNSUPPORTED_CIPHER_SUITE,
|
||||||
|
ERROR_UNSUPPORTED_CIPHER_MODE,
|
||||||
|
ERROR_UNSUPPORTED_CIPHER_ALGO,
|
||||||
|
ERROR_UNSUPPORTED_HASH_ALGO,
|
||||||
|
ERROR_UNSUPPORTED_KEY_EXCH_ALGO,
|
||||||
|
ERROR_UNSUPPORTED_SIGNATURE_ALGO,
|
||||||
|
ERROR_UNSUPPORTED_ELLIPTIC_CURVE,
|
||||||
|
ERROR_INVALID_SIGNATURE_ALGO,
|
||||||
|
ERROR_CERTIFICATE_REQUIRED,
|
||||||
|
ERROR_MESSAGE_TOO_LONG,
|
||||||
|
ERROR_OUT_OF_RANGE,
|
||||||
|
ERROR_MESSAGE_DISCARDED,
|
||||||
|
|
||||||
|
ERROR_INVALID_PACKET,
|
||||||
|
ERROR_BUFFER_EMPTY,
|
||||||
|
ERROR_BUFFER_OVERFLOW,
|
||||||
|
ERROR_BUFFER_UNDERFLOW,
|
||||||
|
|
||||||
|
ERROR_INVALID_RESOURCE,
|
||||||
|
ERROR_INVALID_PATH,
|
||||||
|
ERROR_NOT_FOUND,
|
||||||
|
ERROR_ACCESS_DENIED,
|
||||||
|
ERROR_NOT_WRITABLE,
|
||||||
|
ERROR_AUTH_REQUIRED,
|
||||||
|
|
||||||
|
ERROR_TRANSMITTER_BUSY,
|
||||||
|
ERROR_NO_RUNNING,
|
||||||
|
|
||||||
|
ERROR_INVALID_FILE = 300,
|
||||||
|
ERROR_FILE_NOT_FOUND,
|
||||||
|
ERROR_FILE_OPENING_FAILED,
|
||||||
|
ERROR_FILE_READING_FAILED,
|
||||||
|
ERROR_END_OF_FILE,
|
||||||
|
ERROR_UNEXPECTED_END_OF_FILE,
|
||||||
|
ERROR_UNKNOWN_FILE_FORMAT,
|
||||||
|
|
||||||
|
ERROR_INVALID_DIRECTORY,
|
||||||
|
ERROR_DIRECTORY_NOT_FOUND,
|
||||||
|
|
||||||
|
ERROR_FILE_SYSTEM_NOT_SUPPORTED = 400,
|
||||||
|
ERROR_UNKNOWN_FILE_SYSTEM,
|
||||||
|
ERROR_INVALID_FILE_SYSTEM,
|
||||||
|
ERROR_INVALID_BOOT_SECTOR_SIGNATURE,
|
||||||
|
ERROR_INVALID_SECTOR_SIZE,
|
||||||
|
ERROR_INVALID_CLUSTER_SIZE,
|
||||||
|
ERROR_INVALID_FILE_RECORD_SIZE,
|
||||||
|
ERROR_INVALID_INDEX_BUFFER_SIZE,
|
||||||
|
ERROR_INVALID_VOLUME_DESCRIPTOR_SIGNATURE,
|
||||||
|
ERROR_INVALID_VOLUME_DESCRIPTOR,
|
||||||
|
ERROR_INVALID_FILE_RECORD,
|
||||||
|
ERROR_INVALID_INDEX_BUFFER,
|
||||||
|
ERROR_INVALID_DATA_RUNS,
|
||||||
|
ERROR_WRONG_TAG_IDENTIFIER,
|
||||||
|
ERROR_WRONG_TAG_CHECKSUM,
|
||||||
|
ERROR_WRONG_MAGIC_NUMBER,
|
||||||
|
ERROR_WRONG_SEQUENCE_NUMBER,
|
||||||
|
ERROR_DESCRIPTOR_NOT_FOUND,
|
||||||
|
ERROR_ATTRIBUTE_NOT_FOUND,
|
||||||
|
ERROR_RESIDENT_ATTRIBUTE,
|
||||||
|
ERROR_NOT_RESIDENT_ATTRIBUTE,
|
||||||
|
ERROR_INVALID_SUPER_BLOCK,
|
||||||
|
ERROR_INVALID_SUPER_BLOCK_SIGNATURE,
|
||||||
|
ERROR_INVALID_BLOCK_SIZE,
|
||||||
|
ERROR_UNSUPPORTED_REVISION_LEVEL,
|
||||||
|
ERROR_INVALID_INODE_SIZE,
|
||||||
|
ERROR_INODE_NOT_FOUND,
|
||||||
|
|
||||||
|
ERROR_UNEXPECTED_MESSAGE = 500,
|
||||||
|
|
||||||
|
ERROR_URL_TOO_LONG,
|
||||||
|
ERROR_QUERY_STRING_TOO_LONG,
|
||||||
|
|
||||||
|
ERROR_NO_ADDRESS,
|
||||||
|
ERROR_NO_BINDING,
|
||||||
|
ERROR_NOT_ON_LINK,
|
||||||
|
ERROR_USE_MULTICAST,
|
||||||
|
ERROR_NAK_RECEIVED,
|
||||||
|
ERROR_EXCEPTION_RECEIVED,
|
||||||
|
|
||||||
|
ERROR_NO_CARRIER,
|
||||||
|
|
||||||
|
ERROR_INVALID_LEVEL,
|
||||||
|
ERROR_WRONG_STATE,
|
||||||
|
ERROR_END_OF_STREAM,
|
||||||
|
ERROR_LINK_DOWN,
|
||||||
|
ERROR_INVALID_OPTION_LENGTH,
|
||||||
|
ERROR_IN_PROGRESS,
|
||||||
|
|
||||||
|
ERROR_NO_ACK,
|
||||||
|
ERROR_INVALID_METADATA,
|
||||||
|
ERROR_NOT_CONFIGURED,
|
||||||
|
ERROR_ALREADY_CONFIGURED,
|
||||||
|
ERROR_NAME_RESOLUTION_FAILED,
|
||||||
|
ERROR_NO_ROUTE,
|
||||||
|
|
||||||
|
ERROR_WRITE_FAILED,
|
||||||
|
ERROR_READ_FAILED,
|
||||||
|
ERROR_UPLOAD_FAILED,
|
||||||
|
ERROR_READ_ONLY_ACCESS,
|
||||||
|
|
||||||
|
ERROR_INVALID_SIGNATURE,
|
||||||
|
ERROR_INVALID_TICKET,
|
||||||
|
ERROR_NO_TICKET,
|
||||||
|
|
||||||
|
ERROR_BAD_RECORD_MAC,
|
||||||
|
ERROR_RECORD_OVERFLOW,
|
||||||
|
ERROR_HANDSHAKE_FAILED,
|
||||||
|
ERROR_NO_CERTIFICATE,
|
||||||
|
ERROR_BAD_CERTIFICATE,
|
||||||
|
ERROR_UNSUPPORTED_CERTIFICATE,
|
||||||
|
ERROR_UNKNOWN_CERTIFICATE,
|
||||||
|
ERROR_CERTIFICATE_EXPIRED,
|
||||||
|
ERROR_CERTIFICATE_REVOKED,
|
||||||
|
ERROR_UNKNOWN_CA,
|
||||||
|
ERROR_DECODING_FAILED,
|
||||||
|
ERROR_DECRYPTION_FAILED,
|
||||||
|
ERROR_ILLEGAL_PARAMETER,
|
||||||
|
ERROR_MISSING_EXTENSION,
|
||||||
|
ERROR_UNSUPPORTED_EXTENSION,
|
||||||
|
ERROR_INAPPROPRIATE_FALLBACK,
|
||||||
|
ERROR_NO_APPLICATION_PROTOCOL,
|
||||||
|
|
||||||
|
ERROR_MORE_DATA_REQUIRED,
|
||||||
|
ERROR_TLS_NOT_SUPPORTED,
|
||||||
|
ERROR_PRNG_NOT_READY,
|
||||||
|
ERROR_SERVICE_CLOSING,
|
||||||
|
ERROR_INVALID_TIMESTAMP,
|
||||||
|
ERROR_NO_DNS_SERVER,
|
||||||
|
|
||||||
|
ERROR_OBJECT_NOT_FOUND,
|
||||||
|
ERROR_INSTANCE_NOT_FOUND,
|
||||||
|
ERROR_ADDRESS_NOT_FOUND,
|
||||||
|
|
||||||
|
ERROR_UNKNOWN_IDENTITY,
|
||||||
|
ERROR_UNKNOWN_ENGINE_ID,
|
||||||
|
ERROR_UNKNOWN_USER_NAME,
|
||||||
|
ERROR_UNKNOWN_CONTEXT,
|
||||||
|
ERROR_UNAVAILABLE_CONTEXT,
|
||||||
|
ERROR_UNSUPPORTED_SECURITY_LEVEL,
|
||||||
|
ERROR_NOT_IN_TIME_WINDOW,
|
||||||
|
ERROR_AUTHORIZATION_FAILED,
|
||||||
|
|
||||||
|
ERROR_INVALID_FUNCTION_CODE,
|
||||||
|
ERROR_DEVICE_BUSY,
|
||||||
|
|
||||||
|
ERROR_REQUEST_REJECTED,
|
||||||
|
|
||||||
|
ERROR_INVALID_CHANNEL,
|
||||||
|
ERROR_INVALID_GROUP,
|
||||||
|
ERROR_UNKNOWN_SERVICE,
|
||||||
|
ERROR_UNKNOWN_REQUEST,
|
||||||
|
ERROR_FLOW_CONTROL,
|
||||||
|
|
||||||
|
ERROR_INVALID_PASSWORD,
|
||||||
|
ERROR_INVALID_HANDLE,
|
||||||
|
ERROR_BAD_NONCE,
|
||||||
|
ERROR_UNEXPECTED_STATUS,
|
||||||
|
ERROR_RESPONSE_TOO_LARGE,
|
||||||
|
|
||||||
|
ERROR_INVALID_SESSION,
|
||||||
|
ERROR_TICKET_EXPIRED,
|
||||||
|
|
||||||
|
ERROR_INVALID_ENTRY,
|
||||||
|
ERROR_TABLE_FULL,
|
||||||
|
ERROR_END_OF_TABLE,
|
||||||
|
|
||||||
|
ERROR_ALREADY_RUNNING,
|
||||||
|
ERROR_UNKOWN_KEY,
|
||||||
|
ERROR_UNKNOWN_TYPE,
|
||||||
|
ERROR_UNSUPPORTED_OPTION,
|
||||||
|
ERROR_INVALID_SPI,
|
||||||
|
ERROR_RETRY,
|
||||||
|
ERROR_POLICY_FAILURE,
|
||||||
|
ERROR_INVALID_PROPOSAL,
|
||||||
|
ERROR_INVALID_SELECTOR,
|
||||||
|
|
||||||
|
ERROR_WRONG_NONCE,
|
||||||
|
ERROR_WRONG_ISSUER,
|
||||||
|
ERROR_RESPONSE_EXPIRED,
|
||||||
|
ERROR_CRL_EXPIRED,
|
||||||
|
|
||||||
|
ERROR_NO_MATCH,
|
||||||
|
ERROR_PARTIAL_MATCH
|
||||||
|
} cyc_error_t;
|
||||||
|
|
||||||
|
#ifndef error_t
|
||||||
|
#define error_t cyc_error_t
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//C++ guard
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
62
deps/cyclone/include/hash/hash_algorithms.h
vendored
Normal file
62
deps/cyclone/include/hash/hash_algorithms.h
vendored
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
/**
|
||||||
|
* @file hash_algorithms.h
|
||||||
|
* @brief Collection of hash algorithms
|
||||||
|
*
|
||||||
|
* @section License
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010-2024 Oryx Embedded SARL. All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is part of CycloneCRYPTO Open.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* @author Oryx Embedded SARL (www.oryx-embedded.com)
|
||||||
|
* @version 2.4.4
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef _HASH_ALGORITHMS_H
|
||||||
|
#define _HASH_ALGORITHMS_H
|
||||||
|
|
||||||
|
//Dependencies
|
||||||
|
#include "core/crypto.h"
|
||||||
|
#include "hash/sha256.h"
|
||||||
|
|
||||||
|
//C++ guard
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#define MAX_HASH_DIGEST_SIZE SHA256_DIGEST_SIZE
|
||||||
|
#define MAX_HASH_BLOCK_SIZE SHA256_BLOCK_SIZE
|
||||||
|
/**
|
||||||
|
* @brief Generic hash algorithm context
|
||||||
|
**/
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
uint8_t digest[MAX_HASH_DIGEST_SIZE];
|
||||||
|
Sha256Context sha256Context;
|
||||||
|
} HashContext;
|
||||||
|
|
||||||
|
|
||||||
|
//C++ guard
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
96
deps/cyclone/include/hash/sha256.h
vendored
Normal file
96
deps/cyclone/include/hash/sha256.h
vendored
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
/**
|
||||||
|
* @file sha256.h
|
||||||
|
* @brief SHA-256 (Secure Hash Algorithm 256)
|
||||||
|
*
|
||||||
|
* @section License
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010-2024 Oryx Embedded SARL. All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is part of CycloneCRYPTO Open.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* @author Oryx Embedded SARL (www.oryx-embedded.com)
|
||||||
|
* @version 2.4.4
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef _SHA256_H
|
||||||
|
#define _SHA256_H
|
||||||
|
|
||||||
|
//Dependencies
|
||||||
|
#include "core/crypto.h"
|
||||||
|
|
||||||
|
//Application specific context
|
||||||
|
#ifndef SHA256_PRIVATE_CONTEXT
|
||||||
|
#define SHA256_PRIVATE_CONTEXT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//SHA-256 block size
|
||||||
|
#define SHA256_BLOCK_SIZE 64
|
||||||
|
//SHA-256 digest size
|
||||||
|
#define SHA256_DIGEST_SIZE 32
|
||||||
|
//Minimum length of the padding string
|
||||||
|
#define SHA256_MIN_PAD_SIZE 9
|
||||||
|
//Common interface for hash algorithms
|
||||||
|
#define SHA256_HASH_ALGO (&sha256HashAlgo)
|
||||||
|
|
||||||
|
//C++ guard
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SHA-256 algorithm context
|
||||||
|
**/
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
uint32_t h[8];
|
||||||
|
uint8_t digest[32];
|
||||||
|
};
|
||||||
|
union
|
||||||
|
{
|
||||||
|
uint32_t w[16];
|
||||||
|
uint8_t buffer[64];
|
||||||
|
};
|
||||||
|
size_t size;
|
||||||
|
uint64_t totalSize;
|
||||||
|
SHA256_PRIVATE_CONTEXT
|
||||||
|
} Sha256Context;
|
||||||
|
|
||||||
|
|
||||||
|
//SHA-256 related constants
|
||||||
|
extern const uint8_t SHA256_OID[9];
|
||||||
|
extern const HashAlgo sha256HashAlgo;
|
||||||
|
|
||||||
|
//SHA-256 related functions
|
||||||
|
error_t sha256Compute(const void *data, size_t length, uint8_t *digest);
|
||||||
|
void sha256Init(Sha256Context *context);
|
||||||
|
void sha256Update(Sha256Context *context, const void *data, size_t length);
|
||||||
|
void sha256Final(Sha256Context *context, uint8_t *digest);
|
||||||
|
void sha256FinalRaw(Sha256Context *context, uint8_t *digest);
|
||||||
|
void sha256ProcessBlock(Sha256Context *context);
|
||||||
|
|
||||||
|
//C++ guard
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
58
deps/cyclone/include/kdf/hkdf.h
vendored
Normal file
58
deps/cyclone/include/kdf/hkdf.h
vendored
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
/**
|
||||||
|
* @file hkdf.h
|
||||||
|
* @brief HKDF (HMAC-based Key Derivation Function)
|
||||||
|
*
|
||||||
|
* @section License
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010-2024 Oryx Embedded SARL. All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is part of CycloneCRYPTO Open.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* @author Oryx Embedded SARL (www.oryx-embedded.com)
|
||||||
|
* @version 2.4.4
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef _HKDF_H
|
||||||
|
#define _HKDF_H
|
||||||
|
|
||||||
|
//Dependencies
|
||||||
|
#include "core/crypto.h"
|
||||||
|
|
||||||
|
//C++ guard
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//HKDF related functions
|
||||||
|
error_t hkdf(const HashAlgo *hash, const uint8_t *ikm, size_t ikmLen,
|
||||||
|
const uint8_t *salt, size_t saltLen, const uint8_t *info, size_t infoLen,
|
||||||
|
uint8_t *okm, size_t okmLen);
|
||||||
|
|
||||||
|
error_t hkdfExtract(const HashAlgo *hash, const uint8_t *ikm, size_t ikmLen,
|
||||||
|
const uint8_t *salt, size_t saltLen, uint8_t *prk);
|
||||||
|
|
||||||
|
error_t hkdfExpand(const HashAlgo *hash, const uint8_t *prk, size_t prkLen,
|
||||||
|
const uint8_t *info, size_t infoLen, uint8_t *okm, size_t okmLen);
|
||||||
|
|
||||||
|
//C++ guard
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
102
deps/cyclone/include/mac/hmac.h
vendored
Normal file
102
deps/cyclone/include/mac/hmac.h
vendored
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
/**
|
||||||
|
* @file hmac.h
|
||||||
|
* @brief HMAC (Keyed-Hashing for Message Authentication)
|
||||||
|
*
|
||||||
|
* @section License
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010-2024 Oryx Embedded SARL. All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is part of CycloneCRYPTO Open.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* @author Oryx Embedded SARL (www.oryx-embedded.com)
|
||||||
|
* @version 2.4.4
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef _HMAC_H
|
||||||
|
#define _HMAC_H
|
||||||
|
|
||||||
|
//Dependencies
|
||||||
|
#include "core/crypto.h"
|
||||||
|
#include "hash/hash_algorithms.h"
|
||||||
|
|
||||||
|
//Application specific context
|
||||||
|
#ifndef HMAC_PRIVATE_CONTEXT
|
||||||
|
#define HMAC_PRIVATE_CONTEXT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Inner padding (ipad)
|
||||||
|
#define HMAC_IPAD 0x36
|
||||||
|
//Outer padding (opad)
|
||||||
|
#define HMAC_OPAD 0x5C
|
||||||
|
|
||||||
|
//C++ guard
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief HMAC algorithm context
|
||||||
|
**/
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
const HashAlgo *hash;
|
||||||
|
HashContext hashContext;
|
||||||
|
uint8_t key[MAX_HASH_BLOCK_SIZE];
|
||||||
|
uint8_t digest[MAX_HASH_DIGEST_SIZE];
|
||||||
|
HMAC_PRIVATE_CONTEXT
|
||||||
|
} HmacContext;
|
||||||
|
|
||||||
|
|
||||||
|
//HMAC related constants
|
||||||
|
extern const uint8_t HMAC_WITH_MD5_OID[8];
|
||||||
|
extern const uint8_t HMAC_WITH_TIGER_OID[8];
|
||||||
|
extern const uint8_t HMAC_WITH_RIPEMD160_OID[8];
|
||||||
|
extern const uint8_t HMAC_WITH_SHA1_OID[8];
|
||||||
|
extern const uint8_t HMAC_WITH_SHA224_OID[8];
|
||||||
|
extern const uint8_t HMAC_WITH_SHA256_OID[8];
|
||||||
|
extern const uint8_t HMAC_WITH_SHA384_OID[8];
|
||||||
|
extern const uint8_t HMAC_WITH_SHA512_OID[8];
|
||||||
|
extern const uint8_t HMAC_WITH_SHA512_224_OID[8];
|
||||||
|
extern const uint8_t HMAC_WITH_SHA512_256_OID[8];
|
||||||
|
extern const uint8_t HMAC_WITH_SHA3_224_OID[9];
|
||||||
|
extern const uint8_t HMAC_WITH_SHA3_256_OID[9];
|
||||||
|
extern const uint8_t HMAC_WITH_SHA3_384_OID[9];
|
||||||
|
extern const uint8_t HMAC_WITH_SHA3_512_OID[9];
|
||||||
|
extern const uint8_t HMAC_WITH_SM3_OID[10];
|
||||||
|
|
||||||
|
//HMAC related functions
|
||||||
|
error_t hmacCompute(const HashAlgo *hash, const void *key, size_t keyLen,
|
||||||
|
const void *data, size_t dataLen, uint8_t *digest);
|
||||||
|
|
||||||
|
error_t hmacInit(HmacContext *context, const HashAlgo *hash,
|
||||||
|
const void *key, size_t keyLen);
|
||||||
|
|
||||||
|
void hmacUpdate(HmacContext *context, const void *data, size_t length);
|
||||||
|
void hmacFinal(HmacContext *context, uint8_t *digest);
|
||||||
|
void hmacFinalRaw(HmacContext *context, uint8_t *digest);
|
||||||
|
void hmacDeinit(HmacContext *context);
|
||||||
|
|
||||||
|
//C++ guard
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
110
deps/cyclone/include/os_port.h
vendored
Normal file
110
deps/cyclone/include/os_port.h
vendored
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
/**
|
||||||
|
* @file os_port.h
|
||||||
|
* @brief RTOS abstraction layer
|
||||||
|
*
|
||||||
|
* @section License
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010-2024 Oryx Embedded SARL. All rights reserved.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* @author Oryx Embedded SARL (www.oryx-embedded.com)
|
||||||
|
* @version 2.4.4
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rewrote for youtubeUnblock
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _OS_PORT_H
|
||||||
|
#define _OS_PORT_H
|
||||||
|
|
||||||
|
//Dependencies
|
||||||
|
#include "types.h"
|
||||||
|
#include "compiler_port.h"
|
||||||
|
|
||||||
|
//Compilation flags used to enable/disable features
|
||||||
|
#define ENABLED 1
|
||||||
|
#define DISABLED 0
|
||||||
|
|
||||||
|
#define timeCompare(t1, t2) ((int32_t) ((t1) - (t2)))
|
||||||
|
|
||||||
|
//Miscellaneous macros
|
||||||
|
#if !defined(__AT32F403A_407_LIBRARY_VERSION) && \
|
||||||
|
!defined(__AT32F435_437_LIBRARY_VERSION)
|
||||||
|
#ifndef FALSE
|
||||||
|
#define FALSE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TRUE
|
||||||
|
#define TRUE 1
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LSB
|
||||||
|
#define LSB(x) ((x) & 0xFF)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MSB
|
||||||
|
#define MSB(x) (((x) >> 8) & 0xFF)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MIN
|
||||||
|
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MAX
|
||||||
|
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef arraysize
|
||||||
|
#define arraysize(a) (sizeof(a) / sizeof(a[0]))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Memory management
|
||||||
|
#ifndef osAllocMem
|
||||||
|
#define osAllocMem malloc
|
||||||
|
#endif
|
||||||
|
#ifndef osFreeMem
|
||||||
|
#define osFreeMem free
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Fill block of memory
|
||||||
|
#ifndef osMemset
|
||||||
|
#define osMemset(p, value, length) (void) memset(p, value, length)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Copy block of memory
|
||||||
|
#ifndef osMemcpy
|
||||||
|
#define osMemcpy(dest, src, length) (void) memcpy(dest, src, length)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Move block of memory
|
||||||
|
#ifndef osMemmove
|
||||||
|
#define osMemmove(dest, src, length) (void) memmove(dest, src, length)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Compare two blocks of memory
|
||||||
|
#ifndef osMemcmp
|
||||||
|
#define osMemcmp(p1, p2, length) memcmp(p1, p2, length)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Search for the first occurrence of a given character
|
||||||
|
#ifndef osMemchr
|
||||||
|
#define osMemchr(p, c, length) memchr(p, c, length)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
BIN
deps/cyclone/libcyclone.a
vendored
Normal file
BIN
deps/cyclone/libcyclone.a
vendored
Normal file
Binary file not shown.
361
deps/cyclone/sha256.c
vendored
Normal file
361
deps/cyclone/sha256.c
vendored
Normal file
@@ -0,0 +1,361 @@
|
|||||||
|
/**
|
||||||
|
* @file sha256.c
|
||||||
|
* @brief SHA-256 (Secure Hash Algorithm 256)
|
||||||
|
*
|
||||||
|
* @section License
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010-2024 Oryx Embedded SARL. All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is part of CycloneCRYPTO Open.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* @section Description
|
||||||
|
*
|
||||||
|
* SHA-256 is a secure hash algorithm for computing a condensed representation
|
||||||
|
* of an electronic message. Refer to FIPS 180-4 for more details
|
||||||
|
*
|
||||||
|
* @author Oryx Embedded SARL (www.oryx-embedded.com)
|
||||||
|
* @version 2.4.4
|
||||||
|
**/
|
||||||
|
|
||||||
|
//Switch to the appropriate trace level
|
||||||
|
#define TRACE_LEVEL CRYPTO_TRACE_LEVEL
|
||||||
|
|
||||||
|
//Dependencies
|
||||||
|
#include "core/crypto.h"
|
||||||
|
#include "hash/sha256.h"
|
||||||
|
|
||||||
|
//Check crypto library configuration
|
||||||
|
#if (SHA224_SUPPORT == ENABLED || SHA256_SUPPORT == ENABLED)
|
||||||
|
|
||||||
|
//Macro to access the workspace as a circular buffer
|
||||||
|
#define W(n) w[(n) & 0x0F]
|
||||||
|
|
||||||
|
//SHA-256 auxiliary functions
|
||||||
|
#define CH(x, y, z) (((x) & (y)) | (~(x) & (z)))
|
||||||
|
#define MAJ(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
|
||||||
|
#define SIGMA1(x) (ROR32(x, 2) ^ ROR32(x, 13) ^ ROR32(x, 22))
|
||||||
|
#define SIGMA2(x) (ROR32(x, 6) ^ ROR32(x, 11) ^ ROR32(x, 25))
|
||||||
|
#define SIGMA3(x) (ROR32(x, 7) ^ ROR32(x, 18) ^ SHR32(x, 3))
|
||||||
|
#define SIGMA4(x) (ROR32(x, 17) ^ ROR32(x, 19) ^ SHR32(x, 10))
|
||||||
|
|
||||||
|
//SHA-256 padding
|
||||||
|
static const uint8_t padding[64] =
|
||||||
|
{
|
||||||
|
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
//SHA-256 constants
|
||||||
|
static const uint32_t k[64] =
|
||||||
|
{
|
||||||
|
0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
|
||||||
|
0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
|
||||||
|
0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
|
||||||
|
0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
|
||||||
|
0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
|
||||||
|
0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
|
||||||
|
0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
|
||||||
|
0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2
|
||||||
|
};
|
||||||
|
|
||||||
|
//SHA-256 object identifier (2.16.840.1.101.3.4.2.1)
|
||||||
|
const uint8_t SHA256_OID[9] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01};
|
||||||
|
|
||||||
|
//Common interface for hash algorithms
|
||||||
|
const HashAlgo sha256HashAlgo =
|
||||||
|
{
|
||||||
|
"SHA-256",
|
||||||
|
SHA256_OID,
|
||||||
|
sizeof(SHA256_OID),
|
||||||
|
sizeof(Sha256Context),
|
||||||
|
SHA256_BLOCK_SIZE,
|
||||||
|
SHA256_DIGEST_SIZE,
|
||||||
|
SHA256_MIN_PAD_SIZE,
|
||||||
|
TRUE,
|
||||||
|
(HashAlgoCompute) sha256Compute,
|
||||||
|
(HashAlgoInit) sha256Init,
|
||||||
|
(HashAlgoUpdate) sha256Update,
|
||||||
|
(HashAlgoFinal) sha256Final,
|
||||||
|
#if ((defined(MIMXRT1050_CRYPTO_HASH_SUPPORT) && MIMXRT1050_CRYPTO_HASH_SUPPORT == ENABLED) || \
|
||||||
|
(defined(MIMXRT1060_CRYPTO_HASH_SUPPORT) && MIMXRT1060_CRYPTO_HASH_SUPPORT == ENABLED) || \
|
||||||
|
(defined(MIMXRT1160_CRYPTO_HASH_SUPPORT) && MIMXRT1160_CRYPTO_HASH_SUPPORT == ENABLED) || \
|
||||||
|
(defined(MIMXRT1170_CRYPTO_HASH_SUPPORT) && MIMXRT1170_CRYPTO_HASH_SUPPORT == ENABLED))
|
||||||
|
NULL,
|
||||||
|
#else
|
||||||
|
(HashAlgoFinalRaw) sha256FinalRaw
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Digest a message using SHA-256
|
||||||
|
* @param[in] data Pointer to the message being hashed
|
||||||
|
* @param[in] length Length of the message
|
||||||
|
* @param[out] digest Pointer to the calculated digest
|
||||||
|
* @return Error code
|
||||||
|
**/
|
||||||
|
|
||||||
|
__weak_func error_t sha256Compute(const void *data, size_t length, uint8_t *digest)
|
||||||
|
{
|
||||||
|
#if (CRYPTO_STATIC_MEM_SUPPORT == DISABLED)
|
||||||
|
Sha256Context *context;
|
||||||
|
#else
|
||||||
|
Sha256Context context[1];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Check parameters
|
||||||
|
if(data == NULL && length != 0)
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
if(digest == NULL)
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
#if (CRYPTO_STATIC_MEM_SUPPORT == DISABLED)
|
||||||
|
//Allocate a memory buffer to hold the SHA-256 context
|
||||||
|
context = cryptoAllocMem(sizeof(Sha256Context));
|
||||||
|
//Failed to allocate memory?
|
||||||
|
if(context == NULL)
|
||||||
|
return ERROR_OUT_OF_MEMORY;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Initialize the SHA-256 context
|
||||||
|
sha256Init(context);
|
||||||
|
//Digest the message
|
||||||
|
sha256Update(context, data, length);
|
||||||
|
//Finalize the SHA-256 message digest
|
||||||
|
sha256Final(context, digest);
|
||||||
|
|
||||||
|
#if (CRYPTO_STATIC_MEM_SUPPORT == DISABLED)
|
||||||
|
//Free previously allocated memory
|
||||||
|
cryptoFreeMem(context);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Successful processing
|
||||||
|
return NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialize SHA-256 message digest context
|
||||||
|
* @param[in] context Pointer to the SHA-256 context to initialize
|
||||||
|
**/
|
||||||
|
|
||||||
|
__weak_func void sha256Init(Sha256Context *context)
|
||||||
|
{
|
||||||
|
//Set initial hash value
|
||||||
|
context->h[0] = 0x6A09E667;
|
||||||
|
context->h[1] = 0xBB67AE85;
|
||||||
|
context->h[2] = 0x3C6EF372;
|
||||||
|
context->h[3] = 0xA54FF53A;
|
||||||
|
context->h[4] = 0x510E527F;
|
||||||
|
context->h[5] = 0x9B05688C;
|
||||||
|
context->h[6] = 0x1F83D9AB;
|
||||||
|
context->h[7] = 0x5BE0CD19;
|
||||||
|
|
||||||
|
//Number of bytes in the buffer
|
||||||
|
context->size = 0;
|
||||||
|
//Total length of the message
|
||||||
|
context->totalSize = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Update the SHA-256 context with a portion of the message being hashed
|
||||||
|
* @param[in] context Pointer to the SHA-256 context
|
||||||
|
* @param[in] data Pointer to the buffer being hashed
|
||||||
|
* @param[in] length Length of the buffer
|
||||||
|
**/
|
||||||
|
|
||||||
|
__weak_func void sha256Update(Sha256Context *context, const void *data, size_t length)
|
||||||
|
{
|
||||||
|
size_t n;
|
||||||
|
|
||||||
|
//Process the incoming data
|
||||||
|
while(length > 0)
|
||||||
|
{
|
||||||
|
//The buffer can hold at most 64 bytes
|
||||||
|
n = MIN(length, 64 - context->size);
|
||||||
|
|
||||||
|
//Copy the data to the buffer
|
||||||
|
osMemcpy(context->buffer + context->size, data, n);
|
||||||
|
|
||||||
|
//Update the SHA-256 context
|
||||||
|
context->size += n;
|
||||||
|
context->totalSize += n;
|
||||||
|
//Advance the data pointer
|
||||||
|
data = (uint8_t *) data + n;
|
||||||
|
//Remaining bytes to process
|
||||||
|
length -= n;
|
||||||
|
|
||||||
|
//Process message in 16-word blocks
|
||||||
|
if(context->size == 64)
|
||||||
|
{
|
||||||
|
//Transform the 16-word block
|
||||||
|
sha256ProcessBlock(context);
|
||||||
|
//Empty the buffer
|
||||||
|
context->size = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Finish the SHA-256 message digest
|
||||||
|
* @param[in] context Pointer to the SHA-256 context
|
||||||
|
* @param[out] digest Calculated digest (optional parameter)
|
||||||
|
**/
|
||||||
|
|
||||||
|
__weak_func void sha256Final(Sha256Context *context, uint8_t *digest)
|
||||||
|
{
|
||||||
|
uint_t i;
|
||||||
|
size_t paddingSize;
|
||||||
|
uint64_t totalSize;
|
||||||
|
|
||||||
|
//Length of the original message (before padding)
|
||||||
|
totalSize = context->totalSize * 8;
|
||||||
|
|
||||||
|
//Pad the message so that its length is congruent to 56 modulo 64
|
||||||
|
if(context->size < 56)
|
||||||
|
{
|
||||||
|
paddingSize = 56 - context->size;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
paddingSize = 64 + 56 - context->size;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Append padding
|
||||||
|
sha256Update(context, padding, paddingSize);
|
||||||
|
|
||||||
|
//Append the length of the original message
|
||||||
|
context->w[14] = htobe32((uint32_t) (totalSize >> 32));
|
||||||
|
context->w[15] = htobe32((uint32_t) totalSize);
|
||||||
|
|
||||||
|
//Calculate the message digest
|
||||||
|
sha256ProcessBlock(context);
|
||||||
|
|
||||||
|
//Convert from host byte order to big-endian byte order
|
||||||
|
for(i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
context->h[i] = htobe32(context->h[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Copy the resulting digest
|
||||||
|
if(digest != NULL)
|
||||||
|
{
|
||||||
|
osMemcpy(digest, context->digest, SHA256_DIGEST_SIZE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Finish the SHA-256 message digest (no padding added)
|
||||||
|
* @param[in] context Pointer to the SHA-256 context
|
||||||
|
* @param[out] digest Calculated digest
|
||||||
|
**/
|
||||||
|
|
||||||
|
__weak_func void sha256FinalRaw(Sha256Context *context, uint8_t *digest)
|
||||||
|
{
|
||||||
|
uint_t i;
|
||||||
|
|
||||||
|
//Convert from host byte order to big-endian byte order
|
||||||
|
for(i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
context->h[i] = htobe32(context->h[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Copy the resulting digest
|
||||||
|
osMemcpy(digest, context->digest, SHA256_DIGEST_SIZE);
|
||||||
|
|
||||||
|
//Convert from big-endian byte order to host byte order
|
||||||
|
for(i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
context->h[i] = betoh32(context->h[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Process message in 16-word blocks
|
||||||
|
* @param[in] context Pointer to the SHA-256 context
|
||||||
|
**/
|
||||||
|
|
||||||
|
__weak_func void sha256ProcessBlock(Sha256Context *context)
|
||||||
|
{
|
||||||
|
uint_t i;
|
||||||
|
uint32_t temp1;
|
||||||
|
uint32_t temp2;
|
||||||
|
|
||||||
|
//Initialize the 8 working registers
|
||||||
|
uint32_t a = context->h[0];
|
||||||
|
uint32_t b = context->h[1];
|
||||||
|
uint32_t c = context->h[2];
|
||||||
|
uint32_t d = context->h[3];
|
||||||
|
uint32_t e = context->h[4];
|
||||||
|
uint32_t f = context->h[5];
|
||||||
|
uint32_t g = context->h[6];
|
||||||
|
uint32_t h = context->h[7];
|
||||||
|
|
||||||
|
//Process message in 16-word blocks
|
||||||
|
uint32_t *w = context->w;
|
||||||
|
|
||||||
|
//Convert from big-endian byte order to host byte order
|
||||||
|
for(i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
w[i] = betoh32(w[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//SHA-256 hash computation (alternate method)
|
||||||
|
for(i = 0; i < 64; i++)
|
||||||
|
{
|
||||||
|
//Prepare the message schedule
|
||||||
|
if(i >= 16)
|
||||||
|
{
|
||||||
|
W(i) += SIGMA4(W(i + 14)) + W(i + 9) + SIGMA3(W(i + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
//Calculate T1 and T2
|
||||||
|
temp1 = h + SIGMA2(e) + CH(e, f, g) + k[i] + W(i);
|
||||||
|
temp2 = SIGMA1(a) + MAJ(a, b, c);
|
||||||
|
|
||||||
|
//Update working registers
|
||||||
|
h = g;
|
||||||
|
g = f;
|
||||||
|
f = e;
|
||||||
|
e = d + temp1;
|
||||||
|
d = c;
|
||||||
|
c = b;
|
||||||
|
b = a;
|
||||||
|
a = temp1 + temp2;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Update the hash value
|
||||||
|
context->h[0] += a;
|
||||||
|
context->h[1] += b;
|
||||||
|
context->h[2] += c;
|
||||||
|
context->h[3] += d;
|
||||||
|
context->h[4] += e;
|
||||||
|
context->h[5] += f;
|
||||||
|
context->h[6] += g;
|
||||||
|
context->h[7] += h;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -12,7 +12,7 @@ struct quic_pnumber {
|
|||||||
uint8_t d4;
|
uint8_t d4;
|
||||||
};
|
};
|
||||||
|
|
||||||
uint64_t quic_parse_varlength(uint8_t *variable, uint64_t *mlen) {
|
uint64_t quic_parse_varlength(const uint8_t *variable, uint64_t *mlen) {
|
||||||
if (mlen && *mlen == 0) return 0;
|
if (mlen && *mlen == 0) return 0;
|
||||||
uint64_t vr = (*variable & 0x3F);
|
uint64_t vr = (*variable & 0x3F);
|
||||||
uint8_t len = 1 << (*variable >> 6);
|
uint8_t len = 1 << (*variable >> 6);
|
||||||
@@ -31,35 +31,66 @@ uint64_t quic_parse_varlength(uint8_t *variable, uint64_t *mlen) {
|
|||||||
return vr;
|
return vr;
|
||||||
}
|
}
|
||||||
|
|
||||||
int quic_parse_data(uint8_t *raw_payload, uint32_t raw_payload_len,
|
int64_t quic_get_version(const struct quic_lhdr *qch) {
|
||||||
struct quic_lhdr **qch, uint32_t *qch_len,
|
int64_t qversion = ntohl(qch->version);
|
||||||
|
|
||||||
|
switch (qversion) {
|
||||||
|
case QUIC_V1:
|
||||||
|
case QUIC_V2:
|
||||||
|
return qversion;
|
||||||
|
default:
|
||||||
|
return -qversion;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int quic_check_is_initial(const struct quic_lhdr *qch) {
|
||||||
|
int64_t qversion = quic_get_version(qch);
|
||||||
|
if (qversion < 0) return 0;
|
||||||
|
|
||||||
|
uint8_t qtype = qch->type;
|
||||||
|
|
||||||
|
switch (qversion) {
|
||||||
|
case QUIC_V1:
|
||||||
|
qtype = quic_convtype_v1(qtype);
|
||||||
|
break;
|
||||||
|
case QUIC_V2:
|
||||||
|
qtype = quic_convtype_v2(qtype);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qtype != QUIC_INITIAL_TYPE) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int quic_parse_data(const uint8_t *raw_payload, uint32_t raw_payload_len,
|
||||||
|
const struct quic_lhdr **qch, uint32_t *qch_len,
|
||||||
struct quic_cids *qci,
|
struct quic_cids *qci,
|
||||||
uint8_t **payload, uint32_t *plen) {
|
const uint8_t **payload, uint32_t *plen) {
|
||||||
if ( raw_payload == NULL ||
|
if ( raw_payload == NULL ||
|
||||||
raw_payload_len < sizeof(struct quic_lhdr))
|
raw_payload_len < sizeof(struct quic_lhdr))
|
||||||
goto invalid_packet;
|
goto invalid_packet;
|
||||||
|
|
||||||
struct quic_lhdr *nqch = (struct quic_lhdr *)raw_payload;
|
const struct quic_lhdr *nqch = (const struct quic_lhdr *)raw_payload;
|
||||||
uint32_t left_len = raw_payload_len - sizeof(struct quic_lhdr);
|
uint32_t left_len = raw_payload_len - sizeof(struct quic_lhdr);
|
||||||
uint8_t *cur_rawptr = raw_payload + sizeof(struct quic_lhdr);
|
const uint8_t *cur_rawptr = raw_payload + sizeof(struct quic_lhdr);
|
||||||
if (!nqch->fixed) {
|
if (!nqch->fixed) {
|
||||||
lgtrace_addp("quic fixed unset");
|
lgtrace_addp("quic fixed unset");
|
||||||
return -EPROTO;
|
return -EPROTO;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t found = 0;
|
int64_t qversion = quic_get_version(nqch);
|
||||||
for (uint8_t i = 0; i < 2; i++) {
|
|
||||||
if (ntohl(nqch->version) == supported_versions[i]) {
|
|
||||||
found = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!found) {
|
if (qversion < 0) {
|
||||||
lgtrace_addp("quic version undefined %d", ntohl(nqch->version));
|
lgtrace_addp("quic version undefined %ld", -qversion);
|
||||||
return -EPROTO;
|
return -EPROTO;
|
||||||
}
|
}
|
||||||
|
|
||||||
lgtrace_addp("quic version valid %d", ntohl(nqch->version));
|
lgtrace_addp("quic version valid %ld", qversion);
|
||||||
|
|
||||||
if (left_len < 2) goto invalid_packet;
|
if (left_len < 2) goto invalid_packet;
|
||||||
struct quic_cids nqci = {0};
|
struct quic_cids nqci = {0};
|
||||||
@@ -93,14 +124,12 @@ invalid_packet:
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int quic_parse_initial_message(uint8_t *inpayload, uint32_t inplen,
|
int quic_parse_initial_header(const uint8_t *inpayload, uint32_t inplen,
|
||||||
const struct quic_lhdr *qch,
|
struct quici_hdr *qhdr) {
|
||||||
struct quici_hdr *qhdr,
|
|
||||||
uint8_t **payload, uint32_t *plen) {
|
|
||||||
if (inplen < 3) goto invalid_packet;
|
if (inplen < 3) goto invalid_packet;
|
||||||
struct quici_hdr nqhdr;
|
struct quici_hdr nqhdr;
|
||||||
|
|
||||||
uint8_t *cur_ptr = inpayload;
|
const uint8_t *cur_ptr = inpayload;
|
||||||
uint32_t left_len = inplen;
|
uint32_t left_len = inplen;
|
||||||
uint64_t tlen = left_len;
|
uint64_t tlen = left_len;
|
||||||
|
|
||||||
@@ -115,22 +144,18 @@ int quic_parse_initial_message(uint8_t *inpayload, uint32_t inplen,
|
|||||||
tlen = left_len;
|
tlen = left_len;
|
||||||
nqhdr.length = quic_parse_varlength(cur_ptr, &tlen);
|
nqhdr.length = quic_parse_varlength(cur_ptr, &tlen);
|
||||||
|
|
||||||
if (left_len != nqhdr.length + tlen &&
|
if (left_len < nqhdr.length + tlen ||
|
||||||
left_len <= qch->number_length + 1)
|
nqhdr.length < QUIC_SAMPLE_SIZE +
|
||||||
|
QUIC_SAMPLE_OFFSET
|
||||||
|
)
|
||||||
goto invalid_packet;
|
goto invalid_packet;
|
||||||
|
cur_ptr += tlen;
|
||||||
|
|
||||||
uint32_t packet_number = 0;
|
nqhdr.protected_payload = cur_ptr;
|
||||||
|
nqhdr.sample = cur_ptr + QUIC_SAMPLE_OFFSET;
|
||||||
for (uint8_t i = 0; i <= qch->number_length; i++) {
|
nqhdr.sample_length = QUIC_SAMPLE_SIZE;
|
||||||
packet_number = (packet_number << 8) + *cur_ptr++;
|
|
||||||
left_len--;
|
|
||||||
}
|
|
||||||
|
|
||||||
nqhdr.packet_number = packet_number;
|
|
||||||
|
|
||||||
if (qhdr) *qhdr = nqhdr;
|
if (qhdr) *qhdr = nqhdr;
|
||||||
if (payload) *payload = cur_ptr;
|
|
||||||
if (plen) *plen = left_len;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -272,13 +297,13 @@ int detect_udp_filtered(const struct section_config_t *section,
|
|||||||
const struct quic_lhdr *qch;
|
const struct quic_lhdr *qch;
|
||||||
uint32_t qch_len;
|
uint32_t qch_len;
|
||||||
struct quic_cids qci;
|
struct quic_cids qci;
|
||||||
uint8_t *quic_raw_payload;
|
const uint8_t *quic_raw_payload;
|
||||||
uint32_t quic_raw_plen;
|
uint32_t quic_raw_plen;
|
||||||
|
|
||||||
lgtrace_addp("QUIC probe");
|
lgtrace_addp("QUIC probe");
|
||||||
|
|
||||||
ret = quic_parse_data((uint8_t *)data, dlen,
|
ret = quic_parse_data((uint8_t *)data, dlen,
|
||||||
(struct quic_lhdr **)&qch, &qch_len, &qci,
|
&qch, &qch_len, &qci,
|
||||||
&quic_raw_payload, &quic_raw_plen);
|
&quic_raw_payload, &quic_raw_plen);
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
@@ -49,13 +49,42 @@ static const uint32_t supported_versions[] = {
|
|||||||
QUIC_V2,
|
QUIC_V2,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// In bytes
|
||||||
|
#define QUIC_SAMPLE_OFFSET 4
|
||||||
|
|
||||||
|
#define QUIC_SAMPLE_SIZE 16
|
||||||
|
#define QUIC_INITIAL_SECRET_SIZE 32
|
||||||
|
#define QUIC_CLIENT_IN_SIZE 32
|
||||||
|
#define QUIC_KEY_SIZE 16
|
||||||
|
#define QUIC_IV_SIZE 12
|
||||||
|
#define QUIC_HP_SIZE 16
|
||||||
|
// Altough tag is not defined, it present in the end of message
|
||||||
|
#define QUIC_TAG_SIZE 16
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes type-specific bytes for Initial message
|
||||||
|
*/
|
||||||
|
struct quici_lhdr_typespec {
|
||||||
|
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||||
|
uint8_t number_length:2;//protected
|
||||||
|
uint8_t reserved:2; //protected
|
||||||
|
uint8_t discard:4;
|
||||||
|
#elif __BYTE_ORDER == __BIG_ENDIAN
|
||||||
|
uint8_t discard:4;
|
||||||
|
uint8_t reserved:2; //protected
|
||||||
|
uint8_t number_length:2;//protected
|
||||||
|
#else
|
||||||
|
#error "Undefined endian"
|
||||||
|
#endif
|
||||||
|
}__attribute__((packed));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Quic Large Header
|
* Quic Large Header
|
||||||
*/
|
*/
|
||||||
struct quic_lhdr {
|
struct quic_lhdr {
|
||||||
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||||
uint8_t number_length:2;
|
uint8_t type_specific:4;// protected
|
||||||
uint8_t reserved:2;
|
|
||||||
uint8_t type:2;
|
uint8_t type:2;
|
||||||
uint8_t fixed:1;
|
uint8_t fixed:1;
|
||||||
uint8_t form:1;
|
uint8_t form:1;
|
||||||
@@ -63,8 +92,7 @@ struct quic_lhdr {
|
|||||||
uint8_t form:1;
|
uint8_t form:1;
|
||||||
uint8_t fixed:1;
|
uint8_t fixed:1;
|
||||||
uint8_t type:2;
|
uint8_t type:2;
|
||||||
uint8_t reserved:2;
|
uint8_t type_specific:4;// protected
|
||||||
uint8_t number_length:2;
|
|
||||||
#else
|
#else
|
||||||
#error "Undefined endian"
|
#error "Undefined endian"
|
||||||
#endif
|
#endif
|
||||||
@@ -77,9 +105,9 @@ struct quic_lhdr {
|
|||||||
*/
|
*/
|
||||||
struct quic_cids {
|
struct quic_cids {
|
||||||
uint8_t dst_len;
|
uint8_t dst_len;
|
||||||
uint8_t *dst_id;
|
const uint8_t *dst_id;
|
||||||
uint8_t src_len;
|
uint8_t src_len;
|
||||||
uint8_t *src_id;
|
const uint8_t *src_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -89,10 +117,10 @@ struct quic_cids {
|
|||||||
* \qch_len is sizeof(qch) + qci->dst_len + qci->src_id
|
* \qch_len is sizeof(qch) + qci->dst_len + qci->src_id
|
||||||
* \payload is Type-Specific payload (#17.2).
|
* \payload is Type-Specific payload (#17.2).
|
||||||
*/
|
*/
|
||||||
int quic_parse_data(uint8_t *raw_payload, uint32_t raw_payload_len,
|
int quic_parse_data(const uint8_t *raw_payload, uint32_t raw_payload_len,
|
||||||
struct quic_lhdr **qch, uint32_t *qch_len,
|
const struct quic_lhdr **qch, uint32_t *qch_len,
|
||||||
struct quic_cids *qci,
|
struct quic_cids *qci,
|
||||||
uint8_t **payload, uint32_t *plen);
|
const uint8_t **payload, uint32_t *plen);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -103,7 +131,7 @@ int quic_parse_data(uint8_t *raw_payload, uint32_t raw_payload_len,
|
|||||||
* \mlen Used to signal about variable length and validate left length
|
* \mlen Used to signal about variable length and validate left length
|
||||||
* in the buffer.
|
* in the buffer.
|
||||||
*/
|
*/
|
||||||
uint64_t quic_parse_varlength(uint8_t *variable, uint64_t *mlen);
|
uint64_t quic_parse_varlength(const uint8_t *variable, uint64_t *mlen);
|
||||||
|
|
||||||
// quici stands for QUIC Initial
|
// quici stands for QUIC Initial
|
||||||
|
|
||||||
@@ -112,19 +140,48 @@ uint64_t quic_parse_varlength(uint8_t *variable, uint64_t *mlen);
|
|||||||
*/
|
*/
|
||||||
struct quici_hdr {
|
struct quici_hdr {
|
||||||
uint64_t token_len;
|
uint64_t token_len;
|
||||||
uint8_t *token;
|
const uint8_t *token;
|
||||||
uint64_t length;
|
uint64_t length;
|
||||||
uint32_t packet_number;
|
|
||||||
|
const uint8_t *protected_payload; // with packet number
|
||||||
|
|
||||||
|
// RFC 9001 5.4.2
|
||||||
|
uint64_t sample_length;
|
||||||
|
const uint8_t *sample;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses QUIC initial payload.
|
* Checks for quic version and checks if it is supported
|
||||||
* \inpayload is a raw QUIC payload (payload after quic large header)
|
|
||||||
*/
|
*/
|
||||||
int quic_parse_initial_message(uint8_t *inpayload, uint32_t inplen,
|
int64_t quic_get_version(const struct quic_lhdr *qch);
|
||||||
const struct quic_lhdr *qch,
|
|
||||||
struct quici_hdr *qhdr,
|
/**
|
||||||
uint8_t **payload, uint32_t *plen);
|
* Checks quic message to be initial according to version.
|
||||||
|
* 0 on false, 1 on true
|
||||||
|
*/
|
||||||
|
int quic_check_is_initial(const struct quic_lhdr *qch);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses QUIC initial message header.
|
||||||
|
* \inpayload is a QUIC Initial message payload (payload after quic large header)
|
||||||
|
*/
|
||||||
|
int quic_parse_initial_header(const uint8_t *inpayload, uint32_t inplen,
|
||||||
|
struct quici_hdr *qhdr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses and decrypts QUIC Initial Message.
|
||||||
|
*
|
||||||
|
* \quic_header QUIC payload, the start of UDP payload
|
||||||
|
* \udecrypted_payload QUIC decrypted payload. Contains all the QUIC packet, with all headers
|
||||||
|
* \udecrypted_message QUIC decrypted message, typically TLS Client Hello
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int quic_parse_initial_message(
|
||||||
|
const uint8_t *quic_payload, uint32_t quic_plen,
|
||||||
|
uint8_t **udecrypted_payload, uint32_t *udecrypted_payload_len,
|
||||||
|
const uint8_t **udecrypted_message, uint32_t *udecrypted_message_len
|
||||||
|
);
|
||||||
|
|
||||||
// Like fail_packet for TCP
|
// Like fail_packet for TCP
|
||||||
int udp_fail_packet(struct udp_failing_strategy strategy, uint8_t *payload, uint32_t *plen, uint32_t avail_buflen);
|
int udp_fail_packet(struct udp_failing_strategy strategy, uint8_t *payload, uint32_t *plen, uint32_t avail_buflen);
|
||||||
247
src/quic_crypto.c
Normal file
247
src/quic_crypto.c
Normal file
@@ -0,0 +1,247 @@
|
|||||||
|
#include "quic.h"
|
||||||
|
#include "kdf/hkdf.h"
|
||||||
|
#include "hash/sha256.h"
|
||||||
|
#include "cipher/aes.h"
|
||||||
|
#include "cipher_modes/ecb.h"
|
||||||
|
#include "aead/gcm.h"
|
||||||
|
#include "logging.h"
|
||||||
|
|
||||||
|
const uint8_t quic_client_in_info[] = "\0\x20\x0ftls13 client in\0";
|
||||||
|
const uint8_t quic_key_info[] = "\0\x10\x0etls13 quic key\0";
|
||||||
|
const uint8_t quic_iv_info[] = "\0\x0c\x0dtls13 quic iv\0";
|
||||||
|
const uint8_t quic_hp_info[] = "\0\x10\x0dtls13 quic hp\0";
|
||||||
|
const uint8_t quic2_key_info[] = "\0\x10\x10tls13 quicv2 key\0";
|
||||||
|
const uint8_t quic2_iv_info[] = "\0\x0c\x0ftls13 quicv2 iv\0";
|
||||||
|
const uint8_t quic2_hp_info[] = "\0\x10\x0ftls13 quicv2 hp\0";
|
||||||
|
|
||||||
|
int quic_parse_initial_message(
|
||||||
|
const uint8_t *quic_payload, uint32_t quic_plen,
|
||||||
|
uint8_t **udecrypted_payload, uint32_t *udecrypted_payload_len,
|
||||||
|
const uint8_t **udecrypted_message, uint32_t *udecrypted_message_len
|
||||||
|
) {
|
||||||
|
int ret;
|
||||||
|
const struct quic_lhdr *qch;
|
||||||
|
uint32_t qch_len;
|
||||||
|
struct quic_cids qci;
|
||||||
|
const uint8_t *inpayload;
|
||||||
|
uint32_t inplen;
|
||||||
|
struct quici_hdr qich;
|
||||||
|
|
||||||
|
size_t quic_header_len;
|
||||||
|
size_t inheader_len;
|
||||||
|
struct quici_lhdr_typespec qich_ltspc;
|
||||||
|
int packet_number_length;
|
||||||
|
const uint8_t *packet_number = NULL;
|
||||||
|
const uint8_t *protected_payload = NULL;
|
||||||
|
size_t protected_payload_length;
|
||||||
|
|
||||||
|
uint8_t initial_secret[QUIC_INITIAL_SECRET_SIZE];
|
||||||
|
uint8_t client_initial_secret[QUIC_CLIENT_IN_SIZE];
|
||||||
|
uint8_t quic_key[QUIC_KEY_SIZE];
|
||||||
|
uint8_t quic_iv[QUIC_IV_SIZE];
|
||||||
|
uint8_t quic_hp[QUIC_HP_SIZE];
|
||||||
|
uint8_t mask[QUIC_SAMPLE_SIZE];
|
||||||
|
uint8_t *decrypted_payload = NULL;
|
||||||
|
uint32_t decrypted_payload_len;
|
||||||
|
uint8_t *decrypted_packet_number = NULL;
|
||||||
|
uint8_t *dcptr = NULL;
|
||||||
|
// Decrypted plain message without header
|
||||||
|
uint8_t *decrypted_message = NULL;
|
||||||
|
uint32_t decrypted_message_len;
|
||||||
|
AesContext actx;
|
||||||
|
GcmContext gctx;
|
||||||
|
int64_t qversion;
|
||||||
|
const uint8_t *iv_info;
|
||||||
|
uint32_t iv_info_size;
|
||||||
|
const uint8_t *key_info;
|
||||||
|
uint32_t key_info_size;
|
||||||
|
const uint8_t *hp_info;
|
||||||
|
uint32_t hp_info_size;
|
||||||
|
|
||||||
|
ret = quic_parse_data(quic_payload, quic_plen,
|
||||||
|
&qch, &qch_len, &qci, &inpayload, &inplen
|
||||||
|
);
|
||||||
|
|
||||||
|
qversion = quic_get_version(qch);
|
||||||
|
if (!quic_check_is_initial(qch)) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (qversion) {
|
||||||
|
case QUIC_V1:
|
||||||
|
iv_info = quic_iv_info;
|
||||||
|
iv_info_size = sizeof(quic_iv_info) - 1;
|
||||||
|
key_info = quic_key_info;
|
||||||
|
key_info_size = sizeof(quic_key_info) - 1;
|
||||||
|
hp_info = quic_hp_info;
|
||||||
|
hp_info_size = sizeof(quic_hp_info) - 1;
|
||||||
|
break;
|
||||||
|
case QUIC_V2:
|
||||||
|
iv_info = quic2_iv_info;
|
||||||
|
iv_info_size = sizeof(quic2_iv_info) - 1;
|
||||||
|
key_info = quic2_key_info;
|
||||||
|
key_info_size = sizeof(quic2_key_info) - 1;
|
||||||
|
hp_info = quic2_hp_info;
|
||||||
|
hp_info_size = sizeof(quic2_hp_info) - 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
quic_header_len = inpayload - quic_payload;
|
||||||
|
if (ret < 0) {
|
||||||
|
lgerror(ret, "quic_parse_data");
|
||||||
|
goto error_nfr;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = quic_parse_initial_header(inpayload, inplen, &qich);
|
||||||
|
if (ret < 0) {
|
||||||
|
lgerror(ret, "quic_parse_initial_header");
|
||||||
|
goto error_nfr;
|
||||||
|
}
|
||||||
|
|
||||||
|
inheader_len = qich.protected_payload - inpayload;
|
||||||
|
|
||||||
|
decrypted_payload_len = quic_header_len + inplen;
|
||||||
|
decrypted_payload = malloc(decrypted_payload_len);
|
||||||
|
if (decrypted_payload == NULL) {
|
||||||
|
ret = -ENOMEM;
|
||||||
|
goto error_nfr;
|
||||||
|
}
|
||||||
|
dcptr = decrypted_payload;
|
||||||
|
// Copy quic large header
|
||||||
|
memcpy(dcptr, quic_payload, quic_header_len);
|
||||||
|
dcptr += quic_header_len;
|
||||||
|
|
||||||
|
|
||||||
|
// Copy quic initial large header (until packet number)
|
||||||
|
memcpy(dcptr, inpayload, inheader_len);
|
||||||
|
dcptr += inheader_len;
|
||||||
|
|
||||||
|
ret = hkdfExtract(SHA256_HASH_ALGO, (const unsigned char *)qci.dst_id, qci.dst_len, (const unsigned char *)QUIC_INITIAL_SALT_V1, sizeof(QUIC_INITIAL_SALT_V1) - 1, initial_secret);
|
||||||
|
if (ret) {
|
||||||
|
lgerr("hkdfExtract initial_secret: %d", ret);
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = hkdfExpand(SHA256_HASH_ALGO, initial_secret, SHA256_DIGEST_SIZE, quic_client_in_info, sizeof(quic_client_in_info) - 1, client_initial_secret, QUIC_CLIENT_IN_SIZE);
|
||||||
|
if (ret) {
|
||||||
|
lgerr("hkdfExpand client_initial_secret: %d", ret);
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = hkdfExpand(SHA256_HASH_ALGO, client_initial_secret, SHA256_DIGEST_SIZE, key_info, key_info_size, quic_key, QUIC_KEY_SIZE);
|
||||||
|
if (ret) {
|
||||||
|
lgerr("hkdfExpand quic_key: %d", ret);
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = hkdfExpand(SHA256_HASH_ALGO, client_initial_secret, SHA256_DIGEST_SIZE, iv_info, iv_info_size, quic_iv, QUIC_IV_SIZE);
|
||||||
|
if (ret) {
|
||||||
|
lgerr("hkdfExpand quic_iv: %d", ret);
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = hkdfExpand(SHA256_HASH_ALGO, client_initial_secret, SHA256_DIGEST_SIZE, hp_info, hp_info_size, quic_hp, QUIC_HP_SIZE);
|
||||||
|
if (ret) {
|
||||||
|
lgerr("hkdfExpand quic_hp: %d", ret);
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decrypt packet number length and packet number
|
||||||
|
ret = aesInit(&actx, quic_hp, QUIC_HP_SIZE);
|
||||||
|
if (ret) {
|
||||||
|
lgerr("aesInit with quic_hp: %d", ret);
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
ret = ecbEncrypt(&aesCipherAlgo, &actx,
|
||||||
|
qich.sample, mask, qich.sample_length);
|
||||||
|
if (ret) {
|
||||||
|
lgerr("ecbEncrypt for mask: %d", ret);
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update decrypted payload header with decrypted packet_number_length
|
||||||
|
decrypted_payload[0] ^= mask[0] & 0x0f;
|
||||||
|
|
||||||
|
qich_ltspc = (struct quici_lhdr_typespec){decrypted_payload[0]};
|
||||||
|
|
||||||
|
packet_number_length = qich_ltspc.number_length + 1;
|
||||||
|
if (qich.length < packet_number_length) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
packet_number = qich.protected_payload;
|
||||||
|
protected_payload = qich.protected_payload + packet_number_length;
|
||||||
|
protected_payload_length = qich.length - packet_number_length;
|
||||||
|
|
||||||
|
decrypted_packet_number = dcptr;
|
||||||
|
|
||||||
|
for (int i = 0; i < packet_number_length; i++) {
|
||||||
|
decrypted_packet_number[i] = packet_number[i] ^ mask[i + 1];
|
||||||
|
}
|
||||||
|
dcptr += packet_number_length;
|
||||||
|
|
||||||
|
for (int i = QUIC_IV_SIZE - packet_number_length, j = 0;
|
||||||
|
i < QUIC_IV_SIZE; i++, j++) {
|
||||||
|
|
||||||
|
quic_iv[i] ^= decrypted_packet_number[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = aesInit(&actx, quic_key, QUIC_KEY_SIZE);
|
||||||
|
if (ret) {
|
||||||
|
lgerr("aesInit for quic_key: %d", ret);
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
ret = gcmInit(&gctx, &aesCipherAlgo, &actx);
|
||||||
|
if (ret) {
|
||||||
|
lgerr("gcmInit: %d", ret);
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
decrypted_message = dcptr;
|
||||||
|
|
||||||
|
ret = gcmDecrypt(
|
||||||
|
&gctx, quic_iv, QUIC_IV_SIZE,
|
||||||
|
NULL, 0,
|
||||||
|
protected_payload, decrypted_message, protected_payload_length,
|
||||||
|
quic_key, QUIC_KEY_SIZE
|
||||||
|
);
|
||||||
|
if (ret != 0 && ret != ERROR_FAILURE) {
|
||||||
|
lgerr("gcmInit: %d", ret);
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
// TAG is padded in the end of decrypted message
|
||||||
|
decrypted_message_len = protected_payload_length - QUIC_TAG_SIZE;
|
||||||
|
|
||||||
|
if (!udecrypted_payload) {
|
||||||
|
lgerr("decrypted_payload cannot be NULL!");
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
*udecrypted_payload = decrypted_payload;
|
||||||
|
if (udecrypted_payload_len)
|
||||||
|
*udecrypted_payload_len = decrypted_payload_len;
|
||||||
|
if (udecrypted_message)
|
||||||
|
*udecrypted_message = decrypted_message;
|
||||||
|
if (udecrypted_message_len)
|
||||||
|
*udecrypted_message_len = decrypted_message_len;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
error:
|
||||||
|
free(decrypted_payload);
|
||||||
|
error_nfr:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
@@ -8,6 +8,18 @@
|
|||||||
#include <linux/string.h> // IWYU pragma: export
|
#include <linux/string.h> // IWYU pragma: export
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
typedef __u8 uint8_t;
|
||||||
|
typedef __u16 uint16_t;
|
||||||
|
typedef __u32 uint32_t;
|
||||||
|
typedef __u64 uint64_t;
|
||||||
|
typedef __s8 int8_t;
|
||||||
|
typedef __s16 int16_t;
|
||||||
|
typedef __s32 int32_t;
|
||||||
|
typedef __s64 int64_t;
|
||||||
|
|
||||||
|
typedef __s32 int_least32_t; /* integer of >= 32 bits */
|
||||||
|
typedef __s16 int_least16_t; /* integer of >= 16 bits */
|
||||||
#else /* USER_SPACE */
|
#else /* USER_SPACE */
|
||||||
|
|
||||||
#include <errno.h> // IWYU pragma: export
|
#include <errno.h> // IWYU pragma: export
|
||||||
25
uspace.mk
25
uspace.mk
@@ -4,6 +4,8 @@ USE_SYS_LIBS := no
|
|||||||
#Userspace app makes here
|
#Userspace app makes here
|
||||||
BUILD_DIR := $(CURDIR)/build
|
BUILD_DIR := $(CURDIR)/build
|
||||||
DEPSDIR := $(BUILD_DIR)/deps
|
DEPSDIR := $(BUILD_DIR)/deps
|
||||||
|
INCLUDE_DIR := $(CURDIR)/src
|
||||||
|
SRC_DIR := $(CURDIR)/src
|
||||||
|
|
||||||
CC:=gcc
|
CC:=gcc
|
||||||
CCLD:=$(CC)
|
CCLD:=$(CC)
|
||||||
@@ -15,7 +17,7 @@ ifeq ($(USE_SYS_LIBS), no)
|
|||||||
REQ = $(LIBNETFILTER_QUEUE) $(LIBMNL) $(LIBCRYPTO)
|
REQ = $(LIBNETFILTER_QUEUE) $(LIBMNL) $(LIBCRYPTO)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
override CFLAGS += -DPKG_VERSION=\"$(PKG_FULLVERSION)\" -Wall -Wpedantic -Wno-unused-variable -std=gnu99
|
override CFLAGS += -DPKG_VERSION=\"$(PKG_FULLVERSION)\" -I$(INCLUDE_DIR) -Wall -Wpedantic -Wno-unused-variable -std=gnu99 -Ideps/cyclone/include
|
||||||
|
|
||||||
LIBNFNETLINK_CFLAGS := -I$(DEPSDIR)/include
|
LIBNFNETLINK_CFLAGS := -I$(DEPSDIR)/include
|
||||||
LIBNFNETLINK_LIBS := -L$(DEPSDIR)/lib
|
LIBNFNETLINK_LIBS := -L$(DEPSDIR)/lib
|
||||||
@@ -31,13 +33,13 @@ export CC CCLD LD CFLAGS LDFLAGS LIBNFNETLINK_CFLAGS LIBNFNETLINK_LIBS LIBMNL_CF
|
|||||||
|
|
||||||
APP:=$(BUILD_DIR)/youtubeUnblock
|
APP:=$(BUILD_DIR)/youtubeUnblock
|
||||||
|
|
||||||
SRCS := youtubeUnblock.c mangle.c args.c utils.c quic.c tls.c getopt.c
|
SRCS := youtubeUnblock.c mangle.c args.c utils.c quic.c tls.c getopt.c quic_crypto.c
|
||||||
OBJS := $(SRCS:%.c=$(BUILD_DIR)/%.o)
|
OBJS := $(SRCS:%.c=$(BUILD_DIR)/%.o)
|
||||||
|
|
||||||
LIBNFNETLINK := $(DEPSDIR)/lib/libnfnetlink.la
|
LIBNFNETLINK := $(DEPSDIR)/lib/libnfnetlink.la
|
||||||
LIBMNL := $(DEPSDIR)/lib/libmnl.la
|
LIBMNL := $(DEPSDIR)/lib/libmnl.la
|
||||||
LIBNETFILTER_QUEUE := $(DEPSDIR)/lib/libnetfilter_queue.la
|
LIBNETFILTER_QUEUE := $(DEPSDIR)/lib/libnetfilter_queue.la
|
||||||
#LIBCRYPTO := $(DEPSDIR)/lib64/libcrypto.a
|
LIBCYCLONE := $(DEPSDIR)/lib/libcyclone.a
|
||||||
|
|
||||||
.PHONY: default all dev dev_attrs prepare_dirs
|
.PHONY: default all dev dev_attrs prepare_dirs
|
||||||
default: all
|
default: all
|
||||||
@@ -54,12 +56,13 @@ all: prepare_dirs $(APP)
|
|||||||
|
|
||||||
prepare_dirs:
|
prepare_dirs:
|
||||||
mkdir -p $(BUILD_DIR)
|
mkdir -p $(BUILD_DIR)
|
||||||
|
mkdir -p $(BUILD_DIR)/crypto
|
||||||
mkdir -p $(DEPSDIR)
|
mkdir -p $(DEPSDIR)
|
||||||
|
|
||||||
$(LIBCRYPTO):
|
$(LIBCYCLONE):
|
||||||
cd deps/openssl && ./Configure --prefix=$(DEPSDIR) $(if $(CROSS_COMPILE_PLATFORM),--cross-compile-prefix=$(CROSS_COMPILE_PLATFORM)-,) --no-shared
|
$(MAKE) -C deps/cyclone
|
||||||
$(MAKE) -C deps/openssl
|
mkdir -p $(DEPSDIR)/lib
|
||||||
$(MAKE) install_sw -C deps/openssl
|
cp deps/cyclone/libcyclone.a $(DEPSDIR)/lib/libcyclone.a
|
||||||
|
|
||||||
$(LIBNFNETLINK):
|
$(LIBNFNETLINK):
|
||||||
cd deps/libnfnetlink && ./autogen.sh && ./configure --prefix=$(DEPSDIR) $(if $(CROSS_COMPILE_PLATFORM),--host=$(CROSS_COMPILE_PLATFORM),) --enable-static --disable-shared
|
cd deps/libnfnetlink && ./autogen.sh && ./configure --prefix=$(DEPSDIR) $(if $(CROSS_COMPILE_PLATFORM),--host=$(CROSS_COMPILE_PLATFORM),) --enable-static --disable-shared
|
||||||
@@ -76,11 +79,11 @@ $(LIBNETFILTER_QUEUE): $(LIBNFNETLINK) $(LIBMNL)
|
|||||||
$(MAKE) -C deps/libnetfilter_queue
|
$(MAKE) -C deps/libnetfilter_queue
|
||||||
$(MAKE) install -C deps/libnetfilter_queue
|
$(MAKE) install -C deps/libnetfilter_queue
|
||||||
|
|
||||||
$(APP): $(OBJS) $(REQ)
|
$(APP): $(OBJS) $(REQ) $(LIBCYCLONE)
|
||||||
@echo 'CCLD $(APP)'
|
@echo 'CCLD $(APP)'
|
||||||
$(CCLD) $(OBJS) -o $(APP) $(LDFLAGS) -lmnl -lnetfilter_queue -lpthread
|
$(CCLD) $(OBJS) -o $(APP) $(LDFLAGS) -lmnl -lnetfilter_queue -lpthread -lcyclone
|
||||||
|
|
||||||
$(BUILD_DIR)/%.o: %.c $(REQ) config.h
|
$(BUILD_DIR)/%.o: src/%.c $(REQ) $(INCLUDE_DIR)/config.h
|
||||||
@echo 'CC $@'
|
@echo 'CC $@'
|
||||||
$(CC) -c $(CFLAGS) $(LDFLAGS) $< -o $@
|
$(CC) -c $(CFLAGS) $(LDFLAGS) $< -o $@
|
||||||
|
|
||||||
@@ -106,5 +109,5 @@ ifeq ($(USE_SYS_LIBS), no)
|
|||||||
$(MAKE) distclean -C deps/libnetfilter_queue || true
|
$(MAKE) distclean -C deps/libnetfilter_queue || true
|
||||||
$(MAKE) distclean -C deps/libmnl || true
|
$(MAKE) distclean -C deps/libmnl || true
|
||||||
$(MAKE) distclean -C deps/libnfnetlink || true
|
$(MAKE) distclean -C deps/libnfnetlink || true
|
||||||
#$(MAKE) distclean -C deps/openssl || true
|
|
||||||
endif
|
endif
|
||||||
|
$(MAKE) clean -C deps/cyclone || true
|
||||||
|
|||||||
Reference in New Issue
Block a user