From d238606b755549cfa1bb713cd68ca05d6f7a8395 Mon Sep 17 00:00:00 2001 From: lolo859 Date: Wed, 27 May 2026 19:34:54 +0200 Subject: [PATCH] Vystem 0.2 --- Blastproof/blastproof.dsc | 5 +- Blastproof/blastproof.json | 73 + Blastproof/bootanim/bootanim.cpp | 4 + Blastproof/bootanim/bootanim.json | 94 + Blastproof/bootloader.json | 43 + .../{initfsgen => common_crypto}/address.c | 2 +- Blastproof/common_crypto/address.h | 51 + Blastproof/common_crypto/api.h | 77 + .../argon2/src => common_crypto}/argon2.c | 0 Blastproof/common_crypto/argon2.h | 437 + .../blake2/blake2-impl.h | 0 .../src => common_crypto}/blake2/blake2.h | 2 +- .../src => common_crypto}/blake2/blake2b.c | 0 .../blake2/blamka-round-opt.h | 0 .../blake2/blamka-round-ref.h | 0 Blastproof/common_crypto/common_crypto.json | 140 + Blastproof/common_crypto/context.h | 28 + .../argon2/src => common_crypto}/core.c | 0 .../argon2/src => common_crypto}/core.h | 0 .../argon2/src => common_crypto}/encoding.c | 0 .../argon2/src => common_crypto}/encoding.h | 0 .../{initfsgen => common_crypto}/fors.c | 0 Blastproof/common_crypto/fors.h | 32 + Blastproof/common_crypto/hash.h | 27 + .../{initfsgen => common_crypto}/hash_sha2.c | 0 .../{initfsgen => common_crypto}/merkle.c | 0 Blastproof/common_crypto/merkle.h | 18 + .../argon2/src => common_crypto}/opt.c | 0 Blastproof/common_crypto/params.h | 3 + .../params/params-sphincs-sha2-256f.h | 85 + .../randombytes.c | 0 Blastproof/common_crypto/randombytes.h | 6 + .../{initfsgen => common_crypto}/sha2.c | 0 Blastproof/common_crypto/sha2.h | 43 + Blastproof/common_crypto/sha2_offsets.h | 20 + .../{initfsgen => common_crypto}/sha3.c | 0 Blastproof/common_crypto/sha3.h | 46 + .../{initfsgen => common_crypto}/sign.c | 0 Blastproof/common_crypto/thash.h | 13 + .../thash_sha2_robust.c | 0 .../thash_sha2_simple.c | 0 .../argon2/src => common_crypto}/thread.c | 0 .../argon2/src => common_crypto}/thread.h | 0 .../{initfsgen => common_crypto}/utils.c | 0 Blastproof/common_crypto/utils.h | 64 + .../{initfsgen => common_crypto}/utilsx1.c | 0 Blastproof/common_crypto/utilsx1.h | 26 + .../{initfsgen => common_crypto}/wots.c | 0 Blastproof/common_crypto/wots.h | 25 + .../{initfsgen => common_crypto}/wotsx1.c | 0 Blastproof/common_crypto/wotsx1.h | 36 + .../{bp_template.conf => bp_template.cfg} | 5 +- Blastproof/config/config.json | 24 + Blastproof/config/config_patch.sh | 8 + Blastproof/edk2.json | 81 + Blastproof/fontgen/fontgen.json | 92 + Blastproof/initfsgen/initfsgen.cpp | 17 +- Blastproof/initfsgen/initfsgen.json | 108 + Blastproof/keygen/address.c | 104 - Blastproof/keygen/address.o | Bin 2784 -> 0 bytes Blastproof/keygen/argon2/Argon2.sln | 158 - Blastproof/keygen/argon2/CHANGELOG.md | 32 - Blastproof/keygen/argon2/LICENSE | 314 - Blastproof/keygen/argon2/Makefile | 255 - Blastproof/keygen/argon2/Package.swift | 46 - Blastproof/keygen/argon2/README.md | 303 - Blastproof/keygen/argon2/argon2 | Bin 221152 -> 0 bytes Blastproof/keygen/argon2/argon2-specs.pdf | Bin 459608 -> 0 bytes Blastproof/keygen/argon2/kats/argon2d | 12304 -------- Blastproof/keygen/argon2/kats/argon2d.shasum | 1 - Blastproof/keygen/argon2/kats/argon2d_v16 | 12304 -------- .../keygen/argon2/kats/argon2d_v16.shasum | 1 - Blastproof/keygen/argon2/kats/argon2i | 12304 -------- Blastproof/keygen/argon2/kats/argon2i.shasum | 1 - Blastproof/keygen/argon2/kats/argon2i_v16 | 12304 -------- .../keygen/argon2/kats/argon2i_v16.shasum | 1 - Blastproof/keygen/argon2/kats/argon2id | 12304 -------- Blastproof/keygen/argon2/kats/argon2id.shasum | 1 - Blastproof/keygen/argon2/kats/argon2id_v16 | 12304 -------- .../keygen/argon2/kats/argon2id_v16.shasum | 1 - Blastproof/keygen/argon2/kats/check-sums.ps1 | 42 - Blastproof/keygen/argon2/kats/check-sums.sh | 13 - Blastproof/keygen/argon2/kats/test.ps1 | 50 - Blastproof/keygen/argon2/kats/test.sh | 49 - Blastproof/keygen/argon2/libargon2.pc | 13 - Blastproof/keygen/argon2/libargon2.pc.in | 18 - Blastproof/keygen/argon2/libargon2.so.1 | Bin 177160 -> 0 bytes Blastproof/keygen/argon2/man/argon2.1 | 57 - Blastproof/keygen/argon2/src/argon2.o | Bin 59208 -> 0 bytes Blastproof/keygen/argon2/src/bench.c | 111 - Blastproof/keygen/argon2/src/blake2/blake2b.o | Bin 41456 -> 0 bytes Blastproof/keygen/argon2/src/core.o | Bin 37976 -> 0 bytes Blastproof/keygen/argon2/src/encoding.o | Bin 25064 -> 0 bytes Blastproof/keygen/argon2/src/genkat.c | 213 - Blastproof/keygen/argon2/src/genkat.h | 51 - Blastproof/keygen/argon2/src/opt.o | Bin 75600 -> 0 bytes Blastproof/keygen/argon2/src/ref.c | 194 - Blastproof/keygen/argon2/src/run.c | 337 - Blastproof/keygen/argon2/src/test.c | 289 - Blastproof/keygen/argon2/src/thread.o | Bin 5728 -> 0 bytes .../argon2/vs2015/Argon2Opt/Argon2Opt.vcxproj | 231 - .../Argon2Opt/Argon2Opt.vcxproj.filters | 69 - .../Argon2OptBench/Argon2OptBench.vcxproj | 231 - .../Argon2OptBench.vcxproj.filters | 69 - .../vs2015/Argon2OptDll/Argon2OptDll.vcxproj | 230 - .../Argon2OptDll/Argon2OptDll.vcxproj.filters | 66 - .../Argon2OptGenKAT/Argon2OptGenKAT.vcxproj | 244 - .../Argon2OptGenKAT.vcxproj.filters | 72 - .../Argon2OptTestCI/Argon2OptTestCI.vcxproj | 235 - .../Argon2OptTestCI.vcxproj.filters | 69 - .../argon2/vs2015/Argon2Ref/Argon2Ref.vcxproj | 243 - .../Argon2Ref/Argon2Ref.vcxproj.filters | 69 - .../Argon2RefBench/Argon2RefBench.vcxproj | 231 - .../Argon2RefBench.vcxproj.filters | 69 - .../vs2015/Argon2RefDll/Argon2RefDll.vcxproj | 230 - .../Argon2RefDll/Argon2RefDll.vcxproj.filters | 66 - .../Argon2RefGenKAT/Argon2RefGenKAT.vcxproj | 232 - .../Argon2RefGenKAT.vcxproj.filters | 72 - .../Argon2RefTestCI/Argon2RefTestCI.vcxproj | 231 - .../Argon2RefTestCI.vcxproj.filters | 69 - Blastproof/keygen/fors.c | 161 - Blastproof/keygen/fors.o | Bin 4320 -> 0 bytes Blastproof/keygen/hash_sha2.c | 197 - Blastproof/keygen/hash_sha2.o | Bin 4400 -> 0 bytes Blastproof/keygen/keygen-run.json | 36 + Blastproof/keygen/keygen.cpp | 377 +- Blastproof/keygen/keygen.json | 53 + Blastproof/keygen/merkle.c | 61 - Blastproof/keygen/merkle.o | Bin 2584 -> 0 bytes Blastproof/keygen/randombytes.c | 43 - Blastproof/keygen/randombytes.o | Bin 1952 -> 0 bytes Blastproof/keygen/sha2.c | 700 - Blastproof/keygen/sha2.o | Bin 61808 -> 0 bytes Blastproof/keygen/sha3.c | 190 - Blastproof/keygen/sha3.o | Bin 4896 -> 0 bytes Blastproof/keygen/sign.c | 287 - Blastproof/keygen/sign.o | Bin 6816 -> 0 bytes Blastproof/keygen/thash_sha2_robust.o | Bin 3080 -> 0 bytes Blastproof/keygen/utils.c | 154 - Blastproof/keygen/utils.o | Bin 3960 -> 0 bytes Blastproof/keygen/utilsx1.c | 100 - Blastproof/keygen/utilsx1.o | Bin 2384 -> 0 bytes Blastproof/keygen/wots.c | 112 - Blastproof/keygen/wots.o | Bin 2864 -> 0 bytes Blastproof/keygen/wotsx1.c | 73 - Blastproof/keygen/wotsx1.o | Bin 2528 -> 0 bytes Blastproof/ovmf.sh | 10 + Blastproof/src/keycard.json | 41 + Blastproof/src/libs/include/conf.h | 5 +- Blastproof/src/libs/include/console.h | 9 +- Blastproof/src/libs/include/cpu.h | 18 - Blastproof/src/libs/include/crypto.h | 1 + Blastproof/src/libs/include/debug.h | 1 + Blastproof/src/libs/include/default.h | 2 + Blastproof/src/libs/include/disk.h | 1 + Blastproof/src/libs/include/font.h | 1 + Blastproof/src/libs/include/graphic.h | 1 + Blastproof/src/libs/include/initfs.h | 4 +- Blastproof/src/libs/include/layout.h | 16 + Blastproof/src/libs/include/layouts/azerty.h | 59 + .../libs/include/layouts/layout_registry.h | 17 + Blastproof/src/libs/include/layouts/qwerty.h | 10 + Blastproof/src/libs/include/ui.h | 1 + Blastproof/src/libs/include/vftm.h | 84 + Blastproof/src/libs/include/vyx.h | 40 +- Blastproof/src/libs/src/conf.c | 29 + Blastproof/src/libs/src/console.c | 147 +- Blastproof/src/libs/src/cpu.c | 29 - Blastproof/src/libs/src/crypto.c | 1 + Blastproof/src/libs/src/debug.c | 1 + Blastproof/src/libs/src/disk.c | 1 + Blastproof/src/libs/src/font.c | 1 + Blastproof/src/libs/src/graphic.c | 5 +- Blastproof/src/libs/src/initfs.c | 5 +- Blastproof/src/libs/src/layout.c | 22 + Blastproof/src/libs/src/ui.c | 1 + Blastproof/src/libs/src/vftm.c | 359 + Blastproof/src/libs/src/vyx.c | 97 +- Blastproof/src/main.c | 307 +- Blastproof/src/main.inf | 8 +- build.json | 152 + build.sh | 355 - common/versions.h | 10 + disk.json | 72 + docs/blastproof/bootconfig.md | 9 +- docs/blastproof/bootprocess.md | 9 +- docs/blastproof/bplib.md | 21 +- docs/blastproof/fbm.md | 2 +- docs/blastproof/fs.md | 8 +- docs/blastproof/index.md | 14 +- docs/blastproof/kbdlayout.md | 71 + docs/blastproof/sbfie.md | 19 +- docs/blastproof/security.md | 5 +- docs/blastproof/vftm.md | 92 + docs/boottools/commoncrypto.md | 18 + docs/boottools/index.md | 11 +- docs/boottools/initfsgen.md | 12 +- docs/boottools/keygen.md | 27 +- docs/build.md | 53 +- docs/commonlib.md | 9 + docs/index.md | 10 +- docs/licenses.md | 1 + docs/roadmap.md | 61 +- docs/shelter/bench.md | 151 +- docs/shelter/bootconfig.md | 41 + docs/shelter/bootcontract.md | 5 +- docs/shelter/bootprocess.md | 96 +- docs/shelter/cpu/ap.md | 116 + docs/shelter/cpu/asmint.md | 9 + docs/shelter/cpu/cpuabstract.md | 3 + docs/shelter/cpu/pic.md | 13 + docs/shelter/cpu/pit.md | 6 + docs/shelter/cpu/serial.md | 2 +- docs/shelter/cpu/tsc.md | 12 +- docs/shelter/devs/abstracted/ps2.md | 36 + docs/shelter/devs/acpi.md | 43 + docs/shelter/devs/devs.md | 142 + docs/shelter/devs/drivers.md | 18 + docs/shelter/devs/index.md | 13 + docs/shelter/devs/integrated/ioapic.md | 35 + docs/shelter/devs/integrated/lapic.md | 81 + docs/shelter/devs/kbdinput.md | 134 + docs/shelter/index.md | 6 +- docs/shelter/irq/gdt.md | 98 + docs/shelter/irq/gsi.md | 68 + docs/shelter/irq/idt.md | 49 + docs/shelter/irq/index.md | 19 + docs/shelter/irq/irq.md | 126 + docs/shelter/irq/tss.md | 11 + docs/shelter/kernel/efifb.md | 18 + docs/shelter/kernel/kernel.md | 1 + docs/shelter/kernel/log.md | 9 +- docs/shelter/memory/index.md | 11 +- docs/shelter/memory/page.md | 5 +- docs/shelter/memory/ring.md | 2 +- docs/shelter/naming.md | 4 +- docs/shelter/ptp.md | 4 +- docs/shelter/std/malloc.md | 4 +- docs/shelter/std/mem.md | 2 +- docs/shelter/std/print.md | 53 + docs/shelter/std/queues.md | 23 + docs/shelter/std/smp.md | 54 + docs/shelter/std/std.md | 4 + docs/shelter/std/strings.md | 9 + docs/shelter/tab.md | 8 +- docs/vybuild/actions.md | 1070 + docs/vybuild/cache.md | 14 + docs/vybuild/index.md | 30 + docs/vybuild/modules.md | 46 + docs/vybuild/usage.md | 35 + docs/vybuild/variables.md | 59 + docs/vyld/index.md | 5 - docs/vyld/vyld.md | 67 - docs/{vyld => }/vyx.md | 26 +- esp.json | 175 + licenses/third-party/mit_json.md | 21 + readme.md | 4 +- shelter/kernel.json | 87 + shelter/lib/include/cpu/ap.h | 56 + shelter/lib/include/cpu/asm.h | 47 +- shelter/lib/include/cpu/pic.h | 17 + shelter/lib/include/cpu/pit.h | 7 + shelter/lib/include/cpu/tsc.h | 13 + shelter/lib/include/devs/acpi.h | 65 + shelter/lib/include/devs/acpi_tables/madt.h | 53 + shelter/lib/include/devs/apic/ioapic.h | 70 + shelter/lib/include/devs/apic/lapic.h | 83 + shelter/lib/include/devs/devs.h | 21 + shelter/lib/include/devs/input/event.h | 39 + shelter/lib/include/devs/input/kbd.h | 52 + shelter/lib/include/devs/input/ps2.h | 105 + shelter/lib/include/irq/gdt.h | 126 + shelter/lib/include/irq/gsi.h | 62 + shelter/lib/include/irq/idt.h | 41 + shelter/lib/include/irq/irq.h | 57 + shelter/lib/include/irq/tss.h | 39 + shelter/lib/include/kernel/conf.h | 21 + shelter/lib/include/kernel/efifb.h | 12 + shelter/lib/include/kernel/log.h | 18 +- shelter/lib/include/kernel/test.h | 1 + .../tests/payloads/test_malloc_payload.h | 11 + .../kernel/tests/payloads/test_pez_payload.h | 10 + .../tests/payloads/test_radix_payload.h | 11 + .../lib/include/kernel/tests/test_queues.h | 8 + shelter/lib/include/kernel/tests/test_utils.h | 2 +- shelter/lib/include/memory/memory.h | 26 + shelter/lib/include/memory/page.h | 2 + shelter/lib/include/memory/ring.h | 2 + shelter/lib/include/memory/vmem_layout.h | 2 +- shelter/lib/include/std/print.h | 29 + shelter/lib/include/std/queue.h | 19 + shelter/lib/include/std/smp.h | 74 + shelter/lib/include/std/status.h | 11 + shelter/lib/include/std/stdlib.h | 8 +- shelter/lib/include/std/string.h | 17 + shelter/lib/src/cpu/ap.c | 151 + shelter/lib/src/cpu/ap_boot.asm | 112 + shelter/lib/src/cpu/pic.c | 45 + shelter/lib/src/cpu/pit.c | 9 + shelter/lib/src/cpu/tsc.c | 85 + shelter/lib/src/devs/acpi.c | 97 + shelter/lib/src/devs/acpi_tables/madt.c | 102 + shelter/lib/src/devs/apic/ioapic.c | 175 + shelter/lib/src/devs/apic/lapic.c | 286 + shelter/lib/src/devs/devs.c | 56 + shelter/lib/src/devs/input/kbd.c | 340 + shelter/lib/src/devs/input/ps2.c | 777 + shelter/lib/src/irq/gdt.c | 83 + shelter/lib/src/irq/gdt_reload.asm | 21 + shelter/lib/src/irq/gsi.c | 182 + shelter/lib/src/irq/idt.c | 109 + shelter/lib/src/irq/irq.c | 243 + shelter/lib/src/irq/irq_handler.asm | 86 + shelter/lib/src/irq/tss.c | 30 + shelter/lib/src/kernel/conf.c | 51 +- shelter/lib/src/kernel/efifb.c | 95 + shelter/lib/src/kernel/log.c | 82 +- shelter/lib/src/kernel/tests/test_malloc.c | 9 +- shelter/lib/src/kernel/tests/test_pez.c | 8 +- shelter/lib/src/kernel/tests/test_queues.c | 35 + shelter/lib/src/kernel/tests/test_radix.c | 8 +- shelter/lib/src/kernel/tests/test_slabs.c | 12 +- shelter/lib/src/kernel/tests/test_utils.c | 55 +- shelter/lib/src/memory/heap.c | 1 - shelter/lib/src/memory/memory.c | 284 + shelter/lib/src/memory/page.c | 4 + shelter/lib/src/memory/pez/pez.c | 2 +- shelter/lib/src/memory/ring.c | 14 + shelter/lib/src/std/malloc.c | 26 +- shelter/lib/src/std/print.c | 886 + shelter/lib/src/std/queue.c | 28 + shelter/lib/src/std/smp.c | 10 + shelter/lib/src/std/string.c | 62 + shelter/main.c | 394 +- shelter/shelter.json | 26 + shelter/tools/python_script.json | 79 + {vyld => vybuild}/_vyx_start.c | 0 vybuild/api.h | 80 + vybuild/build.sh | 2 + {vyld => vybuild}/elfio.hpp | 0 {vyld => vybuild}/elfio/elf_types.hpp | 0 {vyld => vybuild}/elfio/elfio_array.hpp | 0 {vyld => vybuild}/elfio/elfio_dump.hpp | 0 {vyld => vybuild}/elfio/elfio_dynamic.hpp | 0 {vyld => vybuild}/elfio/elfio_header.hpp | 0 {vyld => vybuild}/elfio/elfio_modinfo.hpp | 0 {vyld => vybuild}/elfio/elfio_note.hpp | 0 {vyld => vybuild}/elfio/elfio_relocation.hpp | 0 {vyld => vybuild}/elfio/elfio_section.hpp | 0 {vyld => vybuild}/elfio/elfio_segment.hpp | 0 {vyld => vybuild}/elfio/elfio_strings.hpp | 0 {vyld => vybuild}/elfio/elfio_symbols.hpp | 0 {vyld => vybuild}/elfio/elfio_utils.hpp | 0 {vyld => vybuild}/elfio/elfio_version.hpp | 0 {vyld => vybuild}/elfio/elfio_versym.hpp | 0 vybuild/json.hpp | 25830 ++++++++++++++++ vybuild/params.h | 3 + vybuild/params/params-sphincs-sha2-256f.h | 85 + vybuild/sha2_offsets.h | 20 + vybuild/vybuild-actions.cpp | 2132 ++ vybuild/vybuild-cache.cpp | 78 + vybuild/vybuild-condition.cpp | 96 + vybuild/vybuild-disk.cpp | 183 + vybuild/vybuild-fat32.cpp | 489 + vybuild/vybuild-parser.cpp | 55 + vybuild/vybuild-vars.cpp | 23 + vybuild/vybuild-vyld.cpp | 795 + vybuild/vybuild.cpp | 44 + vybuild/vybuild.hpp | 1022 + vybuild/xxhash.c | 42 + vybuild/xxhash.h | 7490 +++++ vyld/vyld.cpp | 327 - 372 files changed, 51320 insertions(+), 83217 deletions(-) create mode 100644 Blastproof/blastproof.json create mode 100644 Blastproof/bootanim/bootanim.json create mode 100644 Blastproof/bootloader.json rename Blastproof/{initfsgen => common_crypto}/address.c (98%) create mode 100644 Blastproof/common_crypto/address.h create mode 100644 Blastproof/common_crypto/api.h rename Blastproof/{keygen/argon2/src => common_crypto}/argon2.c (100%) create mode 100644 Blastproof/common_crypto/argon2.h rename Blastproof/{keygen/argon2/src => common_crypto}/blake2/blake2-impl.h (100%) rename Blastproof/{keygen/argon2/src => common_crypto}/blake2/blake2.h (99%) rename Blastproof/{keygen/argon2/src => common_crypto}/blake2/blake2b.c (100%) rename Blastproof/{keygen/argon2/src => common_crypto}/blake2/blamka-round-opt.h (100%) rename Blastproof/{keygen/argon2/src => common_crypto}/blake2/blamka-round-ref.h (100%) create mode 100644 Blastproof/common_crypto/common_crypto.json create mode 100644 Blastproof/common_crypto/context.h rename Blastproof/{keygen/argon2/src => common_crypto}/core.c (100%) rename Blastproof/{keygen/argon2/src => common_crypto}/core.h (100%) rename Blastproof/{keygen/argon2/src => common_crypto}/encoding.c (100%) rename Blastproof/{keygen/argon2/src => common_crypto}/encoding.h (100%) rename Blastproof/{initfsgen => common_crypto}/fors.c (100%) create mode 100644 Blastproof/common_crypto/fors.h create mode 100644 Blastproof/common_crypto/hash.h rename Blastproof/{initfsgen => common_crypto}/hash_sha2.c (100%) rename Blastproof/{initfsgen => common_crypto}/merkle.c (100%) create mode 100644 Blastproof/common_crypto/merkle.h rename Blastproof/{keygen/argon2/src => common_crypto}/opt.c (100%) create mode 100644 Blastproof/common_crypto/params.h create mode 100644 Blastproof/common_crypto/params/params-sphincs-sha2-256f.h rename Blastproof/{initfsgen => common_crypto}/randombytes.c (100%) create mode 100644 Blastproof/common_crypto/randombytes.h rename Blastproof/{initfsgen => common_crypto}/sha2.c (100%) create mode 100644 Blastproof/common_crypto/sha2.h create mode 100644 Blastproof/common_crypto/sha2_offsets.h rename Blastproof/{initfsgen => common_crypto}/sha3.c (100%) create mode 100644 Blastproof/common_crypto/sha3.h rename Blastproof/{initfsgen => common_crypto}/sign.c (100%) create mode 100644 Blastproof/common_crypto/thash.h rename Blastproof/{initfsgen => common_crypto}/thash_sha2_robust.c (100%) rename Blastproof/{initfsgen => common_crypto}/thash_sha2_simple.c (100%) rename Blastproof/{keygen/argon2/src => common_crypto}/thread.c (100%) rename Blastproof/{keygen/argon2/src => common_crypto}/thread.h (100%) rename Blastproof/{initfsgen => common_crypto}/utils.c (100%) create mode 100644 Blastproof/common_crypto/utils.h rename Blastproof/{initfsgen => common_crypto}/utilsx1.c (100%) create mode 100644 Blastproof/common_crypto/utilsx1.h rename Blastproof/{initfsgen => common_crypto}/wots.c (100%) create mode 100644 Blastproof/common_crypto/wots.h rename Blastproof/{initfsgen => common_crypto}/wotsx1.c (100%) create mode 100644 Blastproof/common_crypto/wotsx1.h rename Blastproof/config/{bp_template.conf => bp_template.cfg} (91%) create mode 100644 Blastproof/config/config.json create mode 100755 Blastproof/config/config_patch.sh create mode 100644 Blastproof/edk2.json create mode 100644 Blastproof/fontgen/fontgen.json create mode 100644 Blastproof/initfsgen/initfsgen.json delete mode 100644 Blastproof/keygen/address.c delete mode 100644 Blastproof/keygen/address.o delete mode 100644 Blastproof/keygen/argon2/Argon2.sln delete mode 100644 Blastproof/keygen/argon2/CHANGELOG.md delete mode 100644 Blastproof/keygen/argon2/LICENSE delete mode 100644 Blastproof/keygen/argon2/Makefile delete mode 100644 Blastproof/keygen/argon2/Package.swift delete mode 100644 Blastproof/keygen/argon2/README.md delete mode 100755 Blastproof/keygen/argon2/argon2 delete mode 100644 Blastproof/keygen/argon2/argon2-specs.pdf delete mode 100644 Blastproof/keygen/argon2/kats/argon2d delete mode 100644 Blastproof/keygen/argon2/kats/argon2d.shasum delete mode 100644 Blastproof/keygen/argon2/kats/argon2d_v16 delete mode 100644 Blastproof/keygen/argon2/kats/argon2d_v16.shasum delete mode 100644 Blastproof/keygen/argon2/kats/argon2i delete mode 100644 Blastproof/keygen/argon2/kats/argon2i.shasum delete mode 100644 Blastproof/keygen/argon2/kats/argon2i_v16 delete mode 100644 Blastproof/keygen/argon2/kats/argon2i_v16.shasum delete mode 100644 Blastproof/keygen/argon2/kats/argon2id delete mode 100644 Blastproof/keygen/argon2/kats/argon2id.shasum delete mode 100644 Blastproof/keygen/argon2/kats/argon2id_v16 delete mode 100644 Blastproof/keygen/argon2/kats/argon2id_v16.shasum delete mode 100644 Blastproof/keygen/argon2/kats/check-sums.ps1 delete mode 100755 Blastproof/keygen/argon2/kats/check-sums.sh delete mode 100644 Blastproof/keygen/argon2/kats/test.ps1 delete mode 100755 Blastproof/keygen/argon2/kats/test.sh delete mode 100644 Blastproof/keygen/argon2/libargon2.pc delete mode 100644 Blastproof/keygen/argon2/libargon2.pc.in delete mode 100755 Blastproof/keygen/argon2/libargon2.so.1 delete mode 100644 Blastproof/keygen/argon2/man/argon2.1 delete mode 100644 Blastproof/keygen/argon2/src/argon2.o delete mode 100644 Blastproof/keygen/argon2/src/bench.c delete mode 100644 Blastproof/keygen/argon2/src/blake2/blake2b.o delete mode 100644 Blastproof/keygen/argon2/src/core.o delete mode 100644 Blastproof/keygen/argon2/src/encoding.o delete mode 100644 Blastproof/keygen/argon2/src/genkat.c delete mode 100644 Blastproof/keygen/argon2/src/genkat.h delete mode 100644 Blastproof/keygen/argon2/src/opt.o delete mode 100644 Blastproof/keygen/argon2/src/ref.c delete mode 100644 Blastproof/keygen/argon2/src/run.c delete mode 100644 Blastproof/keygen/argon2/src/test.c delete mode 100644 Blastproof/keygen/argon2/src/thread.o delete mode 100644 Blastproof/keygen/argon2/vs2015/Argon2Opt/Argon2Opt.vcxproj delete mode 100644 Blastproof/keygen/argon2/vs2015/Argon2Opt/Argon2Opt.vcxproj.filters delete mode 100644 Blastproof/keygen/argon2/vs2015/Argon2OptBench/Argon2OptBench.vcxproj delete mode 100644 Blastproof/keygen/argon2/vs2015/Argon2OptBench/Argon2OptBench.vcxproj.filters delete mode 100644 Blastproof/keygen/argon2/vs2015/Argon2OptDll/Argon2OptDll.vcxproj delete mode 100644 Blastproof/keygen/argon2/vs2015/Argon2OptDll/Argon2OptDll.vcxproj.filters delete mode 100644 Blastproof/keygen/argon2/vs2015/Argon2OptGenKAT/Argon2OptGenKAT.vcxproj delete mode 100644 Blastproof/keygen/argon2/vs2015/Argon2OptGenKAT/Argon2OptGenKAT.vcxproj.filters delete mode 100644 Blastproof/keygen/argon2/vs2015/Argon2OptTestCI/Argon2OptTestCI.vcxproj delete mode 100644 Blastproof/keygen/argon2/vs2015/Argon2OptTestCI/Argon2OptTestCI.vcxproj.filters delete mode 100644 Blastproof/keygen/argon2/vs2015/Argon2Ref/Argon2Ref.vcxproj delete mode 100644 Blastproof/keygen/argon2/vs2015/Argon2Ref/Argon2Ref.vcxproj.filters delete mode 100644 Blastproof/keygen/argon2/vs2015/Argon2RefBench/Argon2RefBench.vcxproj delete mode 100644 Blastproof/keygen/argon2/vs2015/Argon2RefBench/Argon2RefBench.vcxproj.filters delete mode 100644 Blastproof/keygen/argon2/vs2015/Argon2RefDll/Argon2RefDll.vcxproj delete mode 100644 Blastproof/keygen/argon2/vs2015/Argon2RefDll/Argon2RefDll.vcxproj.filters delete mode 100644 Blastproof/keygen/argon2/vs2015/Argon2RefGenKAT/Argon2RefGenKAT.vcxproj delete mode 100644 Blastproof/keygen/argon2/vs2015/Argon2RefGenKAT/Argon2RefGenKAT.vcxproj.filters delete mode 100644 Blastproof/keygen/argon2/vs2015/Argon2RefTestCI/Argon2RefTestCI.vcxproj delete mode 100644 Blastproof/keygen/argon2/vs2015/Argon2RefTestCI/Argon2RefTestCI.vcxproj.filters delete mode 100644 Blastproof/keygen/fors.c delete mode 100644 Blastproof/keygen/fors.o delete mode 100644 Blastproof/keygen/hash_sha2.c delete mode 100644 Blastproof/keygen/hash_sha2.o create mode 100644 Blastproof/keygen/keygen-run.json create mode 100644 Blastproof/keygen/keygen.json delete mode 100644 Blastproof/keygen/merkle.c delete mode 100644 Blastproof/keygen/merkle.o delete mode 100644 Blastproof/keygen/randombytes.c delete mode 100644 Blastproof/keygen/randombytes.o delete mode 100644 Blastproof/keygen/sha2.c delete mode 100644 Blastproof/keygen/sha2.o delete mode 100644 Blastproof/keygen/sha3.c delete mode 100644 Blastproof/keygen/sha3.o delete mode 100644 Blastproof/keygen/sign.c delete mode 100644 Blastproof/keygen/sign.o delete mode 100644 Blastproof/keygen/thash_sha2_robust.o delete mode 100644 Blastproof/keygen/utils.c delete mode 100644 Blastproof/keygen/utils.o delete mode 100644 Blastproof/keygen/utilsx1.c delete mode 100644 Blastproof/keygen/utilsx1.o delete mode 100644 Blastproof/keygen/wots.c delete mode 100644 Blastproof/keygen/wots.o delete mode 100644 Blastproof/keygen/wotsx1.c delete mode 100644 Blastproof/keygen/wotsx1.o create mode 100755 Blastproof/ovmf.sh create mode 100644 Blastproof/src/keycard.json delete mode 100644 Blastproof/src/libs/include/cpu.h create mode 100644 Blastproof/src/libs/include/layout.h create mode 100644 Blastproof/src/libs/include/layouts/azerty.h create mode 100644 Blastproof/src/libs/include/layouts/layout_registry.h create mode 100644 Blastproof/src/libs/include/layouts/qwerty.h create mode 100644 Blastproof/src/libs/include/vftm.h delete mode 100644 Blastproof/src/libs/src/cpu.c create mode 100644 Blastproof/src/libs/src/layout.c create mode 100644 Blastproof/src/libs/src/vftm.c create mode 100644 build.json delete mode 100755 build.sh create mode 100644 common/versions.h create mode 100644 disk.json create mode 100644 docs/blastproof/kbdlayout.md create mode 100644 docs/blastproof/vftm.md create mode 100644 docs/boottools/commoncrypto.md create mode 100644 docs/commonlib.md create mode 100644 docs/shelter/cpu/ap.md create mode 100644 docs/shelter/cpu/pic.md create mode 100644 docs/shelter/cpu/pit.md create mode 100644 docs/shelter/devs/abstracted/ps2.md create mode 100644 docs/shelter/devs/acpi.md create mode 100644 docs/shelter/devs/devs.md create mode 100644 docs/shelter/devs/drivers.md create mode 100644 docs/shelter/devs/index.md create mode 100644 docs/shelter/devs/integrated/ioapic.md create mode 100644 docs/shelter/devs/integrated/lapic.md create mode 100644 docs/shelter/devs/kbdinput.md create mode 100644 docs/shelter/irq/gdt.md create mode 100644 docs/shelter/irq/gsi.md create mode 100644 docs/shelter/irq/idt.md create mode 100644 docs/shelter/irq/index.md create mode 100644 docs/shelter/irq/irq.md create mode 100644 docs/shelter/irq/tss.md create mode 100644 docs/shelter/kernel/efifb.md create mode 100644 docs/shelter/std/print.md create mode 100644 docs/shelter/std/queues.md create mode 100644 docs/shelter/std/smp.md create mode 100644 docs/shelter/std/strings.md create mode 100644 docs/vybuild/actions.md create mode 100644 docs/vybuild/cache.md create mode 100644 docs/vybuild/index.md create mode 100644 docs/vybuild/modules.md create mode 100644 docs/vybuild/usage.md create mode 100644 docs/vybuild/variables.md delete mode 100644 docs/vyld/index.md delete mode 100644 docs/vyld/vyld.md rename docs/{vyld => }/vyx.md (58%) create mode 100644 esp.json create mode 100644 licenses/third-party/mit_json.md create mode 100644 shelter/kernel.json create mode 100644 shelter/lib/include/cpu/ap.h create mode 100644 shelter/lib/include/cpu/pic.h create mode 100644 shelter/lib/include/cpu/pit.h create mode 100644 shelter/lib/include/devs/acpi.h create mode 100644 shelter/lib/include/devs/acpi_tables/madt.h create mode 100644 shelter/lib/include/devs/apic/ioapic.h create mode 100644 shelter/lib/include/devs/apic/lapic.h create mode 100644 shelter/lib/include/devs/devs.h create mode 100644 shelter/lib/include/devs/input/event.h create mode 100644 shelter/lib/include/devs/input/kbd.h create mode 100644 shelter/lib/include/devs/input/ps2.h create mode 100644 shelter/lib/include/irq/gdt.h create mode 100644 shelter/lib/include/irq/gsi.h create mode 100644 shelter/lib/include/irq/idt.h create mode 100644 shelter/lib/include/irq/irq.h create mode 100644 shelter/lib/include/irq/tss.h create mode 100644 shelter/lib/include/kernel/efifb.h create mode 100644 shelter/lib/include/kernel/tests/payloads/test_malloc_payload.h create mode 100644 shelter/lib/include/kernel/tests/payloads/test_pez_payload.h create mode 100644 shelter/lib/include/kernel/tests/payloads/test_radix_payload.h create mode 100644 shelter/lib/include/kernel/tests/test_queues.h create mode 100644 shelter/lib/include/memory/memory.h create mode 100644 shelter/lib/include/std/print.h create mode 100644 shelter/lib/include/std/queue.h create mode 100644 shelter/lib/include/std/smp.h create mode 100644 shelter/lib/include/std/string.h create mode 100644 shelter/lib/src/cpu/ap.c create mode 100644 shelter/lib/src/cpu/ap_boot.asm create mode 100644 shelter/lib/src/cpu/pic.c create mode 100644 shelter/lib/src/cpu/pit.c create mode 100644 shelter/lib/src/devs/acpi.c create mode 100644 shelter/lib/src/devs/acpi_tables/madt.c create mode 100644 shelter/lib/src/devs/apic/ioapic.c create mode 100644 shelter/lib/src/devs/apic/lapic.c create mode 100644 shelter/lib/src/devs/devs.c create mode 100644 shelter/lib/src/devs/input/kbd.c create mode 100644 shelter/lib/src/devs/input/ps2.c create mode 100644 shelter/lib/src/irq/gdt.c create mode 100644 shelter/lib/src/irq/gdt_reload.asm create mode 100644 shelter/lib/src/irq/gsi.c create mode 100644 shelter/lib/src/irq/idt.c create mode 100644 shelter/lib/src/irq/irq.c create mode 100644 shelter/lib/src/irq/irq_handler.asm create mode 100644 shelter/lib/src/irq/tss.c create mode 100644 shelter/lib/src/kernel/efifb.c create mode 100644 shelter/lib/src/kernel/tests/test_queues.c create mode 100644 shelter/lib/src/memory/memory.c create mode 100644 shelter/lib/src/std/print.c create mode 100644 shelter/lib/src/std/queue.c create mode 100644 shelter/lib/src/std/smp.c create mode 100644 shelter/lib/src/std/string.c create mode 100644 shelter/shelter.json create mode 100644 shelter/tools/python_script.json rename {vyld => vybuild}/_vyx_start.c (100%) create mode 100644 vybuild/api.h create mode 100755 vybuild/build.sh rename {vyld => vybuild}/elfio.hpp (100%) rename {vyld => vybuild}/elfio/elf_types.hpp (100%) rename {vyld => vybuild}/elfio/elfio_array.hpp (100%) rename {vyld => vybuild}/elfio/elfio_dump.hpp (100%) rename {vyld => vybuild}/elfio/elfio_dynamic.hpp (100%) rename {vyld => vybuild}/elfio/elfio_header.hpp (100%) rename {vyld => vybuild}/elfio/elfio_modinfo.hpp (100%) rename {vyld => vybuild}/elfio/elfio_note.hpp (100%) rename {vyld => vybuild}/elfio/elfio_relocation.hpp (100%) rename {vyld => vybuild}/elfio/elfio_section.hpp (100%) rename {vyld => vybuild}/elfio/elfio_segment.hpp (100%) rename {vyld => vybuild}/elfio/elfio_strings.hpp (100%) rename {vyld => vybuild}/elfio/elfio_symbols.hpp (100%) rename {vyld => vybuild}/elfio/elfio_utils.hpp (100%) rename {vyld => vybuild}/elfio/elfio_version.hpp (100%) rename {vyld => vybuild}/elfio/elfio_versym.hpp (100%) create mode 100644 vybuild/json.hpp create mode 100644 vybuild/params.h create mode 100644 vybuild/params/params-sphincs-sha2-256f.h create mode 100644 vybuild/sha2_offsets.h create mode 100644 vybuild/vybuild-actions.cpp create mode 100644 vybuild/vybuild-cache.cpp create mode 100644 vybuild/vybuild-condition.cpp create mode 100644 vybuild/vybuild-disk.cpp create mode 100644 vybuild/vybuild-fat32.cpp create mode 100644 vybuild/vybuild-parser.cpp create mode 100644 vybuild/vybuild-vars.cpp create mode 100644 vybuild/vybuild-vyld.cpp create mode 100644 vybuild/vybuild.cpp create mode 100644 vybuild/vybuild.hpp create mode 100644 vybuild/xxhash.c create mode 100644 vybuild/xxhash.h delete mode 100644 vyld/vyld.cpp diff --git a/Blastproof/blastproof.dsc b/Blastproof/blastproof.dsc index a64ade0..b578428 100644 --- a/Blastproof/blastproof.dsc +++ b/Blastproof/blastproof.dsc @@ -1,7 +1,7 @@ [Defines] DSC_SPECIFICATION = 0x0001001C PLATFORM_GUID = 040262ee-aebc-11f0-ba2c-10ffe08423a6 - PLATFORM_VERSION = 0.1 + PLATFORM_VERSION = 0.2 PLATFORM_NAME = BlastproofEnv SKUID_IDENTIFIER = DEFAULT SUPPORTED_ARCHITECTURES = X64 @@ -29,3 +29,6 @@ [Packages] MdePkg/MdePkg.dec + +[BuildOptions] + GCC:*_*_*_CC_FLAGS = -I$(WORKSPACE)/../ diff --git a/Blastproof/blastproof.json b/Blastproof/blastproof.json new file mode 100644 index 0000000..511a8c6 --- /dev/null +++ b/Blastproof/blastproof.json @@ -0,0 +1,73 @@ +{ + "version":"0.1", + "root_folder":"%filefolder%", + "run_context":"sub", + "name":"Blastproof build", + "actions":[ + { + "action":"ensure_folder_reset", + "args":{ + "path_variables":true, + "path":"%rootcallerfolder%/$EDK2_BLASTPROOF_DIR$" + } + }, + { + "action":"copy_folder", + "args":{ + "source_folder_variables":true, + "source_folder":"%rootcallerfolder%/Blastproof", + "destination_folder_variables":true, + "destination_folder":"%rootcallerfolder%/$EDK2_BLASTPROOF_DIR$" + } + }, + { + "action":"run_submodule", + "args":{ + "file_variables":true, + "file":"%rootcallerfolder%/$EDK2_BLASTPROOF_DIR$/common_crypto/common_crypto.json", + "wait":true, + "block_if_fail":true + } + }, + { + "action":"run_submodule_parallel", + "args":{ + "submodules_variables":true, + "submodules":[ + "%rootcallerfolder%/$EDK2_BLASTPROOF_DIR$/bootanim/bootanim.json", + "%rootcallerfolder%/$EDK2_BLASTPROOF_DIR$/fontgen/fontgen.json", + "%rootcallerfolder%/$EDK2_BLASTPROOF_DIR$/initfsgen/initfsgen.json", + "%rootcallerfolder%/$EDK2_BLASTPROOF_DIR$/config/config.json", + "%rootcallerfolder%/$EDK2_BLASTPROOF_DIR$/keygen/keygen.json" + ] + } + }, + { + "action":"run_submodule", + "args":{ + "file_variables":true, + "file":"%rootcallerfolder%/$EDK2_BLASTPROOF_DIR$/keygen/keygen-run.json", + "wait":true, + "block_if_fail":true + } + }, + { + "action":"run_command_wait_dir", + "args":{ + "command_variables":true, + "command":[ + "bash", + "-c", + ". edksetup.sh; build --platform=Blastproof/blastproof.dsc --module=Blastproof/src/main.inf --arch=X64 --buildtarget=RELEASE --tagname=GCC" + ], + "success_status":[ + 0 + ], + "ignore_success_status":false, + "show_output":"on_failure", + "working_dir_variables":true, + "working_dir":"%rootcallerfolder%/$EDK2_DIR$" + } + } + ] +} diff --git a/Blastproof/bootanim/bootanim.cpp b/Blastproof/bootanim/bootanim.cpp index 64f0751..009209b 100644 --- a/Blastproof/bootanim/bootanim.cpp +++ b/Blastproof/bootanim/bootanim.cpp @@ -90,6 +90,10 @@ uint16_t clamp(long double v,uint16_t max) { return (uint16_t)v; } int main (int argc,char **argv) { + if (fs::exists("bootanim.bin")) { + cout<<"[Bootanim] Stopping here because bootanim.bin already exists."< +#include "params.h" + +/* The hash types that are passed to set_type */ +#define SPX_ADDR_TYPE_WOTS 0 +#define SPX_ADDR_TYPE_WOTSPK 1 +#define SPX_ADDR_TYPE_HASHTREE 2 +#define SPX_ADDR_TYPE_FORSTREE 3 +#define SPX_ADDR_TYPE_FORSPK 4 +#define SPX_ADDR_TYPE_WOTSPRF 5 +#define SPX_ADDR_TYPE_FORSPRF 6 + +#define set_layer_addr SPX_NAMESPACE(set_layer_addr) +void set_layer_addr(uint32_t addr[8], uint32_t layer); + +#define set_tree_addr SPX_NAMESPACE(set_tree_addr) +void set_tree_addr(uint32_t addr[8], uint64_t tree); + +#define set_type SPX_NAMESPACE(set_type) +void set_type(uint32_t addr[8], uint32_t type); + +/* Copies the layer and tree part of one address into the other */ +#define copy_subtree_addr SPX_NAMESPACE(copy_subtree_addr) +void copy_subtree_addr(uint32_t out[8], const uint32_t in[8]); + +/* These functions are used for WOTS and FORS addresses. */ + +#define set_keypair_addr SPX_NAMESPACE(set_keypair_addr) +void set_keypair_addr(uint32_t addr[8], uint32_t keypair); + +#define set_chain_addr SPX_NAMESPACE(set_chain_addr) +void set_chain_addr(uint32_t addr[8], uint32_t chain); + +#define set_hash_addr SPX_NAMESPACE(set_hash_addr) +void set_hash_addr(uint32_t addr[8], uint32_t hash); + +#define copy_keypair_addr SPX_NAMESPACE(copy_keypair_addr) +void copy_keypair_addr(uint32_t out[8], const uint32_t in[8]); + +/* These functions are used for all hash tree addresses (including FORS). */ + +#define set_tree_height SPX_NAMESPACE(set_tree_height) +void set_tree_height(uint32_t addr[8], uint32_t tree_height); + +#define set_tree_index SPX_NAMESPACE(set_tree_index) +void set_tree_index(uint32_t addr[8], uint32_t tree_index); + +#endif diff --git a/Blastproof/common_crypto/api.h b/Blastproof/common_crypto/api.h new file mode 100644 index 0000000..d57a148 --- /dev/null +++ b/Blastproof/common_crypto/api.h @@ -0,0 +1,77 @@ +#ifndef SPX_API_H +#define SPX_API_H + +#include +#include + +#include "params.h" + +#define CRYPTO_ALGNAME "SPHINCS+" + +#define CRYPTO_SECRETKEYBYTES SPX_SK_BYTES +#define CRYPTO_PUBLICKEYBYTES SPX_PK_BYTES +#define CRYPTO_BYTES SPX_BYTES +#define CRYPTO_SEEDBYTES 3*SPX_N + +/* + * Returns the length of a secret key, in bytes + */ +unsigned long long crypto_sign_secretkeybytes(void); + +/* + * Returns the length of a public key, in bytes + */ +unsigned long long crypto_sign_publickeybytes(void); + +/* + * Returns the length of a signature, in bytes + */ +unsigned long long crypto_sign_bytes(void); + +/* + * Returns the length of the seed required to generate a key pair, in bytes + */ +unsigned long long crypto_sign_seedbytes(void); + +/* + * Generates a SPHINCS+ key pair given a seed. + * Format sk: [SK_SEED || SK_PRF || PUB_SEED || root] + * Format pk: [root || PUB_SEED] + */ +int crypto_sign_seed_keypair(unsigned char *pk, unsigned char *sk, + const unsigned char *seed); + +/* + * Generates a SPHINCS+ key pair. + * Format sk: [SK_SEED || SK_PRF || PUB_SEED || root] + * Format pk: [root || PUB_SEED] + */ +int crypto_sign_keypair(unsigned char *pk, unsigned char *sk); + +/** + * Returns an array containing a detached signature. + */ +int crypto_sign_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, const uint8_t *sk); + +/** + * Verifies a detached signature and message under a given public key. + */ +int crypto_sign_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, const uint8_t *pk); + +/** + * Returns an array containing the signature followed by the message. + */ +int crypto_sign(unsigned char *sm, unsigned long long *smlen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *sk); + +/** + * Verifies a given signature-message pair under a given public key. + */ +int crypto_sign_open(unsigned char *m, unsigned long long *mlen, + const unsigned char *sm, unsigned long long smlen, + const unsigned char *pk); + +#endif diff --git a/Blastproof/keygen/argon2/src/argon2.c b/Blastproof/common_crypto/argon2.c similarity index 100% rename from Blastproof/keygen/argon2/src/argon2.c rename to Blastproof/common_crypto/argon2.c diff --git a/Blastproof/common_crypto/argon2.h b/Blastproof/common_crypto/argon2.h new file mode 100644 index 0000000..3980bb3 --- /dev/null +++ b/Blastproof/common_crypto/argon2.h @@ -0,0 +1,437 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : https://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : https://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#ifndef ARGON2_H +#define ARGON2_H + +#include +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +/* Symbols visibility control */ +#ifdef A2_VISCTL +#define ARGON2_PUBLIC __attribute__((visibility("default"))) +#define ARGON2_LOCAL __attribute__ ((visibility ("hidden"))) +#elif defined(_MSC_VER) +#define ARGON2_PUBLIC __declspec(dllexport) +#define ARGON2_LOCAL +#else +#define ARGON2_PUBLIC +#define ARGON2_LOCAL +#endif + +/* + * Argon2 input parameter restrictions + */ + +/* Minimum and maximum number of lanes (degree of parallelism) */ +#define ARGON2_MIN_LANES UINT32_C(1) +#define ARGON2_MAX_LANES UINT32_C(0xFFFFFF) + +/* Minimum and maximum number of threads */ +#define ARGON2_MIN_THREADS UINT32_C(1) +#define ARGON2_MAX_THREADS UINT32_C(0xFFFFFF) + +/* Number of synchronization points between lanes per pass */ +#define ARGON2_SYNC_POINTS UINT32_C(4) + +/* Minimum and maximum digest size in bytes */ +#define ARGON2_MIN_OUTLEN UINT32_C(4) +#define ARGON2_MAX_OUTLEN UINT32_C(0xFFFFFFFF) + +/* Minimum and maximum number of memory blocks (each of BLOCK_SIZE bytes) */ +#define ARGON2_MIN_MEMORY (2 * ARGON2_SYNC_POINTS) /* 2 blocks per slice */ + +#define ARGON2_MIN(a, b) ((a) < (b) ? (a) : (b)) +/* Max memory size is addressing-space/2, topping at 2^32 blocks (4 TB) */ +#define ARGON2_MAX_MEMORY_BITS \ + ARGON2_MIN(UINT32_C(32), (sizeof(void *) * CHAR_BIT - 10 - 1)) +#define ARGON2_MAX_MEMORY \ + ARGON2_MIN(UINT32_C(0xFFFFFFFF), UINT64_C(1) << ARGON2_MAX_MEMORY_BITS) + +/* Minimum and maximum number of passes */ +#define ARGON2_MIN_TIME UINT32_C(1) +#define ARGON2_MAX_TIME UINT32_C(0xFFFFFFFF) + +/* Minimum and maximum password length in bytes */ +#define ARGON2_MIN_PWD_LENGTH UINT32_C(0) +#define ARGON2_MAX_PWD_LENGTH UINT32_C(0xFFFFFFFF) + +/* Minimum and maximum associated data length in bytes */ +#define ARGON2_MIN_AD_LENGTH UINT32_C(0) +#define ARGON2_MAX_AD_LENGTH UINT32_C(0xFFFFFFFF) + +/* Minimum and maximum salt length in bytes */ +#define ARGON2_MIN_SALT_LENGTH UINT32_C(8) +#define ARGON2_MAX_SALT_LENGTH UINT32_C(0xFFFFFFFF) + +/* Minimum and maximum key length in bytes */ +#define ARGON2_MIN_SECRET UINT32_C(0) +#define ARGON2_MAX_SECRET UINT32_C(0xFFFFFFFF) + +/* Flags to determine which fields are securely wiped (default = no wipe). */ +#define ARGON2_DEFAULT_FLAGS UINT32_C(0) +#define ARGON2_FLAG_CLEAR_PASSWORD (UINT32_C(1) << 0) +#define ARGON2_FLAG_CLEAR_SECRET (UINT32_C(1) << 1) + +/* Global flag to determine if we are wiping internal memory buffers. This flag + * is defined in core.c and defaults to 1 (wipe internal memory). */ +extern int FLAG_clear_internal_memory; + +/* Error codes */ +typedef enum Argon2_ErrorCodes { + ARGON2_OK = 0, + + ARGON2_OUTPUT_PTR_NULL = -1, + + ARGON2_OUTPUT_TOO_SHORT = -2, + ARGON2_OUTPUT_TOO_LONG = -3, + + ARGON2_PWD_TOO_SHORT = -4, + ARGON2_PWD_TOO_LONG = -5, + + ARGON2_SALT_TOO_SHORT = -6, + ARGON2_SALT_TOO_LONG = -7, + + ARGON2_AD_TOO_SHORT = -8, + ARGON2_AD_TOO_LONG = -9, + + ARGON2_SECRET_TOO_SHORT = -10, + ARGON2_SECRET_TOO_LONG = -11, + + ARGON2_TIME_TOO_SMALL = -12, + ARGON2_TIME_TOO_LARGE = -13, + + ARGON2_MEMORY_TOO_LITTLE = -14, + ARGON2_MEMORY_TOO_MUCH = -15, + + ARGON2_LANES_TOO_FEW = -16, + ARGON2_LANES_TOO_MANY = -17, + + ARGON2_PWD_PTR_MISMATCH = -18, /* NULL ptr with non-zero length */ + ARGON2_SALT_PTR_MISMATCH = -19, /* NULL ptr with non-zero length */ + ARGON2_SECRET_PTR_MISMATCH = -20, /* NULL ptr with non-zero length */ + ARGON2_AD_PTR_MISMATCH = -21, /* NULL ptr with non-zero length */ + + ARGON2_MEMORY_ALLOCATION_ERROR = -22, + + ARGON2_FREE_MEMORY_CBK_NULL = -23, + ARGON2_ALLOCATE_MEMORY_CBK_NULL = -24, + + ARGON2_INCORRECT_PARAMETER = -25, + ARGON2_INCORRECT_TYPE = -26, + + ARGON2_OUT_PTR_MISMATCH = -27, + + ARGON2_THREADS_TOO_FEW = -28, + ARGON2_THREADS_TOO_MANY = -29, + + ARGON2_MISSING_ARGS = -30, + + ARGON2_ENCODING_FAIL = -31, + + ARGON2_DECODING_FAIL = -32, + + ARGON2_THREAD_FAIL = -33, + + ARGON2_DECODING_LENGTH_FAIL = -34, + + ARGON2_VERIFY_MISMATCH = -35 +} argon2_error_codes; + +/* Memory allocator types --- for external allocation */ +typedef int (*allocate_fptr)(uint8_t **memory, size_t bytes_to_allocate); +typedef void (*deallocate_fptr)(uint8_t *memory, size_t bytes_to_allocate); + +/* Argon2 external data structures */ + +/* + ***** + * Context: structure to hold Argon2 inputs: + * output array and its length, + * password and its length, + * salt and its length, + * secret and its length, + * associated data and its length, + * number of passes, amount of used memory (in KBytes, can be rounded up a bit) + * number of parallel threads that will be run. + * All the parameters above affect the output hash value. + * Additionally, two function pointers can be provided to allocate and + * deallocate the memory (if NULL, memory will be allocated internally). + * Also, three flags indicate whether to erase password, secret as soon as they + * are pre-hashed (and thus not needed anymore), and the entire memory + ***** + * Simplest situation: you have output array out[8], password is stored in + * pwd[32], salt is stored in salt[16], you do not have keys nor associated + * data. You need to spend 1 GB of RAM and you run 5 passes of Argon2d with + * 4 parallel lanes. + * You want to erase the password, but you're OK with last pass not being + * erased. You want to use the default memory allocator. + * Then you initialize: + Argon2_Context(out,8,pwd,32,salt,16,NULL,0,NULL,0,5,1<<20,4,4,NULL,NULL,true,false,false,false) + */ +typedef struct Argon2_Context { + uint8_t *out; /* output array */ + uint32_t outlen; /* digest length */ + + uint8_t *pwd; /* password array */ + uint32_t pwdlen; /* password length */ + + uint8_t *salt; /* salt array */ + uint32_t saltlen; /* salt length */ + + uint8_t *secret; /* key array */ + uint32_t secretlen; /* key length */ + + uint8_t *ad; /* associated data array */ + uint32_t adlen; /* associated data length */ + + uint32_t t_cost; /* number of passes */ + uint32_t m_cost; /* amount of memory requested (KB) */ + uint32_t lanes; /* number of lanes */ + uint32_t threads; /* maximum number of threads */ + + uint32_t version; /* version number */ + + allocate_fptr allocate_cbk; /* pointer to memory allocator */ + deallocate_fptr free_cbk; /* pointer to memory deallocator */ + + uint32_t flags; /* array of bool options */ +} argon2_context; + +/* Argon2 primitive type */ +typedef enum Argon2_type { + Argon2_d = 0, + Argon2_i = 1, + Argon2_id = 2 +} argon2_type; + +/* Version of the algorithm */ +typedef enum Argon2_version { + ARGON2_VERSION_10 = 0x10, + ARGON2_VERSION_13 = 0x13, + ARGON2_VERSION_NUMBER = ARGON2_VERSION_13 +} argon2_version; + +/* + * Function that gives the string representation of an argon2_type. + * @param type The argon2_type that we want the string for + * @param uppercase Whether the string should have the first letter uppercase + * @return NULL if invalid type, otherwise the string representation. + */ +ARGON2_PUBLIC const char *argon2_type2string(argon2_type type, int uppercase); + +/* + * Function that performs memory-hard hashing with certain degree of parallelism + * @param context Pointer to the Argon2 internal structure + * @return Error code if smth is wrong, ARGON2_OK otherwise + */ +ARGON2_PUBLIC int argon2_ctx(argon2_context *context, argon2_type type); + +/** + * Hashes a password with Argon2i, producing an encoded hash + * @param t_cost Number of iterations + * @param m_cost Sets memory usage to m_cost kibibytes + * @param parallelism Number of threads and compute lanes + * @param pwd Pointer to password + * @param pwdlen Password size in bytes + * @param salt Pointer to salt + * @param saltlen Salt size in bytes + * @param hashlen Desired length of the hash in bytes + * @param encoded Buffer where to write the encoded hash + * @param encodedlen Size of the buffer (thus max size of the encoded hash) + * @pre Different parallelism levels will give different results + * @pre Returns ARGON2_OK if successful + */ +ARGON2_PUBLIC int argon2i_hash_encoded(const uint32_t t_cost, + const uint32_t m_cost, + const uint32_t parallelism, + const void *pwd, const size_t pwdlen, + const void *salt, const size_t saltlen, + const size_t hashlen, char *encoded, + const size_t encodedlen); + +/** + * Hashes a password with Argon2i, producing a raw hash at @hash + * @param t_cost Number of iterations + * @param m_cost Sets memory usage to m_cost kibibytes + * @param parallelism Number of threads and compute lanes + * @param pwd Pointer to password + * @param pwdlen Password size in bytes + * @param salt Pointer to salt + * @param saltlen Salt size in bytes + * @param hash Buffer where to write the raw hash - updated by the function + * @param hashlen Desired length of the hash in bytes + * @pre Different parallelism levels will give different results + * @pre Returns ARGON2_OK if successful + */ +ARGON2_PUBLIC int argon2i_hash_raw(const uint32_t t_cost, const uint32_t m_cost, + const uint32_t parallelism, const void *pwd, + const size_t pwdlen, const void *salt, + const size_t saltlen, void *hash, + const size_t hashlen); + +ARGON2_PUBLIC int argon2d_hash_encoded(const uint32_t t_cost, + const uint32_t m_cost, + const uint32_t parallelism, + const void *pwd, const size_t pwdlen, + const void *salt, const size_t saltlen, + const size_t hashlen, char *encoded, + const size_t encodedlen); + +ARGON2_PUBLIC int argon2d_hash_raw(const uint32_t t_cost, const uint32_t m_cost, + const uint32_t parallelism, const void *pwd, + const size_t pwdlen, const void *salt, + const size_t saltlen, void *hash, + const size_t hashlen); + +ARGON2_PUBLIC int argon2id_hash_encoded(const uint32_t t_cost, + const uint32_t m_cost, + const uint32_t parallelism, + const void *pwd, const size_t pwdlen, + const void *salt, const size_t saltlen, + const size_t hashlen, char *encoded, + const size_t encodedlen); + +ARGON2_PUBLIC int argon2id_hash_raw(const uint32_t t_cost, + const uint32_t m_cost, + const uint32_t parallelism, const void *pwd, + const size_t pwdlen, const void *salt, + const size_t saltlen, void *hash, + const size_t hashlen); + +/* generic function underlying the above ones */ +ARGON2_PUBLIC int argon2_hash(const uint32_t t_cost, const uint32_t m_cost, + const uint32_t parallelism, const void *pwd, + const size_t pwdlen, const void *salt, + const size_t saltlen, void *hash, + const size_t hashlen, char *encoded, + const size_t encodedlen, argon2_type type, + const uint32_t version); + +/** + * Verifies a password against an encoded string + * Encoded string is restricted as in validate_inputs() + * @param encoded String encoding parameters, salt, hash + * @param pwd Pointer to password + * @pre Returns ARGON2_OK if successful + */ +ARGON2_PUBLIC int argon2i_verify(const char *encoded, const void *pwd, + const size_t pwdlen); + +ARGON2_PUBLIC int argon2d_verify(const char *encoded, const void *pwd, + const size_t pwdlen); + +ARGON2_PUBLIC int argon2id_verify(const char *encoded, const void *pwd, + const size_t pwdlen); + +/* generic function underlying the above ones */ +ARGON2_PUBLIC int argon2_verify(const char *encoded, const void *pwd, + const size_t pwdlen, argon2_type type); + +/** + * Argon2d: Version of Argon2 that picks memory blocks depending + * on the password and salt. Only for side-channel-free + * environment!! + ***** + * @param context Pointer to current Argon2 context + * @return Zero if successful, a non zero error code otherwise + */ +ARGON2_PUBLIC int argon2d_ctx(argon2_context *context); + +/** + * Argon2i: Version of Argon2 that picks memory blocks + * independent on the password and salt. Good for side-channels, + * but worse w.r.t. tradeoff attacks if only one pass is used. + ***** + * @param context Pointer to current Argon2 context + * @return Zero if successful, a non zero error code otherwise + */ +ARGON2_PUBLIC int argon2i_ctx(argon2_context *context); + +/** + * Argon2id: Version of Argon2 where the first half-pass over memory is + * password-independent, the rest are password-dependent (on the password and + * salt). OK against side channels (they reduce to 1/2-pass Argon2i), and + * better with w.r.t. tradeoff attacks (similar to Argon2d). + ***** + * @param context Pointer to current Argon2 context + * @return Zero if successful, a non zero error code otherwise + */ +ARGON2_PUBLIC int argon2id_ctx(argon2_context *context); + +/** + * Verify if a given password is correct for Argon2d hashing + * @param context Pointer to current Argon2 context + * @param hash The password hash to verify. The length of the hash is + * specified by the context outlen member + * @return Zero if successful, a non zero error code otherwise + */ +ARGON2_PUBLIC int argon2d_verify_ctx(argon2_context *context, const char *hash); + +/** + * Verify if a given password is correct for Argon2i hashing + * @param context Pointer to current Argon2 context + * @param hash The password hash to verify. The length of the hash is + * specified by the context outlen member + * @return Zero if successful, a non zero error code otherwise + */ +ARGON2_PUBLIC int argon2i_verify_ctx(argon2_context *context, const char *hash); + +/** + * Verify if a given password is correct for Argon2id hashing + * @param context Pointer to current Argon2 context + * @param hash The password hash to verify. The length of the hash is + * specified by the context outlen member + * @return Zero if successful, a non zero error code otherwise + */ +ARGON2_PUBLIC int argon2id_verify_ctx(argon2_context *context, + const char *hash); + +/* generic function underlying the above ones */ +ARGON2_PUBLIC int argon2_verify_ctx(argon2_context *context, const char *hash, + argon2_type type); + +/** + * Get the associated error message for given error code + * @return The error message associated with the given error code + */ +ARGON2_PUBLIC const char *argon2_error_message(int error_code); + +/** + * Returns the encoded hash length for the given input parameters + * @param t_cost Number of iterations + * @param m_cost Memory usage in kibibytes + * @param parallelism Number of threads; used to compute lanes + * @param saltlen Salt size in bytes + * @param hashlen Hash size in bytes + * @param type The argon2_type that we want the encoded length for + * @return The encoded hash length in bytes + */ +ARGON2_PUBLIC size_t argon2_encodedlen(uint32_t t_cost, uint32_t m_cost, + uint32_t parallelism, uint32_t saltlen, + uint32_t hashlen, argon2_type type); + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/Blastproof/keygen/argon2/src/blake2/blake2-impl.h b/Blastproof/common_crypto/blake2/blake2-impl.h similarity index 100% rename from Blastproof/keygen/argon2/src/blake2/blake2-impl.h rename to Blastproof/common_crypto/blake2/blake2-impl.h diff --git a/Blastproof/keygen/argon2/src/blake2/blake2.h b/Blastproof/common_crypto/blake2/blake2.h similarity index 99% rename from Blastproof/keygen/argon2/src/blake2/blake2.h rename to Blastproof/common_crypto/blake2/blake2.h index 501c6a3..0c1b0ee 100644 --- a/Blastproof/keygen/argon2/src/blake2/blake2.h +++ b/Blastproof/common_crypto/blake2/blake2.h @@ -18,7 +18,7 @@ #ifndef PORTABLE_BLAKE2_H #define PORTABLE_BLAKE2_H -#include +#include "../argon2.h" #if defined(__cplusplus) extern "C" { diff --git a/Blastproof/keygen/argon2/src/blake2/blake2b.c b/Blastproof/common_crypto/blake2/blake2b.c similarity index 100% rename from Blastproof/keygen/argon2/src/blake2/blake2b.c rename to Blastproof/common_crypto/blake2/blake2b.c diff --git a/Blastproof/keygen/argon2/src/blake2/blamka-round-opt.h b/Blastproof/common_crypto/blake2/blamka-round-opt.h similarity index 100% rename from Blastproof/keygen/argon2/src/blake2/blamka-round-opt.h rename to Blastproof/common_crypto/blake2/blamka-round-opt.h diff --git a/Blastproof/keygen/argon2/src/blake2/blamka-round-ref.h b/Blastproof/common_crypto/blake2/blamka-round-ref.h similarity index 100% rename from Blastproof/keygen/argon2/src/blake2/blamka-round-ref.h rename to Blastproof/common_crypto/blake2/blamka-round-ref.h diff --git a/Blastproof/common_crypto/common_crypto.json b/Blastproof/common_crypto/common_crypto.json new file mode 100644 index 0000000..732dc31 --- /dev/null +++ b/Blastproof/common_crypto/common_crypto.json @@ -0,0 +1,140 @@ +{ + "version":"0.1", + "root_folder":"%filefolder%", + "run_context":"sub", + "name":"Common Crypto build", + "actions":[ + { + "action":"compile_multiple_cpp", + "args":{ + "source_files_path_completion":true, + "path_completion_source_ext":".c", + "path_completion_output_ext":".o", + "source_files_variables":true, + "source_files":[ + "%rootcallerfolder%/$EDK2_BLASTPROOF_DIR$/common_crypto/**" + ], + "compiler_variables":true, + "compiler":"$C_COMPILER$", + "pre_arguments_variables":true, + "pre_arguments":[ + "-c" + ], + "post_arguments_variables":true, + "post_arguments":[ + "-o", + "%outputfile%", + "-Ofast", + "-march=native", + "-fPIC" + ], + "output_files_variables":false, + "output_files":[ + ], + "success_status":[ + 0 + ], + "ignore_success_status":false, + "cache_authorized":true, + "headers_command_variables":true, + "headers_command":"gcc -MMD -MF %dfile% -E %sourcefile% -o /dev/null" + } + }, + { + "action":"run_command_wait", + "args":{ + "command_variables":false, + "command":[ + "ar", + "rcs", + "libcommoncrypto.a", + "address.o", + "fors.o", + "hash_sha2.o", + "merkle.o", + "randombytes.o", + "sha2.o", + "sha3.o", + "sign.o", + "utils.o", + "utilsx1.o", + "wots.o", + "wotsx1.o", + "thash_sha2_robust.o", + "argon2.o", + "blake2/blake2b.o", + "core.o", + "encoding.o", + "opt.o", + "thread.o" + ], + "success_status":[ + 0 + ], + "ignore_success_status":false, + "show_output":"on_failure" + } + }, + { + "action":"run_command_wait", + "args":{ + "command_variables":true, + "command":[ + "$C_COMPILER$", + "--shared", + "-o", + "libcommoncrypto.so", + "address.o", + "fors.o", + "hash_sha2.o", + "merkle.o", + "randombytes.o", + "sha2.o", + "sha3.o", + "sign.o", + "utils.o", + "utilsx1.o", + "wots.o", + "wotsx1.o", + "thash_sha2_robust.o", + "argon2.o", + "blake2/blake2b.o", + "core.o", + "encoding.o", + "opt.o", + "thread.o" + ], + "success_status":[ + 0 + ], + "ignore_success_status":false, + "show_output":"on_failure" + } + }, + { + "action":"vftm_load_crypto_lib", + "args":{ + "lib_path_variables":true, + "lib_path":"%rootcallerfolder%/$EDK2_BLASTPROOF_DIR$/common_crypto/libcommoncrypto.so" + } + }, + { + "action":"copy_file", + "args":{ + "source_file_variables":true, + "source_file":"%rootcallerfolder%/$EDK2_BLASTPROOF_DIR$/common_crypto/libcommoncrypto.a", + "destination_folder_variables":true, + "destination_folder":"%rootcallerfolder%/$EDK2_BLASTPROOF_DIR$/keygen/libcommoncrypto.a" + } + }, + { + "action":"copy_file", + "args":{ + "source_file_variables":true, + "source_file":"%rootcallerfolder%/$EDK2_BLASTPROOF_DIR$/common_crypto/libcommoncrypto.a", + "destination_folder_variables":true, + "destination_folder":"%rootcallerfolder%/$EDK2_BLASTPROOF_DIR$/initfsgen/libcommoncrypto.a" + } + } + ] +} diff --git a/Blastproof/common_crypto/context.h b/Blastproof/common_crypto/context.h new file mode 100644 index 0000000..aded564 --- /dev/null +++ b/Blastproof/common_crypto/context.h @@ -0,0 +1,28 @@ +#ifndef SPX_CONTEXT_H +#define SPX_CONTEXT_H + +#include + +#include "params.h" + +typedef struct { + uint8_t pub_seed[SPX_N]; + uint8_t sk_seed[SPX_N]; + +#ifdef SPX_SHA2 + // sha256 state that absorbed pub_seed + uint8_t state_seeded[40]; + +# if SPX_SHA512 + // sha512 state that absorbed pub_seed + uint8_t state_seeded_512[72]; +# endif +#endif + +#ifdef SPX_HARAKA + uint64_t tweaked512_rc64[10][8]; + uint32_t tweaked256_rc32[10][8]; +#endif +} spx_ctx; + +#endif diff --git a/Blastproof/keygen/argon2/src/core.c b/Blastproof/common_crypto/core.c similarity index 100% rename from Blastproof/keygen/argon2/src/core.c rename to Blastproof/common_crypto/core.c diff --git a/Blastproof/keygen/argon2/src/core.h b/Blastproof/common_crypto/core.h similarity index 100% rename from Blastproof/keygen/argon2/src/core.h rename to Blastproof/common_crypto/core.h diff --git a/Blastproof/keygen/argon2/src/encoding.c b/Blastproof/common_crypto/encoding.c similarity index 100% rename from Blastproof/keygen/argon2/src/encoding.c rename to Blastproof/common_crypto/encoding.c diff --git a/Blastproof/keygen/argon2/src/encoding.h b/Blastproof/common_crypto/encoding.h similarity index 100% rename from Blastproof/keygen/argon2/src/encoding.h rename to Blastproof/common_crypto/encoding.h diff --git a/Blastproof/initfsgen/fors.c b/Blastproof/common_crypto/fors.c similarity index 100% rename from Blastproof/initfsgen/fors.c rename to Blastproof/common_crypto/fors.c diff --git a/Blastproof/common_crypto/fors.h b/Blastproof/common_crypto/fors.h new file mode 100644 index 0000000..8d98017 --- /dev/null +++ b/Blastproof/common_crypto/fors.h @@ -0,0 +1,32 @@ +#ifndef SPX_FORS_H +#define SPX_FORS_H + +#include + +#include "params.h" +#include "context.h" + +/** + * Signs a message m, deriving the secret key from sk_seed and the FTS address. + * Assumes m contains at least SPX_FORS_HEIGHT * SPX_FORS_TREES bits. + */ +#define fors_sign SPX_NAMESPACE(fors_sign) +void fors_sign(unsigned char *sig, unsigned char *pk, + const unsigned char *m, + const spx_ctx* ctx, + const uint32_t fors_addr[8]); + +/** + * Derives the FORS public key from a signature. + * This can be used for verification by comparing to a known public key, or to + * subsequently verify a signature on the derived public key. The latter is the + * typical use-case when used as an FTS below an OTS in a hypertree. + * Assumes m contains at least SPX_FORS_HEIGHT * SPX_FORS_TREES bits. + */ +#define fors_pk_from_sig SPX_NAMESPACE(fors_pk_from_sig) +void fors_pk_from_sig(unsigned char *pk, + const unsigned char *sig, const unsigned char *m, + const spx_ctx* ctx, + const uint32_t fors_addr[8]); + +#endif diff --git a/Blastproof/common_crypto/hash.h b/Blastproof/common_crypto/hash.h new file mode 100644 index 0000000..b141f09 --- /dev/null +++ b/Blastproof/common_crypto/hash.h @@ -0,0 +1,27 @@ +#ifndef SPX_HASH_H +#define SPX_HASH_H + +#include +#include "context.h" +#include "params.h" + +#define initialize_hash_function SPX_NAMESPACE(initialize_hash_function) +void initialize_hash_function(spx_ctx *ctx); + +#define prf_addr SPX_NAMESPACE(prf_addr) +void prf_addr(unsigned char *out, const spx_ctx *ctx, + const uint32_t addr[8]); + +#define gen_message_random SPX_NAMESPACE(gen_message_random) +void gen_message_random(unsigned char *R, const unsigned char *sk_prf, + const unsigned char *optrand, + const unsigned char *m, unsigned long long mlen, + const spx_ctx *ctx); + +#define hash_message SPX_NAMESPACE(hash_message) +void hash_message(unsigned char *digest, uint64_t *tree, uint32_t *leaf_idx, + const unsigned char *R, const unsigned char *pk, + const unsigned char *m, unsigned long long mlen, + const spx_ctx *ctx); + +#endif diff --git a/Blastproof/initfsgen/hash_sha2.c b/Blastproof/common_crypto/hash_sha2.c similarity index 100% rename from Blastproof/initfsgen/hash_sha2.c rename to Blastproof/common_crypto/hash_sha2.c diff --git a/Blastproof/initfsgen/merkle.c b/Blastproof/common_crypto/merkle.c similarity index 100% rename from Blastproof/initfsgen/merkle.c rename to Blastproof/common_crypto/merkle.c diff --git a/Blastproof/common_crypto/merkle.h b/Blastproof/common_crypto/merkle.h new file mode 100644 index 0000000..9ac2759 --- /dev/null +++ b/Blastproof/common_crypto/merkle.h @@ -0,0 +1,18 @@ +#if !defined( MERKLE_H_ ) +#define MERKLE_H_ + +#include + +/* Generate a Merkle signature (WOTS signature followed by the Merkle */ +/* authentication path) */ +#define merkle_sign SPX_NAMESPACE(merkle_sign) +void merkle_sign(uint8_t *sig, unsigned char *root, + const spx_ctx* ctx, + uint32_t wots_addr[8], uint32_t tree_addr[8], + uint32_t idx_leaf); + +/* Compute the root node of the top-most subtree. */ +#define merkle_gen_root SPX_NAMESPACE(merkle_gen_root) +void merkle_gen_root(unsigned char *root, const spx_ctx* ctx); + +#endif /* MERKLE_H_ */ diff --git a/Blastproof/keygen/argon2/src/opt.c b/Blastproof/common_crypto/opt.c similarity index 100% rename from Blastproof/keygen/argon2/src/opt.c rename to Blastproof/common_crypto/opt.c diff --git a/Blastproof/common_crypto/params.h b/Blastproof/common_crypto/params.h new file mode 100644 index 0000000..6dc6974 --- /dev/null +++ b/Blastproof/common_crypto/params.h @@ -0,0 +1,3 @@ +#define str(s) #s +#define xstr(s) str(s) +#include "params/params-sphincs-sha2-256f.h" diff --git a/Blastproof/common_crypto/params/params-sphincs-sha2-256f.h b/Blastproof/common_crypto/params/params-sphincs-sha2-256f.h new file mode 100644 index 0000000..53c5bef --- /dev/null +++ b/Blastproof/common_crypto/params/params-sphincs-sha2-256f.h @@ -0,0 +1,85 @@ +#ifndef SPX_PARAMS_H +#define SPX_PARAMS_H + +#define SPX_NAMESPACE(s) SPX_##s + +/* Hash output length in bytes. */ +#define SPX_N 32 +/* Height of the hypertree. */ +#define SPX_FULL_HEIGHT 68 +/* Number of subtree layer. */ +#define SPX_D 17 +/* FORS tree dimensions. */ +#define SPX_FORS_HEIGHT 9 +#define SPX_FORS_TREES 35 +/* Winternitz parameter, */ +#define SPX_WOTS_W 16 + +/* The hash function is defined by linking a different hash.c file, as opposed + to setting a #define constant. */ + +/* This is a SHA2-based parameter set, hence whether we use SHA-256 + * exclusively or we use both SHA-256 and SHA-512 is controlled by + * the following #define */ +#define SPX_SHA512 1 /* Use SHA-512 for H and T_l, l >= 2 */ + +/* For clarity */ +#define SPX_ADDR_BYTES 32 + +/* WOTS parameters. */ +#if SPX_WOTS_W == 256 + #define SPX_WOTS_LOGW 8 +#elif SPX_WOTS_W == 16 + #define SPX_WOTS_LOGW 4 +#else + #error SPX_WOTS_W assumed 16 or 256 +#endif + +#define SPX_WOTS_LEN1 (8 * SPX_N / SPX_WOTS_LOGW) + +/* SPX_WOTS_LEN2 is floor(log(len_1 * (w - 1)) / log(w)) + 1; we precompute */ +#if SPX_WOTS_W == 256 + #if SPX_N <= 1 + #define SPX_WOTS_LEN2 1 + #elif SPX_N <= 256 + #define SPX_WOTS_LEN2 2 + #else + #error Did not precompute SPX_WOTS_LEN2 for n outside {2, .., 256} + #endif +#elif SPX_WOTS_W == 16 + #if SPX_N <= 8 + #define SPX_WOTS_LEN2 2 + #elif SPX_N <= 136 + #define SPX_WOTS_LEN2 3 + #elif SPX_N <= 256 + #define SPX_WOTS_LEN2 4 + #else + #error Did not precompute SPX_WOTS_LEN2 for n outside {2, .., 256} + #endif +#endif + +#define SPX_WOTS_LEN (SPX_WOTS_LEN1 + SPX_WOTS_LEN2) +#define SPX_WOTS_BYTES (SPX_WOTS_LEN * SPX_N) +#define SPX_WOTS_PK_BYTES SPX_WOTS_BYTES + +/* Subtree size. */ +#define SPX_TREE_HEIGHT (SPX_FULL_HEIGHT / SPX_D) + +#if SPX_TREE_HEIGHT * SPX_D != SPX_FULL_HEIGHT + #error SPX_D should always divide SPX_FULL_HEIGHT +#endif + +/* FORS parameters. */ +#define SPX_FORS_MSG_BYTES ((SPX_FORS_HEIGHT * SPX_FORS_TREES + 7) / 8) +#define SPX_FORS_BYTES ((SPX_FORS_HEIGHT + 1) * SPX_FORS_TREES * SPX_N) +#define SPX_FORS_PK_BYTES SPX_N + +/* Resulting SPX sizes. */ +#define SPX_BYTES (SPX_N + SPX_FORS_BYTES + SPX_D * SPX_WOTS_BYTES +\ + SPX_FULL_HEIGHT * SPX_N) +#define SPX_PK_BYTES (2 * SPX_N) +#define SPX_SK_BYTES (2 * SPX_N + SPX_PK_BYTES) + +#include "../sha2_offsets.h" + +#endif diff --git a/Blastproof/initfsgen/randombytes.c b/Blastproof/common_crypto/randombytes.c similarity index 100% rename from Blastproof/initfsgen/randombytes.c rename to Blastproof/common_crypto/randombytes.c diff --git a/Blastproof/common_crypto/randombytes.h b/Blastproof/common_crypto/randombytes.h new file mode 100644 index 0000000..671c1b1 --- /dev/null +++ b/Blastproof/common_crypto/randombytes.h @@ -0,0 +1,6 @@ +#ifndef SPX_RANDOMBYTES_H +#define SPX_RANDOMBYTES_H + +extern void randombytes(unsigned char * x,unsigned long long xlen); + +#endif diff --git a/Blastproof/initfsgen/sha2.c b/Blastproof/common_crypto/sha2.c similarity index 100% rename from Blastproof/initfsgen/sha2.c rename to Blastproof/common_crypto/sha2.c diff --git a/Blastproof/common_crypto/sha2.h b/Blastproof/common_crypto/sha2.h new file mode 100644 index 0000000..732ab4b --- /dev/null +++ b/Blastproof/common_crypto/sha2.h @@ -0,0 +1,43 @@ +#ifndef SPX_SHA2_H +#define SPX_SHA2_H + +#include "params.h" + +#define SPX_SHA256_BLOCK_BYTES 64 +#define SPX_SHA256_OUTPUT_BYTES 32 /* This does not necessarily equal SPX_N */ + +#define SPX_SHA512_BLOCK_BYTES 128 +#define SPX_SHA512_OUTPUT_BYTES 64 + +#if SPX_SHA256_OUTPUT_BYTES < SPX_N + #error Linking against SHA-256 with N larger than 32 bytes is not supported +#endif + +#define SPX_SHA256_ADDR_BYTES 22 + +#include +#include + +void sha256_inc_init(uint8_t *state); +void sha256_inc_blocks(uint8_t *state, const uint8_t *in, size_t inblocks); +void sha256_inc_finalize(uint8_t *out, uint8_t *state, const uint8_t *in, size_t inlen); +void sha256(uint8_t *out, const uint8_t *in, size_t inlen); + +void sha512_inc_init(uint8_t *state); +void sha512_inc_blocks(uint8_t *state, const uint8_t *in, size_t inblocks); +void sha512_inc_finalize(uint8_t *out, uint8_t *state, const uint8_t *in, size_t inlen); +void sha512(uint8_t *out, const uint8_t *in, size_t inlen); + +#define mgf1_256 SPX_NAMESPACE(mgf1_256) +void mgf1_256(unsigned char *out, unsigned long outlen, + const unsigned char *in, unsigned long inlen); + +#define mgf1_512 SPX_NAMESPACE(mgf1_512) +void mgf1_512(unsigned char *out, unsigned long outlen, + const unsigned char *in, unsigned long inlen); + +#define seed_state SPX_NAMESPACE(seed_state) +void seed_state(spx_ctx *ctx); + + +#endif diff --git a/Blastproof/common_crypto/sha2_offsets.h b/Blastproof/common_crypto/sha2_offsets.h new file mode 100644 index 0000000..49f7e85 --- /dev/null +++ b/Blastproof/common_crypto/sha2_offsets.h @@ -0,0 +1,20 @@ +#ifndef SHA2_OFFSETS_H_ +#define SHA2_OFFSETS_H_ + +/* + * Offsets of various fields in the address structure when we use SHA2 as + * the Sphincs+ hash function + */ + +#define SPX_OFFSET_LAYER 0 /* The byte used to specify the Merkle tree layer */ +#define SPX_OFFSET_TREE 1 /* The start of the 8 byte field used to specify the tree */ +#define SPX_OFFSET_TYPE 9 /* The byte used to specify the hash type (reason) */ +#define SPX_OFFSET_KP_ADDR 10 /* The start of the 4 byte field used to specify the key pair address */ +#define SPX_OFFSET_CHAIN_ADDR 17 /* The byte used to specify the chain address (which Winternitz chain) */ +#define SPX_OFFSET_HASH_ADDR 21 /* The byte used to specify the hash address (where in the Winternitz chain) */ +#define SPX_OFFSET_TREE_HGT 17 /* The byte used to specify the height of this node in the FORS or Merkle tree */ +#define SPX_OFFSET_TREE_INDEX 18 /* The start of the 4 byte field used to specify the node in the FORS or Merkle tree */ + +#define SPX_SHA2 1 + +#endif /* SHA2_OFFSETS_H_ */ diff --git a/Blastproof/initfsgen/sha3.c b/Blastproof/common_crypto/sha3.c similarity index 100% rename from Blastproof/initfsgen/sha3.c rename to Blastproof/common_crypto/sha3.c diff --git a/Blastproof/common_crypto/sha3.h b/Blastproof/common_crypto/sha3.h new file mode 100644 index 0000000..4431c49 --- /dev/null +++ b/Blastproof/common_crypto/sha3.h @@ -0,0 +1,46 @@ +// sha3.h +// 19-Nov-11 Markku-Juhani O. Saarinen + +#ifndef SHA3_H +#define SHA3_H + +#include +#include + +#ifndef KECCAKF_ROUNDS +#define KECCAKF_ROUNDS 24 +#endif + +#ifndef ROTL64 +#define ROTL64(x, y) (((x) << (y)) | ((x) >> (64 - (y)))) +#endif + +// state context +typedef struct { + union { // state: + uint8_t b[200]; // 8-bit bytes + uint64_t q[25]; // 64-bit words + } st; + int pt, rsiz, mdlen; // these don't overflow +} sha3_ctx_t; + +// Compression function. +void sha3_keccakf(uint64_t st[25]); + +// OpenSSL - like interfece +int sha3_init(sha3_ctx_t *c, int mdlen); // mdlen = hash output in bytes +int sha3_update(sha3_ctx_t *c, const void *data, size_t len); +int sha3_final(void *md, sha3_ctx_t *c); // digest goes to md + +// compute a sha3 hash (md) of given byte length from "in" +void *sha3(const void *in, size_t inlen, void *md, int mdlen); + +// SHAKE128 and SHAKE256 extensible-output functions +#define shake128_init(c) sha3_init(c, 16) +#define shake256_init(c) sha3_init(c, 32) +#define shake_update sha3_update + +void shake_xof(sha3_ctx_t *c); +void shake_out(sha3_ctx_t *c, void *out, size_t len); + +#endif diff --git a/Blastproof/initfsgen/sign.c b/Blastproof/common_crypto/sign.c similarity index 100% rename from Blastproof/initfsgen/sign.c rename to Blastproof/common_crypto/sign.c diff --git a/Blastproof/common_crypto/thash.h b/Blastproof/common_crypto/thash.h new file mode 100644 index 0000000..8687ccf --- /dev/null +++ b/Blastproof/common_crypto/thash.h @@ -0,0 +1,13 @@ +#ifndef SPX_THASH_H +#define SPX_THASH_H + +#include "context.h" +#include "params.h" + +#include + +#define thash SPX_NAMESPACE(thash) +void thash(unsigned char *out, const unsigned char *in, unsigned int inblocks, + const spx_ctx *ctx, uint32_t addr[8]); + +#endif diff --git a/Blastproof/initfsgen/thash_sha2_robust.c b/Blastproof/common_crypto/thash_sha2_robust.c similarity index 100% rename from Blastproof/initfsgen/thash_sha2_robust.c rename to Blastproof/common_crypto/thash_sha2_robust.c diff --git a/Blastproof/initfsgen/thash_sha2_simple.c b/Blastproof/common_crypto/thash_sha2_simple.c similarity index 100% rename from Blastproof/initfsgen/thash_sha2_simple.c rename to Blastproof/common_crypto/thash_sha2_simple.c diff --git a/Blastproof/keygen/argon2/src/thread.c b/Blastproof/common_crypto/thread.c similarity index 100% rename from Blastproof/keygen/argon2/src/thread.c rename to Blastproof/common_crypto/thread.c diff --git a/Blastproof/keygen/argon2/src/thread.h b/Blastproof/common_crypto/thread.h similarity index 100% rename from Blastproof/keygen/argon2/src/thread.h rename to Blastproof/common_crypto/thread.h diff --git a/Blastproof/initfsgen/utils.c b/Blastproof/common_crypto/utils.c similarity index 100% rename from Blastproof/initfsgen/utils.c rename to Blastproof/common_crypto/utils.c diff --git a/Blastproof/common_crypto/utils.h b/Blastproof/common_crypto/utils.h new file mode 100644 index 0000000..b13502c --- /dev/null +++ b/Blastproof/common_crypto/utils.h @@ -0,0 +1,64 @@ +#ifndef SPX_UTILS_H +#define SPX_UTILS_H + +#include +#include "params.h" +#include "context.h" + + +/* To support MSVC use alloca() instead of VLAs. See #20. */ +#ifdef _MSC_VER +/* MSVC defines _alloca in malloc.h */ +# include +/* Note: _malloca(), which is recommended over deprecated _alloca, + requires that you call _freea(). So we stick with _alloca */ +# define SPX_VLA(__t,__x,__s) __t *__x = (__t*)_alloca((__s)*sizeof(__t)) +#else +# define SPX_VLA(__t,__x,__s) __t __x[__s] +#endif + +/** + * Converts the value of 'in' to 'outlen' bytes in big-endian byte order. + */ +#define ull_to_bytes SPX_NAMESPACE(ull_to_bytes) +void ull_to_bytes(unsigned char *out, unsigned int outlen, + unsigned long long in); +#define u32_to_bytes SPX_NAMESPACE(u32_to_bytes) +void u32_to_bytes(unsigned char *out, uint32_t in); + +/** + * Converts the inlen bytes in 'in' from big-endian byte order to an integer. + */ +#define bytes_to_ull SPX_NAMESPACE(bytes_to_ull) +unsigned long long bytes_to_ull(const unsigned char *in, unsigned int inlen); + +/** + * Computes a root node given a leaf and an auth path. + * Expects address to be complete other than the tree_height and tree_index. + */ +#define compute_root SPX_NAMESPACE(compute_root) +void compute_root(unsigned char *root, const unsigned char *leaf, + uint32_t leaf_idx, uint32_t idx_offset, + const unsigned char *auth_path, uint32_t tree_height, + const spx_ctx *ctx, uint32_t addr[8]); + +/** + * For a given leaf index, computes the authentication path and the resulting + * root node using Merkle's TreeHash algorithm. + * Expects the layer and tree parts of the tree_addr to be set, as well as the + * tree type (i.e. SPX_ADDR_TYPE_HASHTREE or SPX_ADDR_TYPE_FORSTREE). + * Applies the offset idx_offset to indices before building addresses, so that + * it is possible to continue counting indices across trees. + */ +#define treehash SPX_NAMESPACE(treehash) +void treehash(unsigned char *root, unsigned char *auth_path, + const spx_ctx* ctx, + uint32_t leaf_idx, uint32_t idx_offset, uint32_t tree_height, + void (*gen_leaf)( + unsigned char* /* leaf */, + const spx_ctx* ctx /* ctx */, + uint32_t /* addr_idx */, const uint32_t[8] /* tree_addr */), + uint32_t tree_addr[8]); + + +#endif diff --git a/Blastproof/initfsgen/utilsx1.c b/Blastproof/common_crypto/utilsx1.c similarity index 100% rename from Blastproof/initfsgen/utilsx1.c rename to Blastproof/common_crypto/utilsx1.c diff --git a/Blastproof/common_crypto/utilsx1.h b/Blastproof/common_crypto/utilsx1.h new file mode 100644 index 0000000..a7fcf15 --- /dev/null +++ b/Blastproof/common_crypto/utilsx1.h @@ -0,0 +1,26 @@ +#ifndef SPX_UTILSX4_H +#define SPX_UTILSX4_H + +#include +#include "params.h" +#include "context.h" + +/** + * For a given leaf index, computes the authentication path and the resulting + * root node using Merkle's TreeHash algorithm. + * Expects the layer and tree parts of the tree_addr to be set, as well as the + * tree type (i.e. SPX_ADDR_TYPE_HASHTREE or SPX_ADDR_TYPE_FORSTREE). + * Applies the offset idx_offset to indices before building addresses, so that + * it is possible to continue counting indices across trees. + */ +#define treehashx1 SPX_NAMESPACE(treehashx1) +void treehashx1(unsigned char *root, unsigned char *auth_path, + const spx_ctx* ctx, + uint32_t leaf_idx, uint32_t idx_offset, uint32_t tree_height, + void (*gen_leaf)( + unsigned char* /* Where to write the leaf */, + const spx_ctx* /* ctx */, + uint32_t addr_idx, void *info), + uint32_t tree_addrx4[8], void *info); + +#endif diff --git a/Blastproof/initfsgen/wots.c b/Blastproof/common_crypto/wots.c similarity index 100% rename from Blastproof/initfsgen/wots.c rename to Blastproof/common_crypto/wots.c diff --git a/Blastproof/common_crypto/wots.h b/Blastproof/common_crypto/wots.h new file mode 100644 index 0000000..7e77056 --- /dev/null +++ b/Blastproof/common_crypto/wots.h @@ -0,0 +1,25 @@ +#ifndef SPX_WOTS_H +#define SPX_WOTS_H + +#include + +#include "params.h" +#include "context.h" + +/** + * Takes a WOTS signature and an n-byte message, computes a WOTS public key. + * + * Writes the computed public key to 'pk'. + */ +#define wots_pk_from_sig SPX_NAMESPACE(wots_pk_from_sig) +void wots_pk_from_sig(unsigned char *pk, + const unsigned char *sig, const unsigned char *msg, + const spx_ctx *ctx, uint32_t addr[8]); + +/* + * Compute the chain lengths needed for a given message hash + */ +#define chain_lengths SPX_NAMESPACE(chain_lengths) +void chain_lengths(unsigned int *lengths, const unsigned char *msg); + +#endif diff --git a/Blastproof/initfsgen/wotsx1.c b/Blastproof/common_crypto/wotsx1.c similarity index 100% rename from Blastproof/initfsgen/wotsx1.c rename to Blastproof/common_crypto/wotsx1.c diff --git a/Blastproof/common_crypto/wotsx1.h b/Blastproof/common_crypto/wotsx1.h new file mode 100644 index 0000000..1257f81 --- /dev/null +++ b/Blastproof/common_crypto/wotsx1.h @@ -0,0 +1,36 @@ +#if !defined( WOTSX1_H_ ) +#define WOTSX1_H_ + +#include + +/* + * This is here to provide an interface to the internal wots_gen_leafx1 + * routine. While this routine is not referenced in the package outside of + * wots.c, it is called from the stand-alone benchmark code to characterize + * the performance + */ +struct leaf_info_x1 { + unsigned char *wots_sig; + uint32_t wots_sign_leaf; /* The index of the WOTS we're using to sign */ + uint32_t *wots_steps; + uint32_t leaf_addr[8]; + uint32_t pk_addr[8]; +}; + +/* Macro to set the leaf_info to something 'benign', that is, it would */ +/* run with the same time as it does during the real signing process */ +/* Used only by the benchmark code */ +#define INITIALIZE_LEAF_INFO_X1(info, addr, step_buffer) { \ + info.wots_sig = 0; \ + info.wots_sign_leaf = ~0u; \ + info.wots_steps = step_buffer; \ + memcpy( &info.leaf_addr[0], addr, 32 ); \ + memcpy( &info.pk_addr[0], addr, 32 ); \ +} + +#define wots_gen_leafx1 SPX_NAMESPACE(wots_gen_leafx1) +void wots_gen_leafx1(unsigned char *dest, + const spx_ctx *ctx, + uint32_t leaf_idx, void *v_info); + +#endif /* WOTSX1_H_ */ diff --git a/Blastproof/config/bp_template.conf b/Blastproof/config/bp_template.cfg similarity index 91% rename from Blastproof/config/bp_template.conf rename to Blastproof/config/bp_template.cfg index 6cb8088..f4f18d9 100644 --- a/Blastproof/config/bp_template.conf +++ b/Blastproof/config/bp_template.cfg @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: MPL-2.0 # Blastproof config # WARNING : DO NOT PUT ANY NON-ASCII CHAR IN THIS FILE @@ -11,7 +12,7 @@ serial_port_erroring=true # Graphics # Define the font to use -font=bitra-ascii-medium.fbm +font=FONT.FBM # Define whether or not the boot animation should be played disable_boot_animation=true # Set the following both to 0 use highest resolution available @@ -46,3 +47,5 @@ kernel_log_disable_serial_port=false kernel_disable_serial_port=false # Define the size of the ring buffer for logging information. Value is in 4KB pages, ranging from 0 (ring logging disabled) to 65535 kernel_log_ring_size=2048 +# Define the amount of keyboards events each keyboard events queue can hold (ranging from 64 to 65535) +kernel_kbd_events_queue_capacity=256 diff --git a/Blastproof/config/config.json b/Blastproof/config/config.json new file mode 100644 index 0000000..0376339 --- /dev/null +++ b/Blastproof/config/config.json @@ -0,0 +1,24 @@ +{ + "version":"0.1", + "root_folder":"%filefolder%", + "run_context":"sub", + "name":"Blastproof configuration patching", + "actions":[ + { + "action":"run_command_wait", + "args":{ + "command_variables":true, + "command":[ + "./config_patch.sh", + "$INITFS_UNIQUE_UUID$", + "$SIGNSYST_UNIQUE_UUID$" + ], + "show_output":"on_failure", + "success_status":[ + 0 + ], + "ignore_success_status":false + } + } + ] +} diff --git a/Blastproof/config/config_patch.sh b/Blastproof/config/config_patch.sh new file mode 100755 index 0000000..cba8297 --- /dev/null +++ b/Blastproof/config/config_patch.sh @@ -0,0 +1,8 @@ +rm -f bp.conf +INITFS_TYPE_GUID="8362b434-d825-11f0-a68f-10ffe08423a6" +SIGNSYST_TYPE_GUID="da0048b4-d826-11f0-b877-10ffe08423a6" +INITFS_GUID=$1 +SIGNSYST_GUID=$2 +cp bp_template.cfg bp.cfg +sed -i -E "s/=(UUID_GENERATION_NEEDED_INITFS)/=$INITFS_GUID/" bp.cfg +sed -i -E "s/=(UUID_GENERATION_NEEDED_SIGNSYST)/=$SIGNSYST_GUID/" bp.cfg diff --git a/Blastproof/edk2.json b/Blastproof/edk2.json new file mode 100644 index 0000000..51f48c5 --- /dev/null +++ b/Blastproof/edk2.json @@ -0,0 +1,81 @@ +{ + "version":"0.1", + "root_folder":"%rootcallerfolder%", + "run_context":"sub", + "name":"EDK2 setup", + "actions":[ + { + "action":"run_command_wait", + "args":{ + "command_variables":false, + "command":[ + "git", + "clone", + "https://github.com/tianocore/edk2.git" + ], + "show_output":"live", + "success_status":[ + 0 + ], + "ignore_success_status":false + } + }, + { + "action":"run_command_wait_dir", + "args":{ + "command_variables":false, + "command":[ + "git", + "submodule", + "update", + "--init", + "--recursive", + "--progress" + ], + "show_output":"live", + "success_status":[ + 0 + ], + "ignore_success_status":false, + "working_dir_variables":true, + "working_dir":"%rootcallerfolder%/$EDK2_DIR$" + } + }, + { + "action":"run_command_wait_dir", + "args":{ + "command_variables":false, + "command":[ + "make", + "-C", + "BaseTools/" + ], + "show_output":"live", + "success_status":[ + 0 + ], + "ignore_success_status":false, + "working_dir_variables":true, + "working_dir":"%rootcallerfolder%/$EDK2_DIR$" + } + }, + { + "action":"run_command_wait_dir", + "args":{ + "command_variables":false, + "command":[ + "bash", + "-c", + "../Blastproof/ovmf.sh" + ], + "show_output":"live", + "success_status":[ + 0 + ], + "ignore_success_status":false, + "working_dir_variables":true, + "working_dir":"%rootcallerfolder%/$EDK2_DIR$" + } + } + ] +} diff --git a/Blastproof/fontgen/fontgen.json b/Blastproof/fontgen/fontgen.json new file mode 100644 index 0000000..dc366e3 --- /dev/null +++ b/Blastproof/fontgen/fontgen.json @@ -0,0 +1,92 @@ +{ + "version":"0.1", + "root_folder":"%filefolder%", + "run_context":"sub", + "name":"Fontgen build", + "actions":[ + { + "action":"compile_one_cpp", + "args":{ + "source_variables":false, + "source":"fontgen.cpp", + "compiler_variables":true, + "compiler":"$CPP_COMPILER$", + "pre_arguments_variables":true, + "pre_arguments":[ + ], + "post_arguments_variables":true, + "post_arguments":[ + "-o", + "$FONTGEN_BINARY_NAME$" + ], + "output_file_variables":true, + "output_file":"$FONTGEN_BINARY_NAME$", + "success_status":[ + 0 + ], + "ignore_success_status":true, + "cache_authorized":true, + "headers_command_variables":true, + "headers_command":"gcc -MMD -MF %dfile% -E %sourcefile% -o /dev/null" + } + }, + { + "action":"run_actions_if", + "args":{ + "condition":{ + "condition_variables":false, + "condition":"cache_contains", + "condition_args_variables":false, + "condition_args":[ + "font.fbm" + ] + }, + "actions":[ + { + "action":"extract_from_cache", + "args":{ + "target_variables":false, + "target":"font.fbm", + "output_file_variables":true, + "output_file":"%rootcallerfolder%/$EDK2_BLASTPROOF_DIR$/fontgen/font.fbm" + } + }, + { + "action":"exit_current_module", + "args":{ + "is_fail":false + } + } + ] + } + }, + { + "action":"run_command_wait", + "args":{ + "command_variables":true, + "command":[ + "./fontgen", + "#FFFFFF", + "#000000", + "ascii", + "./chars" + ], + "show_output":"on_failure", + "success_status":[ + 0 + ], + "ignore_success_status":false + } + }, + { + "action":"store_in_cache", + "args":{ + "key_variables":false, + "key":"font.fbm", + "file_variables":true, + "file":"%rootcallerfolder%/$EDK2_BLASTPROOF_DIR$/fontgen/font.fbm", + "overwrite_allowed":false + } + } + ] +} diff --git a/Blastproof/initfsgen/initfsgen.cpp b/Blastproof/initfsgen/initfsgen.cpp index 8473592..5d54ff0 100644 --- a/Blastproof/initfsgen/initfsgen.cpp +++ b/Blastproof/initfsgen/initfsgen.cpp @@ -12,14 +12,15 @@ extern "C" { #include #include #include +#include "common/versions.h" using namespace std; namespace fs=filesystem; #pragma pack(push,1) struct initfs_header { uint8_t sign[8]={'I','n','i','t','F','i','S','y'}; - uint16_t bootloader_version=0x0001; - uint16_t initfs_version=0x0001; - uint32_t os_version=0x00000001; + uint16_t bootloader_version=VY_COMMON_VERSIONS_BOOTLOADER; + uint16_t initfs_version=VY_COMMON_VERSIONS_INITFS; + uint32_t os_version=VY_COMMON_VERSIONS_OS; uint8_t installation_id[48]={0}; uint64_t initfs_size=0; uint64_t table_size=0; @@ -48,9 +49,9 @@ struct file_entry { #pragma pack(push,1) struct signsyst_header { uint8_t sign[8]={'S','i','g','n','S','y','s','t'}; - uint16_t bootloader_version=0x0001; - uint16_t initfs_version=0x0001; - uint32_t os_version=0x00000001; + uint16_t bootloader_version=VY_COMMON_VERSIONS_BOOTLOADER; + uint16_t initfs_version=VY_COMMON_VERSIONS_INITFS; + uint32_t os_version=VY_COMMON_VERSIONS_OS; uint8_t installation_id[48]={0}; uint64_t signature_size=0; uint64_t signature_count=0; @@ -138,7 +139,7 @@ int main(int argc,char **argv) { uint64_t value=(header.initfs_size+header.table_size+header.files_area_size+header.entries_width+header.entries_count+header.files_area_offset)%UINT64_MAX; header.check1=(value*0x9E3779B185EBCA87)^header.entropy_check1; sha3(header.installation_id,sizeof(header.installation_id),header.installation_id_hash_hash,sizeof(header.installation_id_hash_hash)); - ofstream initfs_footprint("initfs-footprint.bin",ios::binary); + ofstream initfs_footprint("initfsfp.bin",ios::binary); if (!initfs_footprint) { cout<<"[InitFSGen] Error: Can't open initfs-footprint.bin."<(entries_table.data()),entries_table.size()); initfs_bin.write(reinterpret_cast(files_area.data()),files_area.size()); initfs_bin.close(); - ofstream signsyst_hash("signsyst-hash.bin",ios::binary); + ofstream signsyst_hash("sshash.bin",ios::binary); if (!signsyst_hash) { cout<<"[InitFSGen] Error: Can't open signsyst-hash.bin."< -#include - -#include "address.h" -#include "params.h" -#include "utils.h" - -/* - * Specify which level of Merkle tree (the "layer") we're working on - */ -void set_layer_addr(uint32_t addr[8], uint32_t layer) -{ - ((unsigned char *)addr)[SPX_OFFSET_LAYER] = (unsigned char)layer; -} - -/* - * Specify which Merkle tree within the level (the "tree address") we're working on - */ -void set_tree_addr(uint32_t addr[8], uint64_t tree) -{ -#if (SPX_TREE_HEIGHT * (SPX_D - 1)) > 64 - #error Subtree addressing is currently limited to at most 2^64 trees -#endif - ull_to_bytes(&((unsigned char *)addr)[SPX_OFFSET_TREE], 8, tree ); -} - -/* - * Specify the reason we'll use this address structure for, that is, what - * hash will we compute with it. This is used so that unrelated types of - * hashes don't accidentally get the same address structure. The type will be - * one of the SPX_ADDR_TYPE constants - */ -void set_type(uint32_t addr[8], uint32_t type) -{ - ((unsigned char *)addr)[SPX_OFFSET_TYPE] = (unsigned char)type; -} - -/* - * Copy the layer and tree fields of the address structure. This is used - * when we're doing multiple types of hashes within the same Merkle tree - */ -void copy_subtree_addr(uint32_t out[8], const uint32_t in[8]) -{ - memcpy( out, in, SPX_OFFSET_TREE+8 ); -} - -/* These functions are used for OTS addresses. */ - -/* - * Specify which Merkle leaf we're working on; that is, which OTS keypair - * we're talking about. - */ -void set_keypair_addr(uint32_t addr[8], uint32_t keypair) -{ - u32_to_bytes(&((unsigned char *)addr)[SPX_OFFSET_KP_ADDR], keypair); -} - -/* - * Copy the layer, tree and keypair fields of the address structure. This is - * used when we're doing multiple things within the same OTS keypair - */ -void copy_keypair_addr(uint32_t out[8], const uint32_t in[8]) -{ - memcpy( out, in, SPX_OFFSET_TREE+8 ); - memcpy( (unsigned char *)out + SPX_OFFSET_KP_ADDR, (unsigned char *)in + SPX_OFFSET_KP_ADDR, 4); -} - -/* - * Specify which Merkle chain within the OTS we're working with - * (the chain address) - */ -void set_chain_addr(uint32_t addr[8], uint32_t chain) -{ - ((unsigned char *)addr)[SPX_OFFSET_CHAIN_ADDR] = (unsigned char)chain; -} - -/* - * Specify where in the Merkle chain we are -* (the hash address) - */ -void set_hash_addr(uint32_t addr[8], uint32_t hash) -{ - ((unsigned char *)addr)[SPX_OFFSET_HASH_ADDR] = (unsigned char)hash; -} - -/* These functions are used for all hash tree addresses (including FORS). */ - -/* - * Specify the height of the node in the Merkle/FORS tree we are in - * (the tree height) - */ -void set_tree_height(uint32_t addr[8], uint32_t tree_height) -{ - ((unsigned char *)addr)[SPX_OFFSET_TREE_HGT] = (unsigned char)tree_height; -} - -/* - * Specify the distance from the left edge of the node in the Merkle/FORS tree - * (the tree index) - */ -void set_tree_index(uint32_t addr[8], uint32_t tree_index) -{ - u32_to_bytes(&((unsigned char *)addr)[SPX_OFFSET_TREE_INDEX], tree_index ); -} diff --git a/Blastproof/keygen/address.o b/Blastproof/keygen/address.o deleted file mode 100644 index 5f348fe71f0d76369951f675b41a52824f1ddaf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2784 zcmbuBO=uHA6o6-AwKiIfqM)=$PX4<#5ie3SrNl0xQq+nEC2o?@)aH-u2AZN+2&hX? z>fJ+cUc{Rh5eXHvf~YqUJa`d2c&L~|4uZZnJ1@JLZZ7&@{=WCSJ1^VbPM$s)(lkb* zvE$4;5oK(#-`gj|Ho*qjMmA+Q-wfwg+o`r1$(FNZG?MLmk%cR-grfcH;%BZHwPM1tsarih-l9TM2Po>^QJ3`ObQjbIVZzd z*=xi36lCVs793I3T5pDp##Gy=FNGV-2?f@=rK{Gi$JpLm)$O&a?5%3qY+`);Sak2i z*{OZe*ik*M$D;9(_|aG_7H56%E}}5j!T)v}*@!l@v48yn z7!L!(fwB{)u}zUXq4B|W7r+3Hs2fENau_Gl-|+O8k%J83MEZ-K{w8ve12~cXnx}t+ z9Apnpq)&VL7sx?Q;6(a4PyYouNU!|AU3E|WuzYE~{70oes6H8b)q*a4?B}0V3IJ<5 zx8!Lzz;>&Ti@N}}OL97kI{-EUBLYK}F#s6HkP7ikusiZdhaA4q%g z?69AQ5oG@mIOcr@D~h-)SRcbc-a-gM^*o0?^3DEt5A2=f`xX9G@}%Tc4>Pmb3b!mh z!_H4$N?F`a<;@zeq>y)zUE$m#)qFl>ms07P%`MNQR_5Z6DV1v}tD5$F3cQdh*E*In zyjC`+eHp4p;@$B?h*f4-TP9~t7rjalQ>a(v3r#^$$5<+!SpG6f;eU?x-^%>KxTERBcu-X-O&C#yH^QLa|S)1uu z(>9r&wk)P+N`(S10xOnmuEV$akY$^h8F{{5tm@@Tsmv>Ojp-r+&!w(a%mSBB@_$Pd z-0@M?DPa=woR`l@YULMZQL!X?db1k_r_c z1dcKP)jtNl7!$vbexdxseh7QYPwO!s^P4V{fgc9go&wen1N+V|W}}Usdop6eZ-/dev/null; echo $$?) -# Detect compatible platform -ifneq ($(OPTTEST), 0) -$(info Building without optimizations) - SRC += src/ref.c -else -$(info Building with optimizations for $(OPTTARGET)) - CFLAGS += -march=$(OPTTARGET) - SRC += src/opt.c -endif - -BUILD_PATH := $(shell pwd) -KERNEL_NAME := $(shell uname -s) -MACHINE_NAME := $(shell uname -m) - -LIB_NAME = argon2 -PC_NAME = lib$(LIB_NAME).pc -PC_SRC = $(PC_NAME).in - -ifeq ($(KERNEL_NAME), Linux) - LIB_EXT := so.$(ABI_VERSION) - LIB_CFLAGS := -shared -fPIC -fvisibility=hidden -DA2_VISCTL=1 - SO_LDFLAGS := -Wl,-soname,lib$(LIB_NAME).$(LIB_EXT) - LINKED_LIB_EXT := so - PC_EXTRA_LIBS ?= -lrt -ldl -endif -ifeq ($(KERNEL_NAME), $(filter $(KERNEL_NAME),DragonFly FreeBSD NetBSD OpenBSD)) - LIB_EXT := so - LIB_CFLAGS := -shared -fPIC - PC_EXTRA_LIBS ?= -endif -ifeq ($(KERNEL_NAME), Darwin) - LIB_EXT := $(ABI_VERSION).dylib - LIB_CFLAGS = -dynamiclib -install_name $(PREFIX)/$(LIBRARY_REL)/lib$(LIB_NAME).$(LIB_EXT) - LINKED_LIB_EXT := dylib - PC_EXTRA_LIBS ?= -endif -ifeq ($(findstring CYGWIN, $(KERNEL_NAME)), CYGWIN) - LIB_EXT := dll - LIB_CFLAGS := -shared -Wl,--out-implib,lib$(LIB_NAME).$(LIB_EXT).a - PC_EXTRA_LIBS ?= -endif -ifeq ($(findstring MINGW, $(KERNEL_NAME)), MINGW) - LIB_EXT := dll - LIB_CFLAGS := -shared -Wl,--out-implib,lib$(LIB_NAME).$(LIB_EXT).a - PC_EXTRA_LIBS ?= -endif -ifeq ($(findstring MSYS, $(KERNEL_NAME)), MSYS) - LIB_EXT := dll - LIB_CFLAGS := -shared -Wl,--out-implib,lib$(LIB_NAME).$(LIB_EXT).a - PC_EXTRA_LIBS ?= -endif -ifeq ($(KERNEL_NAME), SunOS) - CC := gcc - CFLAGS += -D_REENTRANT - LIB_EXT := so - LIB_CFLAGS := -shared -fPIC - PC_EXTRA_LIBS ?= -endif - -ifeq ($(KERNEL_NAME), Linux) -ifeq ($(CC), clang) - CI_CFLAGS += -fsanitize=address -fsanitize=undefined -endif -endif - -LIB_SH := lib$(LIB_NAME).$(LIB_EXT) -LIB_ST := lib$(LIB_NAME).a - -ifdef LINKED_LIB_EXT -LINKED_LIB_SH := lib$(LIB_NAME).$(LINKED_LIB_EXT) -endif - -# Some systems don't provide an unprefixed ar when cross-compiling. -AR=ar - -LIBRARIES = $(LIB_SH) $(LIB_ST) -HEADERS = include/argon2.h - -INSTALL = install - -# relative paths for different OS -ifeq ($(KERNEL_NAME), $(filter $(KERNEL_NAME),DragonFly FreeBSD)) - -# default for FreeBSD -BINARY_REL ?= bin -INCLUDE_REL ?= include -LIBRARY_REL ?= lib -PKGCONFIG_REL ?= libdata - -else ifeq ($(KERNEL_NAME)-$(MACHINE_NAME), Linux-x86_64) - -# default for Debian/Ubuntu x86_64 -BINARY_REL ?= bin -INCLUDE_REL ?= include -LIBRARY_REL ?= lib/x86_64-linux-gnu -PKGCONFIG_REL ?= $(LIBRARY_REL) - -else - -# NetBSD, ... and Linux64/Linux32 variants that use plain lib directory -BINARY_REL ?= bin -INCLUDE_REL ?= include -LIBRARY_REL ?= lib -PKGCONFIG_REL ?= $(LIBRARY_REL) - -endif - -# absolute paths to staging area -INST_INCLUDE = $(DESTDIR)$(PREFIX)/$(INCLUDE_REL) -INST_LIBRARY = $(DESTDIR)$(PREFIX)/$(LIBRARY_REL) -INST_BINARY = $(DESTDIR)$(PREFIX)/$(BINARY_REL) -INST_PKGCONFIG = $(DESTDIR)$(PREFIX)/$(PKGCONFIG_REL)/pkgconfig - -# main target -.PHONY: all -all: $(RUN) libs - -.PHONY: libs -libs: $(LIBRARIES) $(PC_NAME) - -$(RUN): $(SRC) $(SRC_RUN) - $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@ - -$(BENCH): $(SRC) $(SRC_BENCH) - $(CC) $(CFLAGS) $^ -o $@ - -$(GENKAT): $(SRC) $(SRC_GENKAT) - $(CC) $(CFLAGS) $^ -o $@ -DGENKAT - -$(LIB_SH): $(SRC) - $(CC) $(CFLAGS) $(LIB_CFLAGS) $(LDFLAGS) $(SO_LDFLAGS) $^ -o $@ - -$(LIB_ST): $(OBJ) - $(AR) rcs $@ $^ - -.PHONY: clean -clean: - rm -f '$(RUN)' '$(BENCH)' '$(GENKAT)' - rm -f '$(LIB_SH)' '$(LIB_ST)' kat-argon2* '$(PC_NAME)' - rm -f testcase - rm -rf *.dSYM - cd src/ && rm -f *.o - cd src/blake2/ && rm -f *.o - cd kats/ && rm -f kat-* diff* run_* make_* - - -# all substitutions to pc template -SED_COMMANDS = /^\#\#.*$$/d; -SED_COMMANDS += s\#@PREFIX@\#$(PREFIX)\#g; -SED_COMMANDS += s\#@EXTRA_LIBS@\#$(PC_EXTRA_LIBS)\#g; -SED_COMMANDS += s\#@UPSTREAM_VER@\#$(ARGON2_VERSION)\#g; -SED_COMMANDS += s\#@HOST_MULTIARCH@\#$(LIBRARY_REL)\#g; -SED_COMMANDS += s\#@INCLUDE@\#$(INCLUDE_REL)\#g; - -# substitute PREFIX and PC_EXTRA_LIBS into pkgconfig pc file -$(PC_NAME): $(PC_SRC) - sed '$(SED_COMMANDS)' < '$(PC_SRC)' > '$@' - - -.PHONY: dist -dist: - cd ..; \ - tar -c --exclude='.??*' -z -f $(DIST)-`date "+%Y%m%d"`.tgz $(DIST)/* - -.PHONY: test -test: $(SRC) src/test.c - $(CC) $(CFLAGS) -Wextra -Wno-type-limits $^ -o testcase - @sh kats/test.sh - ./testcase - -.PHONY: testci -testci: $(SRC) src/test.c - $(CC) $(CI_CFLAGS) $^ -o testcase - @sh kats/test.sh - ./testcase - - -.PHONY: format -format: - clang-format -style="{BasedOnStyle: llvm, IndentWidth: 4}" \ - -i include/*.h src/*.c src/*.h src/blake2/*.c src/blake2/*.h - -.PHONY: install -install: $(RUN) libs - $(INSTALL) -d $(INST_INCLUDE) - $(INSTALL) -m 0644 $(HEADERS) $(INST_INCLUDE) - $(INSTALL) -d $(INST_LIBRARY) - $(INSTALL) -m 0644 $(LIBRARIES) $(INST_LIBRARY) -ifdef LINKED_LIB_SH - cd $(INST_LIBRARY) && ln -sf $(notdir $(LIB_SH) $(LINKED_LIB_SH)) -endif - $(INSTALL) -d $(INST_BINARY) - $(INSTALL) $(RUN) $(INST_BINARY) - $(INSTALL) -d $(INST_PKGCONFIG) - $(INSTALL) -m 0644 $(PC_NAME) $(INST_PKGCONFIG) - -.PHONY: uninstall -uninstall: - cd $(INST_INCLUDE) && rm -f $(notdir $(HEADERS)) - cd $(INST_LIBRARY) && rm -f $(notdir $(LIBRARIES) $(LINKED_LIB_SH)) - cd $(INST_BINARY) && rm -f $(notdir $(RUN)) - cd $(INST_PKG_CONFIG) && rm -f $(notdir $(PC_NAME)) diff --git a/Blastproof/keygen/argon2/Package.swift b/Blastproof/keygen/argon2/Package.swift deleted file mode 100644 index d3d9c83..0000000 --- a/Blastproof/keygen/argon2/Package.swift +++ /dev/null @@ -1,46 +0,0 @@ -// swift-tools-version:5.3 - -import PackageDescription - -let package = Package( - name: "argon2", - products: [ - .library( - name: "argon2", - targets: ["argon2"]), - ], - targets: [ - .target( - name: "argon2", - path: ".", - exclude: [ - "kats", - "vs2015", - "latex", - "libargon2.pc.in", - "export.sh", - "appveyor.yml", - "Argon2.sln", - "argon2-specs.pdf", - "CHANGELOG.md", - "LICENSE", - "Makefile", - "man", - "README.md", - "src/bench.c", - "src/genkat.c", - "src/opt.c", - "src/run.c", - "src/test.c", - ], - sources: [ - "src/blake2/blake2b.c", - "src/argon2.c", - "src/core.c", - "src/encoding.c", - "src/ref.c", - "src/thread.c" - ] - ) - ] -) \ No newline at end of file diff --git a/Blastproof/keygen/argon2/README.md b/Blastproof/keygen/argon2/README.md deleted file mode 100644 index 91fc3fd..0000000 --- a/Blastproof/keygen/argon2/README.md +++ /dev/null @@ -1,303 +0,0 @@ -# Argon2 - -[![Build Status](https://travis-ci.org/P-H-C/phc-winner-argon2.svg?branch=master)](https://travis-ci.org/P-H-C/phc-winner-argon2) -[![Build status](https://ci.appveyor.com/api/projects/status/8nfwuwq55sgfkele?svg=true)](https://ci.appveyor.com/project/P-H-C/phc-winner-argon2) -[![codecov.io](https://codecov.io/github/P-H-C/phc-winner-argon2/coverage.svg?branch=master)](https://codecov.io/github/P-H-C/phc-winner-argon2?branch=master) - -This is the reference C implementation of Argon2, the password-hashing -function that won the [Password Hashing Competition -(PHC)](https://password-hashing.net). - -Argon2 is a password-hashing function that summarizes the state of the -art in the design of memory-hard functions and can be used to hash -passwords for credential storage, key derivation, or other applications. - -It has a simple design aimed at the highest memory filling rate and -effective use of multiple computing units, while still providing defense -against tradeoff attacks (by exploiting the cache and memory organization -of the recent processors). - -Argon2 has three variants: Argon2i, Argon2d, and Argon2id. Argon2d is faster -and uses data-depending memory access, which makes it highly resistant -against GPU cracking attacks and suitable for applications with no threats -from side-channel timing attacks (eg. cryptocurrencies). Argon2i instead -uses data-independent memory access, which is preferred for password -hashing and password-based key derivation, but it is slower as it makes -more passes over the memory to protect from tradeoff attacks. Argon2id is a -hybrid of Argon2i and Argon2d, using a combination of data-depending and -data-independent memory accesses, which gives some of Argon2i's resistance to -side-channel cache timing attacks and much of Argon2d's resistance to GPU -cracking attacks. - -Argon2i, Argon2d, and Argon2id are parametrized by: - -* A **time** cost, which defines the amount of computation realized and - therefore the execution time, given in number of iterations -* A **memory** cost, which defines the memory usage, given in kibibytes -* A **parallelism** degree, which defines the number of parallel threads - -The [Argon2 document](argon2-specs.pdf) gives detailed specs and design -rationale. - -Please report bugs as issues on this repository. - -## Usage - -`make` builds the executable `argon2`, the static library `libargon2.a`, -and the shared library `libargon2.so` (or on macOS, the dynamic library -`libargon2.dylib` -- make sure to specify the installation prefix when -you compile: `make PREFIX=/usr`). Make sure to run `make test` to verify -that your build produces valid results. `sudo make install PREFIX=/usr` -installs it to your system. - -### Command-line utility - -`argon2` is a command-line utility to test specific Argon2 instances -on your system. To show usage instructions, run -`./argon2 -h` as -``` -Usage: ./argon2 [-h] salt [-i|-d|-id] [-t iterations] [-m memory] [-p parallelism] [-l hash length] [-e|-r] [-v (10|13)] - Password is read from stdin -Parameters: - salt The salt to use, at least 8 characters - -i Use Argon2i (this is the default) - -d Use Argon2d instead of Argon2i - -id Use Argon2id instead of Argon2i - -t N Sets the number of iterations to N (default = 3) - -m N Sets the memory usage of 2^N KiB (default 12) - -p N Sets parallelism to N threads (default 1) - -l N Sets hash output length to N bytes (default 32) - -e Output only encoded hash - -r Output only the raw bytes of the hash - -v (10|13) Argon2 version (defaults to the most recent version, currently 13) - -h Print argon2 usage -``` -For example, to hash "password" using "somesalt" as a salt and doing 2 -iterations, consuming 64 MiB, using four parallel threads and an output hash -of 24 bytes -``` -$ echo -n "password" | ./argon2 somesalt -t 2 -m 16 -p 4 -l 24 -Type: Argon2i -Iterations: 2 -Memory: 65536 KiB -Parallelism: 4 -Hash: 45d7ac72e76f242b20b77b9bf9bf9d5915894e669a24e6c6 -Encoded: $argon2i$v=19$m=65536,t=2,p=4$c29tZXNhbHQ$RdescudvJCsgt3ub+b+dWRWJTmaaJObG -0.188 seconds -Verification ok -``` - -### Library - -`libargon2` provides an API to both low-level and high-level functions -for using Argon2. - -The example program below hashes the string "password" with Argon2i -using the high-level API and then using the low-level API. While the -high-level API takes the three cost parameters (time, memory, and -parallelism), the password input buffer, the salt input buffer, and the -output buffers, the low-level API takes in these and additional parameters -, as defined in [`include/argon2.h`](include/argon2.h). - -There are many additional parameters, but we will highlight three of them here. - -1. The `secret` parameter, which is used for [keyed hashing]( - https://en.wikipedia.org/wiki/Hash-based_message_authentication_code). - This allows a secret key to be input at hashing time (from some external - location) and be folded into the value of the hash. This means that even if - your salts and hashes are compromised, an attacker cannot brute-force to find - the password without the key. - -2. The `ad` parameter, which is used to fold any additional data into the hash - value. Functionally, this behaves almost exactly like the `secret` or `salt` - parameters; the `ad` parameter is folding into the value of the hash. - However, this parameter is used for different data. The `salt` should be a - random string stored alongside your password. The `secret` should be a random - key only usable at hashing time. The `ad` is for any other data. - -3. The `flags` parameter, which determines which memory should be securely - erased. This is useful if you want to securely delete the `pwd` or `secret` - fields right after they are used. To do this set `flags` to either - `ARGON2_FLAG_CLEAR_PASSWORD` or `ARGON2_FLAG_CLEAR_SECRET`. To change how - internal memory is cleared, change the global flag - `FLAG_clear_internal_memory` (defaults to clearing internal memory). - -Here the time cost `t_cost` is set to 2 iterations, the -memory cost `m_cost` is set to 216 kibibytes (64 mebibytes), -and parallelism is set to 1 (single-thread). - -Compile for example as `gcc test.c libargon2.a -Isrc -o test`, if the program -below is named `test.c` and placed in the project's root directory. - -```c -#include "argon2.h" -#include -#include -#include - -#define HASHLEN 32 -#define SALTLEN 16 -#define PWD "password" - -int main(void) -{ - uint8_t hash1[HASHLEN]; - uint8_t hash2[HASHLEN]; - - uint8_t salt[SALTLEN]; - memset( salt, 0x00, SALTLEN ); - - uint8_t *pwd = (uint8_t *)strdup(PWD); - uint32_t pwdlen = strlen((char *)pwd); - - uint32_t t_cost = 2; // 2-pass computation - uint32_t m_cost = (1<<16); // 64 mebibytes memory usage - uint32_t parallelism = 1; // number of threads and lanes - - // high-level API - argon2i_hash_raw(t_cost, m_cost, parallelism, pwd, pwdlen, salt, SALTLEN, hash1, HASHLEN); - - // low-level API - argon2_context context = { - hash2, /* output array, at least HASHLEN in size */ - HASHLEN, /* digest length */ - pwd, /* password array */ - pwdlen, /* password length */ - salt, /* salt array */ - SALTLEN, /* salt length */ - NULL, 0, /* optional secret data */ - NULL, 0, /* optional associated data */ - t_cost, m_cost, parallelism, parallelism, - ARGON2_VERSION_13, /* algorithm version */ - NULL, NULL, /* custom memory allocation / deallocation functions */ - /* by default only internal memory is cleared (pwd is not wiped) */ - ARGON2_DEFAULT_FLAGS - }; - - int rc = argon2i_ctx( &context ); - if(ARGON2_OK != rc) { - printf("Error: %s\n", argon2_error_message(rc)); - exit(1); - } - free(pwd); - - for( int i=0; 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%0D6j4V_KBMYrT%K}Pd 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

NW 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