Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
8f4d86e
Update absorption of associated data to be multi-shot
itzmeanjan Dec 17, 2024
effff35
Update encryption of plaintext to be multi-shot
itzmeanjan Dec 19, 2024
50ed1f0
Simplify control flow in function, absorbing associated data
itzmeanjan Dec 19, 2024
01c1fc0
Prefer more explicit function name
itzmeanjan Dec 19, 2024
af97725
Update decryption of ciphertext to be multi-shot
itzmeanjan Dec 19, 2024
a539f17
Update API documentation for AEAD duplex mode function(s)
itzmeanjan Dec 19, 2024
782a3f0
Add path to subtle as dependency in makefile rule
itzmeanjan Dec 19, 2024
a10e4ec
Remove unused functions
itzmeanjan Dec 19, 2024
0eba587
Merge branch 'master' into towards-safer-aead-public-api
itzmeanjan Apr 10, 2025
834e816
Ascon aead struct supporting incremental encrypt/ decrypt
itzmeanjan Apr 14, 2025
59839c7
Add error type for ascon-aead128, make incremental ciphering easy to use
itzmeanjan Apr 15, 2025
b82a13e
Get rid of redundant error type from enum
itzmeanjan Apr 15, 2025
a25ffc2
Keep a copy of the key and nonce in ascon-aead128 struct
itzmeanjan Apr 15, 2025
1299668
Update Ascon-aead128 KAT tests to use newly developed incremental cip…
itzmeanjan Apr 15, 2025
cbb56ba
Refactor ascon-aead128 error codes
itzmeanjan Apr 16, 2025
6ae0081
Add doxygen documentation for Ascon-AEAD128 class
itzmeanjan Apr 16, 2025
517f584
Update compile-time encrypt/ decrypt check to use new API of Ascon-AE…
itzmeanjan Apr 16, 2025
4c5be3b
Update prop. test for Ascon-AEAD128 to use new incremental encrypt/ d…
itzmeanjan Apr 16, 2025
c72c695
Update Ascon-AEAD128 example to use new incremental encrypt/ decrypt API
itzmeanjan Apr 16, 2025
05d1efe
Update Ascon-AEAD128 benchmark function to use new AEAD API
itzmeanjan Apr 16, 2025
e70dcb4
Remove legacy oneshot API of Ascon-AEAD128 encrypt/ decrypt
itzmeanjan Apr 16, 2025
ce46f70
Do not upload build log to github actions ci artifactory
itzmeanjan Apr 16, 2025
ece71f3
Add state transition correctness tests for Ascon-AEAD128 object
itzmeanjan Apr 19, 2025
55cc4e0
Add test ensuring that both oneshot and incremental encryption works …
itzmeanjan Apr 19, 2025
0507e24
Zero out portions of message block to ensure that correct plaintext b…
itzmeanjan Apr 19, 2025
300f480
Add test ensuring that both oneshot and incremental decryption works …
itzmeanjan Apr 19, 2025
e52d588
Update benchmark results for x86_64 desktop target
itzmeanjan Apr 19, 2025
19e27bc
Update project documentation
itzmeanjan Apr 19, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 4 additions & 27 deletions .github/workflows/test_ci.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Taken from https://github.com/itzmeanjan/ml-kem/blob/61cf680b1c0e2590bd7b650c07cd477e90cab46d/.github/workflows/test_ci.yml
name: Test Ascon LwC Cipher Suite i.e. NIST SP 800-232
name: Test Ascon LwC Cipher Suite (NIST SP 800-232)

on:
push:
Expand All @@ -26,39 +26,16 @@ jobs:
with:
tag: v1.15.2


- name: Build and Test (${{ matrix.compiler }}, ${{ matrix.build_type }}, ${{ matrix.test_type }})
run: |
CXX=${{ matrix.compiler }}
if [[ ${{ matrix.test_type }} == "standard" ]]; then
make test -j 2>&1 | tee build.log
make test -j
else
make ${{ matrix.build_type }}_${{ matrix.test_type }}_test -j 2>&1 | tee build.log
fi
if [ $? -ne 0 ]; then
echo "Build or Test Failed! See build.log for details."
exit 1
make ${{ matrix.build_type }}_${{ matrix.test_type }}_test -j
fi

- name: Upload Build Log
uses: actions/upload-artifact@v3
with:
name: build-log-${{ matrix.compiler }}-${{ matrix.build_type }}-${{ matrix.test_type }}
path: build.log


- name: Run Examples
if: ${{ matrix.test_type == 'standard' && matrix.build_type == 'release' }}
run: |
CXX=${{ matrix.compiler }} make example -j 2>&1 | tee example.log
if [ $? -ne 0 ]; then
echo "Example execution Failed! See example.log for details."
exit 1
fi

- name: Upload Example Log (if failed)
if: ${{ steps.Run_Examples.outcome != 'success' && matrix.test_type == 'standard' && matrix.build_type == 'release' }}
uses: actions/upload-artifact@v3
with:
name: example-log-${{ matrix.compiler }}
path: example.log
CXX=${{ matrix.compiler }} make example -j
77 changes: 54 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,23 +50,44 @@ make release_ubsan_test -j # Run release tests with UndefinedBehaviorSanitizer
Test results (pass/fail) are printed to the console.

```bash
PASSED TESTS (16/16):
1 ms: build/test/test.out AsconCXOF128.CompileTimeComputeXofOutput
1 ms: build/test/test.out AsconAEAD128.CompileTimeEncryptAndThenDecrypt
PASSED TESTS (37/37):
1 ms: build/test/test.out AsconAEAD128.ValidEncryptionSequence
1 ms: build/test/test.out AsconAEAD128.FinalizeDataCalledTwice
1 ms: build/test/test.out AsconAEAD128.DecryptCiphertextAfterFinalizeDecrypt
1 ms: build/test/test.out AsconXof128.CompileTimeComputeXofOutput
2 ms: build/test/test.out AsconHash256.CompileTimeComputeMessageDigest
1 ms: build/test/test.out AsconAEAD128.AbsorbDataAfterFinalizeData
1 ms: build/test/test.out AsconAEAD128.DecryptCiphertextBeforeFinalizeData
1 ms: build/test/test.out AsconAEAD128.FinalizeDecryptBeforeFinalizeData
1 ms: build/test/test.out AsconAEAD128.EncryptPlaintextAfterFinalizeEncrypt
1 ms: build/test/test.out AsconAEAD128.FinalizeDecryptCalledTwice
1 ms: build/test/test.out AsconAEAD128.AbsorbDataAfterEncrypt
1 ms: build/test/test.out AsconAEAD128.AbsorbDataAfterDecrypt
1 ms: build/test/test.out AsconHash256.CompileTimeComputeMessageDigest
2 ms: build/test/test.out AsconAEAD128.MultipleDecryptCiphertextCalls
2 ms: build/test/test.out AsconAEAD128.MultipleAbsorbDataCalls
2 ms: build/test/test.out AsconAEAD128.MultipleEncryptPlaintextCalls
2 ms: build/test/test.out AsconAEAD128.FinalizeDataWithoutAbsorb
2 ms: build/test/test.out AsconAEAD128.EncryptPlaintextBeforeFinalizeData
2 ms: build/test/test.out AsconCXOF128.CompileTimeComputeXofOutput
2 ms: build/test/test.out AsconAEAD128.CompileTimeEncryptAndThenDecrypt
2 ms: build/test/test.out AsconAEAD128.FinalizeEncryptBeforeFinalizeData
2 ms: build/test/test.out AsconAEAD128.FinalizeEncryptCalledTwice
3 ms: build/test/test.out AsconAEAD128.ValidDecryptionSequence
4 ms: build/test/test.out AsconAEAD128.KnownAnswerTests
6 ms: build/test/test.out AsconHash256.ForSameMessageOneshotHashingAndIncrementalHashingProducesSameDigest
7 ms: build/test/test.out AsconXof128.KnownAnswerTests
8 ms: build/test/test.out AsconHash256.KnownAnswerTests
449 ms: build/test/test.out AsconAEAD128.DecryptionFailureDueToBitFlippingInAssociatedData
451 ms: build/test/test.out AsconAEAD128.DecryptionFailureDueToBitFlippingInCipherText
452 ms: build/test/test.out AsconAEAD128.DecryptionFailureDueToBitFlippingInNonce
452 ms: build/test/test.out AsconAEAD128.DecryptionFailureDueToBitFlippingInKey
453 ms: build/test/test.out AsconAEAD128.DecryptionFailureDueToBitFlippingInTag
457 ms: build/test/test.out AsconAEAD128.EncryptThenDecrypt
638 ms: build/test/test.out AsconXof128.ForSameMessageOneshotHashingAndIncrementalHashingProducesSameOutput
3126 ms: build/test/test.out AsconCXOF128.ForSameMessageOneshotHashingAndIncrementalHashingProducesSameOutput
4 ms: build/test/test.out AsconCXOF128.KnownAnswerTests
7 ms: build/test/test.out AsconHash256.ForSameMessageOneshotHashingAndIncrementalHashingProducesSameDigest
9 ms: build/test/test.out AsconHash256.KnownAnswerTests
10 ms: build/test/test.out AsconXof128.KnownAnswerTests
557 ms: build/test/test.out AsconAEAD128.DecryptionFailureDueToBitFlippingInCipherText
557 ms: build/test/test.out AsconAEAD128.DecryptionFailureDueToBitFlippingInNonce
558 ms: build/test/test.out AsconAEAD128.DecryptionFailureDueToBitFlippingInTag
558 ms: build/test/test.out AsconAEAD128.DecryptionFailureDueToBitFlippingInKey
559 ms: build/test/test.out AsconAEAD128.DecryptionFailureDueToBitFlippingInAssociatedData
565 ms: build/test/test.out AsconAEAD128.ForSameCiphertextOneshotDecryptionAndIncrementalDecryptionProducesSamePlaintext
566 ms: build/test/test.out AsconAEAD128.EncryptThenDecrypt
566 ms: build/test/test.out AsconAEAD128.ForSamePlaintextOneshotEncryptionAndIncrementalEncryptionProducesSameTag
737 ms: build/test/test.out AsconXof128.ForSameMessageOneshotHashingAndIncrementalHashingProducesSameOutput
3203 ms: build/test/test.out AsconCXOF128.ForSameMessageOneshotHashingAndIncrementalHashingProducesSameOutput
```

> [!NOTE]
Expand All @@ -93,7 +114,7 @@ make perf -j # Run benchmarks with CPU cycle counting (requires libPFM)

### On 12th Gen Intel(R) Core(TM) i7-1260P

JSON benchmark result lives in [bench_result_on_Linux_6.11.0-9-generic_x86_64_with_g++_14](./bench_result_on_Linux_6.11.0-9-generic_x86_64_with_g++_14.json).
JSON benchmark result lives in [bench_result_on_Linux_6.14.0-15-generic_x86_64_with_g++_14](./bench_result_on_Linux_6.14.0-15-generic_x86_64_with_g++_14.json).

### On ARM Cortex-A72 ( i.e. Raspberry Pi 4B )

Expand All @@ -108,7 +129,7 @@ This section demonstrates how to use the Ascon header-only library for authentic
Ascon-AEAD128 provides authenticated encryption with associated data. The associated data is authenticated but not encrypted.

```cpp
#include <ascon/aead/ascon_aead128.hpp>
#include "ascon/aead/ascon_aead128.hpp"
#include <array>
#include <iostream>

Expand All @@ -122,15 +143,25 @@ int main() {
std::array<uint8_t, 16> tag{};

// Encryption
ascon_aead128::encrypt(key, nonce, ad, plaintext, ciphertext, tag);
ascon_aead128::ascon_aead128_t enc_handle(key, nonce);

assert(enc_handle.absorb_data(ad) == ascon_aead128::ascon_aead128_status_t::absorbed_data);
assert(enc_handle.finalize_data() == ascon_aead128::ascon_aead128_status_t::finalized_data_absorption_phase);
assert(enc_handle.encrypt_plaintext(plaintext, ciphertext) == ascon_aead128::ascon_aead128_status_t::encrypted_plaintext);
assert(enc_handle.finalize_encrypt(tag) == ascon_aead128::ascon_aead128_status_t::finalized_encryption_phase);

// Decryption
std::array<uint8_t, 10> decrypted_plaintext{};
bool success = ascon_aead128::decrypt(key, nonce, ad, ciphertext, decrypted_plaintext, tag);

ascon_aead128::ascon_aead128_t dec_handle(key, nonce);

assert(dec_handle.absorb_data(ad) == ascon_aead128::ascon_aead128_status_t::absorbed_data);
assert(dec_handle.finalize_data() == ascon_aead128::ascon_aead128_status_t::finalized_data_absorption_phase);
assert(dec_handle.decrypt_ciphertext(ciphertext, decrypted_plaintext) == ascon_aead128::ascon_aead128_status_t::decrypted_ciphertext);
const bool success = dec_handle.finalize_decrypt(tag) == ascon_aead128::ascon_aead128_status_t::decryption_success_as_tag_matches;

if (success) {
std::cout << "Decryption successful!" << std::endl;
// Check decrypted_plaintext
} else {
std::cout << "Decryption failed!" << std::endl;
}
Expand All @@ -144,7 +175,7 @@ int main() {
Ascon-Hash256 computes a 256-bit (32-byte) hash.

```cpp
#include <ascon/hashes/ascon_hash256.hpp>
#include "ascon/hashes/ascon_hash256.hpp"
#include <array>
#include <cassert>

Expand All @@ -167,8 +198,8 @@ int main() {
Ascon-XOF128 and Ascon-CXOF128 are extendable output functions. XOF128 produces a variable-length output, while CXOF128 allows for customization with an application-specific string.

```cpp
#include <ascon/hashes/ascon_xof128.hpp>
#include <ascon/hashes/ascon_cxof128.hpp>
#include "ascon/hashes/ascon_xof128.hpp"
#include "ascon/hashes/ascon_cxof128.hpp"
#include <array>
#include <cassert>

Expand Down
Loading