From 8bc5bb23ff963e6a033ff33058d319188266ce2c Mon Sep 17 00:00:00 2001 From: Max Tropets Date: Fri, 24 Apr 2026 14:57:10 +0000 Subject: [PATCH 1/3] CBOR fuzzing --- .github/workflows/long-test.yml | 11 ++++++ CMakeLists.txt | 9 +++++ cmake/common.cmake | 17 +++++++++ cmake/preproject.cmake | 5 +++ src/crypto/test/cbor_fuzz.cpp | 35 ++++++++++++++++++ src/crypto/test/cbor_fuzz_corpus/array123 | 1 + .../test/cbor_fuzz_corpus/array_of_maps | 1 + .../test/cbor_fuzz_corpus/array_with_map | 1 + src/crypto/test/cbor_fuzz_corpus/bstr_hello | 1 + .../test/cbor_fuzz_corpus/complex_array_map | 1 + src/crypto/test/cbor_fuzz_corpus/cose_receipt | Bin 0 -> 435 bytes .../test/cbor_fuzz_corpus/cose_sign1_detached | Bin 0 -> 152 bytes .../test/cbor_fuzz_corpus/cose_sign1_flat | Bin 0 -> 152 bytes .../test/cbor_fuzz_corpus/cose_sign1_nested | Bin 0 -> 150 bytes .../test/cbor_fuzz_corpus/deeply_nested_array | 1 + src/crypto/test/cbor_fuzz_corpus/empty | 0 src/crypto/test/cbor_fuzz_corpus/empty_array | 1 + src/crypto/test/cbor_fuzz_corpus/empty_bytes | 1 + src/crypto/test/cbor_fuzz_corpus/empty_map | 1 + src/crypto/test/cbor_fuzz_corpus/empty_string | 1 + .../test/cbor_fuzz_corpus/header_map_footer | 1 + src/crypto/test/cbor_fuzz_corpus/int64_max | 1 + src/crypto/test/cbor_fuzz_corpus/int64_min | 1 + .../test/cbor_fuzz_corpus/int64_overflow | Bin 0 -> 9 bytes src/crypto/test/cbor_fuzz_corpus/int_widths | Bin 0 -> 18 bytes src/crypto/test/cbor_fuzz_corpus/map1234 | 1 + .../test/cbor_fuzz_corpus/map_bool_vals | 1 + .../test/cbor_fuzz_corpus/map_multi_arrays | 1 + src/crypto/test/cbor_fuzz_corpus/map_neg_keys | 1 + src/crypto/test/cbor_fuzz_corpus/map_str_str | 1 + .../test/cbor_fuzz_corpus/map_with_array | 1 + src/crypto/test/cbor_fuzz_corpus/mixed_array | 1 + src/crypto/test/cbor_fuzz_corpus/negint1 | 1 + .../test/cbor_fuzz_corpus/nested_arrays | 1 + src/crypto/test/cbor_fuzz_corpus/nested_tags | 1 + src/crypto/test/cbor_fuzz_corpus/simple_false | 1 + src/crypto/test/cbor_fuzz_corpus/simple_null | 1 + src/crypto/test/cbor_fuzz_corpus/simple_true | 1 + .../test/cbor_fuzz_corpus/simple_undefined | 1 + src/crypto/test/cbor_fuzz_corpus/tagged_array | 1 + src/crypto/test/cbor_fuzz_corpus/tagged_bool | 1 + src/crypto/test/cbor_fuzz_corpus/tagged_bytes | 1 + .../test/cbor_fuzz_corpus/tagged_empty_array | 1 + src/crypto/test/cbor_fuzz_corpus/tagged_int | 1 + src/crypto/test/cbor_fuzz_corpus/tagged_map | 1 + .../test/cbor_fuzz_corpus/tagged_string | 1 + src/crypto/test/cbor_fuzz_corpus/tstr_hello | 1 + src/crypto/test/cbor_fuzz_corpus/uint42 | 1 + 48 files changed, 113 insertions(+) create mode 100644 src/crypto/test/cbor_fuzz.cpp create mode 100644 src/crypto/test/cbor_fuzz_corpus/array123 create mode 100644 src/crypto/test/cbor_fuzz_corpus/array_of_maps create mode 100644 src/crypto/test/cbor_fuzz_corpus/array_with_map create mode 100644 src/crypto/test/cbor_fuzz_corpus/bstr_hello create mode 100644 src/crypto/test/cbor_fuzz_corpus/complex_array_map create mode 100644 src/crypto/test/cbor_fuzz_corpus/cose_receipt create mode 100644 src/crypto/test/cbor_fuzz_corpus/cose_sign1_detached create mode 100644 src/crypto/test/cbor_fuzz_corpus/cose_sign1_flat create mode 100644 src/crypto/test/cbor_fuzz_corpus/cose_sign1_nested create mode 100644 src/crypto/test/cbor_fuzz_corpus/deeply_nested_array create mode 100644 src/crypto/test/cbor_fuzz_corpus/empty create mode 100644 src/crypto/test/cbor_fuzz_corpus/empty_array create mode 100644 src/crypto/test/cbor_fuzz_corpus/empty_bytes create mode 100644 src/crypto/test/cbor_fuzz_corpus/empty_map create mode 100644 src/crypto/test/cbor_fuzz_corpus/empty_string create mode 100644 src/crypto/test/cbor_fuzz_corpus/header_map_footer create mode 100644 src/crypto/test/cbor_fuzz_corpus/int64_max create mode 100644 src/crypto/test/cbor_fuzz_corpus/int64_min create mode 100644 src/crypto/test/cbor_fuzz_corpus/int64_overflow create mode 100644 src/crypto/test/cbor_fuzz_corpus/int_widths create mode 100644 src/crypto/test/cbor_fuzz_corpus/map1234 create mode 100644 src/crypto/test/cbor_fuzz_corpus/map_bool_vals create mode 100644 src/crypto/test/cbor_fuzz_corpus/map_multi_arrays create mode 100644 src/crypto/test/cbor_fuzz_corpus/map_neg_keys create mode 100644 src/crypto/test/cbor_fuzz_corpus/map_str_str create mode 100644 src/crypto/test/cbor_fuzz_corpus/map_with_array create mode 100644 src/crypto/test/cbor_fuzz_corpus/mixed_array create mode 100644 src/crypto/test/cbor_fuzz_corpus/negint1 create mode 100644 src/crypto/test/cbor_fuzz_corpus/nested_arrays create mode 100644 src/crypto/test/cbor_fuzz_corpus/nested_tags create mode 100644 src/crypto/test/cbor_fuzz_corpus/simple_false create mode 100644 src/crypto/test/cbor_fuzz_corpus/simple_null create mode 100644 src/crypto/test/cbor_fuzz_corpus/simple_true create mode 100644 src/crypto/test/cbor_fuzz_corpus/simple_undefined create mode 100644 src/crypto/test/cbor_fuzz_corpus/tagged_array create mode 100644 src/crypto/test/cbor_fuzz_corpus/tagged_bool create mode 100644 src/crypto/test/cbor_fuzz_corpus/tagged_bytes create mode 100644 src/crypto/test/cbor_fuzz_corpus/tagged_empty_array create mode 100644 src/crypto/test/cbor_fuzz_corpus/tagged_int create mode 100644 src/crypto/test/cbor_fuzz_corpus/tagged_map create mode 100644 src/crypto/test/cbor_fuzz_corpus/tagged_string create mode 100644 src/crypto/test/cbor_fuzz_corpus/tstr_hello create mode 100644 src/crypto/test/cbor_fuzz_corpus/uint42 diff --git a/.github/workflows/long-test.yml b/.github/workflows/long-test.yml index e9629da6c918..a9ef4f106a59 100644 --- a/.github/workflows/long-test.yml +++ b/.github/workflows/long-test.yml @@ -65,6 +65,17 @@ jobs: cd build ./tests.sh --output-on-failure --timeout 1600 -LE "benchmark" + - name: "Run CBOR fuzz test" + run: | + set -o pipefail + set -ex + mkdir -p build_fuzz + cd build_fuzz + cmake -GNinja -DFUZZING=ON -DUSE_SNMALLOC=OFF -DBUILD_TESTS=ON -DCOMPILE_TARGET=virtual .. + ninja cbor_fuzz_test + mkdir -p /tmp/cbor_fuzz_live + ./cbor_fuzz_test /tmp/cbor_fuzz_live ../src/crypto/test/cbor_fuzz_corpus -max_total_time=30 + - name: "Upload logs" if: success() || failure() uses: actions/upload-artifact@v7 diff --git a/CMakeLists.txt b/CMakeLists.txt index 84da67ac8afa..eb1a6aca5ae3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -677,6 +677,15 @@ if(BUILD_TESTS) target_include_directories(cbor_test PRIVATE ${CCFCRYPTO_INC}) target_link_libraries(cbor_test PRIVATE ccfcrypto) + if(FUZZING) + add_fuzz_test( + cbor_fuzz_test + ${CMAKE_CURRENT_SOURCE_DIR}/src/crypto/cbor.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/crypto/test/cbor_fuzz.cpp + ) + target_link_libraries(cbor_fuzz_test PRIVATE evercbor) + endif() + add_unit_test( sharing_test ${CMAKE_CURRENT_SOURCE_DIR}/src/crypto/test/secret_sharing.cpp diff --git a/cmake/common.cmake b/cmake/common.cmake index 98cb90e703de..3a4619afdc07 100644 --- a/cmake/common.cmake +++ b/cmake/common.cmake @@ -52,6 +52,23 @@ function(add_unit_test name) add_san_test_properties(${name}) endfunction() +# Fuzz test wrapper (requires -DFUZZING=ON) +function(add_fuzz_test name) + add_executable(${name} ${CCF_DIR}/src/enclave/thread_local.cpp ${ARGN}) + target_compile_options(${name} PRIVATE ${COMPILE_LIBCXX} -fsanitize=fuzzer) + target_link_options(${name} PRIVATE -fsanitize=fuzzer) + target_include_directories(${name} PRIVATE src ${CCFCRYPTO_INC}) + target_link_libraries(${name} PRIVATE ${LINK_LIBCXX} -pthread) + add_san(${name}) + + # Disable UBSAN's vptr check: libstdc++'s shared_ptr triggers a false + # positive where _S_atomic and (_Lock_policy)2 are the same enum value + # but UBSAN sees different type names. Must come after add_san() so that + # -fno-sanitize=vptr is not overridden by -fsanitize=undefined. + target_compile_options(${name} PRIVATE -fno-sanitize=vptr) + target_link_options(${name} PRIVATE -fno-sanitize=vptr) +endfunction() + # Test binary wrapper function(add_test_bin name) add_executable(${name} ${CCF_DIR}/src/enclave/thread_local.cpp ${ARGN}) diff --git a/cmake/preproject.cmake b/cmake/preproject.cmake index 330eee587b06..bd20fdb337cf 100644 --- a/cmake/preproject.cmake +++ b/cmake/preproject.cmake @@ -57,6 +57,11 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) endif() option(TSAN "Enable Thread Sanitizers" OFF) +option(FUZZING "Enable libFuzzer fuzz testing" OFF) + +if(FUZZING AND TSAN) + message(FATAL_ERROR "FUZZING and TSAN cannot be enabled together") +endif() option(COLORED_OUTPUT "Always produce ANSI-colored output." ON) diff --git a/src/crypto/test/cbor_fuzz.cpp b/src/crypto/test/cbor_fuzz.cpp new file mode 100644 index 000000000000..fde45e0bab9b --- /dev/null +++ b/src/crypto/test/cbor_fuzz.cpp @@ -0,0 +1,35 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the Apache 2.0 License. + +#include "crypto/cbor.h" + +#include +#include +#include + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) +{ + ccf::cbor::Value value; + try + { + value = ccf::cbor::parse({data, size}); + } + catch (const ccf::cbor::CBORDecodeError&) + { + return 0; + } + + // If parse succeeded, exercise serialization round-trip and string + // rendering. Any failure here is a real bug — let the fuzzer surface it. + std::ignore = ccf::cbor::to_string(value); + auto serialized = ccf::cbor::serialize(value); + auto reparsed = ccf::cbor::parse(serialized); + auto reserialized = ccf::cbor::serialize(reparsed); + + if (serialized != reserialized) + { + __builtin_trap(); + } + + return 0; +} diff --git a/src/crypto/test/cbor_fuzz_corpus/array123 b/src/crypto/test/cbor_fuzz_corpus/array123 new file mode 100644 index 000000000000..4cdf6ce18a82 --- /dev/null +++ b/src/crypto/test/cbor_fuzz_corpus/array123 @@ -0,0 +1 @@ +ƒ \ No newline at end of file diff --git a/src/crypto/test/cbor_fuzz_corpus/array_of_maps b/src/crypto/test/cbor_fuzz_corpus/array_of_maps new file mode 100644 index 000000000000..c3c8fd6e58ba --- /dev/null +++ b/src/crypto/test/cbor_fuzz_corpus/array_of_maps @@ -0,0 +1 @@ +ƒ¡ax¡ay¡az \ No newline at end of file diff --git a/src/crypto/test/cbor_fuzz_corpus/array_with_map b/src/crypto/test/cbor_fuzz_corpus/array_with_map new file mode 100644 index 000000000000..b4f56d78ccc9 --- /dev/null +++ b/src/crypto/test/cbor_fuzz_corpus/array_with_map @@ -0,0 +1 @@ +ƒ¡aa \ No newline at end of file diff --git a/src/crypto/test/cbor_fuzz_corpus/bstr_hello b/src/crypto/test/cbor_fuzz_corpus/bstr_hello new file mode 100644 index 000000000000..e29f61003054 --- /dev/null +++ b/src/crypto/test/cbor_fuzz_corpus/bstr_hello @@ -0,0 +1 @@ +Ehello \ No newline at end of file diff --git a/src/crypto/test/cbor_fuzz_corpus/complex_array_map b/src/crypto/test/cbor_fuzz_corpus/complex_array_map new file mode 100644 index 000000000000..babbd2c030f4 --- /dev/null +++ b/src/crypto/test/cbor_fuzz_corpus/complex_array_map @@ -0,0 +1 @@ +ƒõ£ecount*elabeleitemsfactiveõö \ No newline at end of file diff --git a/src/crypto/test/cbor_fuzz_corpus/cose_receipt b/src/crypto/test/cbor_fuzz_corpus/cose_receipt new file mode 100644 index 0000000000000000000000000000000000000000..729ab75d1a1f92e7bbf927f934bdb7cd1c9d8df0 GIT binary patch literal 435 zcmccA64A4i(L#wO!oeiP(#Rmy)G#I4(!k8j+}JGD#Ms!}B015}#KlsEGaEYO-oKr(RMY4HnN|J#^ zqN$N(a-xyBQDRz>L6TvrSxTa%r9qN$a-z9$TB@NzigBuGnn{vrnsJ(uVWMfGNt%Uu znwfcWgaQKrz|`3EHA3Nf$;tcgPNq~WsI2dKe7z;5tit$0(C>=t+S+|@mnteoeTztN z&G@e~*_3}_<9;TIY_-cD+%=ZTUwW@IxnpTi#@p`i9n1Ez?O!wsi>{HbxdUzL7KS9MVPN)=BEi!dlEI$ptZ*UY& z(+!i)Rd=&=E+vf;X}8EHzmrfO29KEuK>Ja*j_IR&ymxZxDUnc5;^a6)5aUY>r7JdU+^D4thL zUQY@pWQ#)s8*8$k?xV%<+McSkevUmpl=oLd;INJ5&{0XIp}~SL>6L6g-|*b{0D1ek G1FRHr;YTz8 literal 0 HcmV?d00001 diff --git a/src/crypto/test/cbor_fuzz_corpus/cose_sign1_nested b/src/crypto/test/cbor_fuzz_corpus/cose_sign1_nested new file mode 100644 index 0000000000000000000000000000000000000000..b13c1bcd511c43810af97ab9501b2f219d5a8548 GIT binary patch literal 150 zcmV;H0BQfygjgw~0XQNLp#~adQ}F<1V`FA6b}^xFWpHm}XfAVfVRCdXba-iGV=^u= zphbcKf&v3rV97yy1SDQH)7c_uhP(mA75AkknnqZrH_Yi+9-r_YC*dF=a&!{GUvjEA zj<9IQI$fjNfsp)5&{DC&7fz@v8tM`x34V_5$TU`U>#T)Gc=z%{Ph~uP>XUmx1gmRu E?Sn=@d;kCd literal 0 HcmV?d00001 diff --git a/src/crypto/test/cbor_fuzz_corpus/deeply_nested_array b/src/crypto/test/cbor_fuzz_corpus/deeply_nested_array new file mode 100644 index 000000000000..47ac41671d59 --- /dev/null +++ b/src/crypto/test/cbor_fuzz_corpus/deeply_nested_array @@ -0,0 +1 @@ +„‚‚‚ \ No newline at end of file diff --git a/src/crypto/test/cbor_fuzz_corpus/empty b/src/crypto/test/cbor_fuzz_corpus/empty new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/src/crypto/test/cbor_fuzz_corpus/empty_array b/src/crypto/test/cbor_fuzz_corpus/empty_array new file mode 100644 index 000000000000..5416677bc7da --- /dev/null +++ b/src/crypto/test/cbor_fuzz_corpus/empty_array @@ -0,0 +1 @@ +€ \ No newline at end of file diff --git a/src/crypto/test/cbor_fuzz_corpus/empty_bytes b/src/crypto/test/cbor_fuzz_corpus/empty_bytes new file mode 100644 index 000000000000..b516b2c489f1 --- /dev/null +++ b/src/crypto/test/cbor_fuzz_corpus/empty_bytes @@ -0,0 +1 @@ +@ \ No newline at end of file diff --git a/src/crypto/test/cbor_fuzz_corpus/empty_map b/src/crypto/test/cbor_fuzz_corpus/empty_map new file mode 100644 index 000000000000..eea1bf0c31f3 --- /dev/null +++ b/src/crypto/test/cbor_fuzz_corpus/empty_map @@ -0,0 +1 @@ +  \ No newline at end of file diff --git a/src/crypto/test/cbor_fuzz_corpus/empty_string b/src/crypto/test/cbor_fuzz_corpus/empty_string new file mode 100644 index 000000000000..64845fb7679e --- /dev/null +++ b/src/crypto/test/cbor_fuzz_corpus/empty_string @@ -0,0 +1 @@ +` \ No newline at end of file diff --git a/src/crypto/test/cbor_fuzz_corpus/header_map_footer b/src/crypto/test/cbor_fuzz_corpus/header_map_footer new file mode 100644 index 000000000000..1f13ce2d5fe1 --- /dev/null +++ b/src/crypto/test/cbor_fuzz_corpus/header_map_footer @@ -0,0 +1 @@ +ƒfheader¢bid{dnamedtestffooter \ No newline at end of file diff --git a/src/crypto/test/cbor_fuzz_corpus/int64_max b/src/crypto/test/cbor_fuzz_corpus/int64_max new file mode 100644 index 000000000000..32c451a3f95f --- /dev/null +++ b/src/crypto/test/cbor_fuzz_corpus/int64_max @@ -0,0 +1 @@ +ÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/src/crypto/test/cbor_fuzz_corpus/int64_min b/src/crypto/test/cbor_fuzz_corpus/int64_min new file mode 100644 index 000000000000..62bd9681dc34 --- /dev/null +++ b/src/crypto/test/cbor_fuzz_corpus/int64_min @@ -0,0 +1 @@ +;ÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/src/crypto/test/cbor_fuzz_corpus/int64_overflow b/src/crypto/test/cbor_fuzz_corpus/int64_overflow new file mode 100644 index 0000000000000000000000000000000000000000..bd19232503e224be15686a025b592562a4e90b5d GIT binary patch literal 9 Lcmb1cV1NJs1pEM; literal 0 HcmV?d00001 diff --git a/src/crypto/test/cbor_fuzz_corpus/int_widths b/src/crypto/test/cbor_fuzz_corpus/int_widths new file mode 100644 index 0000000000000000000000000000000000000000..626802657fd37e743e84bb7dd1221e5907c18d2f GIT binary patch literal 18 XcmZo?5SIV~Nk#_A|No^J7#SD Date: Mon, 27 Apr 2026 13:30:36 +0000 Subject: [PATCH 2/3] LIBC instead of hacking vptr --- .github/workflows/long-test.yml | 23 ++++++++++++----------- cmake/common.cmake | 16 ++++++++-------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/.github/workflows/long-test.yml b/.github/workflows/long-test.yml index a9ef4f106a59..6f2b7bdb68b9 100644 --- a/.github/workflows/long-test.yml +++ b/.github/workflows/long-test.yml @@ -65,17 +65,6 @@ jobs: cd build ./tests.sh --output-on-failure --timeout 1600 -LE "benchmark" - - name: "Run CBOR fuzz test" - run: | - set -o pipefail - set -ex - mkdir -p build_fuzz - cd build_fuzz - cmake -GNinja -DFUZZING=ON -DUSE_SNMALLOC=OFF -DBUILD_TESTS=ON -DCOMPILE_TARGET=virtual .. - ninja cbor_fuzz_test - mkdir -p /tmp/cbor_fuzz_live - ./cbor_fuzz_test /tmp/cbor_fuzz_live ../src/crypto/test/cbor_fuzz_corpus -max_total_time=30 - - name: "Upload logs" if: success() || failure() uses: actions/upload-artifact@v7 @@ -201,6 +190,18 @@ jobs: cd build ./tests.sh --output-on-failure --timeout 1600 -LE "benchmark" + - name: "Run CBOR fuzz test" + run: | + set -o pipefail + set -ex + mkdir -p build_fuzz + cd build_fuzz + rm -f CMakeCache.txt + cmake -GNinja -DFUZZING=ON -DSAN=ON -DUSE_LIBCXX=ON -DUSE_SNMALLOC=OFF .. + ninja cbor_fuzz_test + mkdir -p /tmp/cbor_fuzz_live + ./cbor_fuzz_test /tmp/cbor_fuzz_live ../src/crypto/test/cbor_fuzz_corpus -max_total_time=60 + - name: "Upload logs" if: success() || failure() uses: actions/upload-artifact@v7 diff --git a/cmake/common.cmake b/cmake/common.cmake index 3a4619afdc07..15b2e0a87c45 100644 --- a/cmake/common.cmake +++ b/cmake/common.cmake @@ -52,21 +52,21 @@ function(add_unit_test name) add_san_test_properties(${name}) endfunction() -# Fuzz test wrapper (requires -DFUZZING=ON) +# Fuzz test wrapper (requires -DFUZZING=ON -DUSE_LIBCXX=ON) function(add_fuzz_test name) + if(NOT USE_LIBCXX) + message( + FATAL_ERROR + "Fuzz targets require USE_LIBCXX=ON to avoid UBSAN false positives from libstdc++ shared_ptr" + ) + endif() + add_executable(${name} ${CCF_DIR}/src/enclave/thread_local.cpp ${ARGN}) target_compile_options(${name} PRIVATE ${COMPILE_LIBCXX} -fsanitize=fuzzer) target_link_options(${name} PRIVATE -fsanitize=fuzzer) target_include_directories(${name} PRIVATE src ${CCFCRYPTO_INC}) target_link_libraries(${name} PRIVATE ${LINK_LIBCXX} -pthread) add_san(${name}) - - # Disable UBSAN's vptr check: libstdc++'s shared_ptr triggers a false - # positive where _S_atomic and (_Lock_policy)2 are the same enum value - # but UBSAN sees different type names. Must come after add_san() so that - # -fno-sanitize=vptr is not overridden by -fsanitize=undefined. - target_compile_options(${name} PRIVATE -fno-sanitize=vptr) - target_link_options(${name} PRIVATE -fno-sanitize=vptr) endfunction() # Test binary wrapper From 4523003af8d3be677e9a4c9245a7cd7fb5add922 Mon Sep 17 00:00:00 2001 From: Max Tropets Date: Mon, 27 Apr 2026 13:35:03 +0000 Subject: [PATCH 3/3] Gitattrs --- .gitattributes | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitattributes b/.gitattributes index 41cd99414353..05028087a749 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,6 +3,8 @@ *.png binary *.jpg binary +src/crypto/test/cbor_fuzz_corpus/* binary + *.h linguist-language=C++ *.cpp linguist-language=C++