diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 8857094..c55f4ac 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -37,7 +37,7 @@ jobs: # A token is used to avoid intermittent spurious job failures caused by rate limiting. - name: Set up Codecov upload token run: | - if [[ "${{ github.repository }}" == "arduino-libraries/ArduinoIoTCloud" ]]; then + if [[ "${{ github.repository }}" == "arduino-libraries/Arduino_CloudUtils" ]]; then # In order to avoid uploads of data from forks, only use the token for runs in the parent repo. # Token is intentionally exposed. # See: https://community.codecov.com/t/upload-issues-unable-to-locate-build-via-github-actions-api/3954 diff --git a/examples/sha256/sha256.ino b/examples/sha256/sha256.ino index 1e904d1..bddbd49 100644 --- a/examples/sha256/sha256.ino +++ b/examples/sha256/sha256.ino @@ -25,7 +25,7 @@ void setup() { Serial.println(hexEncode(sha, sizeof(sha))); /* One-shot */ - arduino::sha256::oneshot(buffer, sizeof(buffer), sha); + arduino::sha256::sha256(buffer, sizeof(buffer), sha); Serial.println(hexEncode(sha, sizeof(sha))); } diff --git a/extras/test/CMakeLists.txt b/extras/test/CMakeLists.txt index 600839e..0916ea6 100644 --- a/extras/test/CMakeLists.txt +++ b/extras/test/CMakeLists.txt @@ -25,11 +25,14 @@ set(TEST_SRCS src/lzss/test_decoder.cpp src/crc32/test_crc32.cpp src/crc16/test_crc16.cpp + src/sha256/test_sha256.cpp ) set(TEST_DUT_SRCS ../../src/crc/crc32.cpp ../../src/crc/crc16.cpp + ../../src/sha256/SHA256.cpp + ../../src/sha256/sha2.c ) ########################################################################## diff --git a/extras/test/src/sha256/test_sha256.cpp b/extras/test/src/sha256/test_sha256.cpp new file mode 100644 index 0000000..216d732 --- /dev/null +++ b/extras/test/src/sha256/test_sha256.cpp @@ -0,0 +1,102 @@ +/* + This file is part of the Arduino_CloudUtils library. + + Copyright (c) 2024 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#include <catch2/catch_test_macros.hpp> + +#include <sha256/SHA256.h> +#include <stdio.h> + +#define SHA256_DIGEST_SIZE ( 256 / 8) +#define SHA512_DIGEST_SIZE ( 512 / 8) + +#ifdef TEST_VECTORS_LONG +static void test_sha256_long_message(uint8_t *digest) +{ + sha256_ctx ctx; + uint8_t message[1000]; + int i; + + memset(message, 'a', sizeof (message)); + + arduino::sha256::begin(&ctx); + for (i = 0; i < 10000000; i++) { + arduino::sha256::update(&ctx, message, sizeof (message)); + } + arduino::sha256::finalize(&ctx, digest); +} +#endif + +static void test_sha256_message4(uint8_t *digest) +{ + /* Message of 929271 bytes */ + sha256_ctx ctx; + uint8_t message[1000]; + int i; + + memset(message, 'a', sizeof (message)); + arduino::sha256::begin(&ctx); + for (i = 0; i < 929; i++) { + arduino::sha256::update(&ctx, message, sizeof (message)); + } + arduino::sha256::update(&ctx, message, 271); + arduino::sha256::finalize(&ctx, digest); +} + +static int test(const char *vector, uint8_t *digest, uint32_t digest_size) +{ + char output[2 * SHA512_DIGEST_SIZE + 1]; + int i; + + output[2 * digest_size] = '\0'; + for (i = 0; i < (int) digest_size ; i++) { + sprintf(output + 2 * i, "%02x", digest[i]); + } + + //printf("H: %s\n", output); + return strcmp(vector, output); +} + +SCENARIO( "FIPS 180-2 Validation tests" ) { + static const char *vectors[1][5] = + { /* SHA-256 */ + { + "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad", + "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1", + "cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0", + "8c14f43ad81026351e9b60025b5420e6072ff617f5c72145b179599211514947", + "53748286337dbe36f5df22e7ef1af3ad71530398cf569adc7eb5fefa7af7003c", + } + }; + + static const char message1[] = "abc"; + static const char message2[] = "abcdbcdecdefdefgefghfghighijhi" + "jkijkljklmklmnlmnomnopnopq"; + uint8_t *message3; + uint32_t message3_len = 1000000; + uint8_t digest[SHA512_DIGEST_SIZE]; + + message3 = (uint8_t *)malloc(message3_len); + REQUIRE(message3 != nullptr); + memset(message3, 'a', message3_len); + + arduino::sha256::sha256((const uint8_t *) message1, strlen(message1), digest); + REQUIRE(test(vectors[0][0], digest, SHA256_DIGEST_SIZE) == 0); + arduino::sha256::sha256((const uint8_t *) message2, strlen(message2), digest); + REQUIRE(test(vectors[0][1], digest, SHA256_DIGEST_SIZE) == 0); + arduino::sha256::sha256(message3, message3_len, digest); + REQUIRE(test(vectors[0][2], digest, SHA256_DIGEST_SIZE) == 0); + test_sha256_message4(digest); + REQUIRE(test(vectors[0][3], digest, SHA256_DIGEST_SIZE) == 0); +#ifdef TEST_VECTORS_LONG + test_sha256_long_message(digest); + REQUIRE(test(vectors[0][4], digest, SHA256_DIGEST_SIZE) == 0); +#endif + free(message3); +} diff --git a/src/bpid/bpid.cpp b/src/bpid/bpid.cpp index 74c5705..f7425c6 100644 --- a/src/bpid/bpid.cpp +++ b/src/bpid/bpid.cpp @@ -39,7 +39,7 @@ namespace arduino { namespace bpid { return String(""); } uint8_t out[SHA256::HASH_SIZE]; - arduino::sha256::oneshot(data, sizeof(data), out); + arduino::sha256::sha256(data, sizeof(data), out); return arduino::hex::encode(out, sizeof(out)); } diff --git a/src/sha256/SHA256.h b/src/sha256/SHA256.h index d10ed49..a69dda2 100644 --- a/src/sha256/SHA256.h +++ b/src/sha256/SHA256.h @@ -38,7 +38,7 @@ namespace arduino { namespace sha256 { inline void finalize(sha256_ctx * ctx, uint8_t digest[SHA256_DIGEST_SIZE]) { return sha256_final(ctx, digest); } - inline void oneshot(const unsigned char *input, unsigned int ilen, unsigned char *output) { + inline void sha256(const unsigned char *input, unsigned int ilen, unsigned char *output) { ::sha256(input, ilen, output); }