You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
5.6 KiB
159 lines
5.6 KiB
#include "../src/secure_channel.h" |
|
#include <tinycrypt/aes.h> |
|
#include <tinycrypt/ccm_mode.h> |
|
#include <tinycrypt/constants.h> |
|
#include <stdint.h> |
|
#include <string.h> |
|
#include <stdio.h> |
|
|
|
#define SC_NONCE_SIZE 8 |
|
#define SC_TAG_SIZE 8 |
|
#define SC_SESSION_KEY_SIZE 16 |
|
#define SC_CRC32_SIZE 4 |
|
|
|
int main() { |
|
printf("=== Step-by-Step Debug ===\n"); |
|
|
|
// 1. Setup context |
|
struct SC_MYKEYS keys; |
|
for (int i = 0; i < 32; i++) { |
|
keys.private_key[i] = i; |
|
keys.public_key[i] = i + 64; |
|
} |
|
|
|
sc_context_t ctx; |
|
sc_init_ctx(&ctx, &keys); |
|
|
|
// Manually setup for encryption |
|
memcpy(ctx.peer_public_key, keys.public_key, 64); |
|
ctx.peer_key_set = 1; |
|
ctx.session_ready = 1; |
|
|
|
uint8_t test_session_key[SC_SESSION_KEY_SIZE]; |
|
for (int i = 0; i < SC_SESSION_KEY_SIZE; i++) { |
|
test_session_key[i] = i + 100; |
|
} |
|
memcpy(ctx.session_key, test_session_key, SC_SESSION_KEY_SIZE); |
|
|
|
// 2. Test data preparation |
|
uint8_t plaintext[] = "Hello"; |
|
size_t plaintext_len = sizeof(plaintext) - 1; |
|
uint8_t plaintext_with_crc[plaintext_len + SC_CRC32_SIZE]; |
|
uint8_t combined_output[plaintext_len + SC_CRC32_SIZE + SC_TAG_SIZE]; |
|
|
|
printf("Test data:\n"); |
|
printf(" Plaintext: '%.*s' (%zu bytes)\n", (int)plaintext_len, plaintext, plaintext_len); |
|
printf(" Total buffer size: %zu bytes\n", plaintext_len + SC_CRC32_SIZE + SC_TAG_SIZE); |
|
|
|
// 3. Test CRC32 calculation |
|
memcpy(plaintext_with_crc, plaintext, plaintext_len); |
|
printf("\nStep 1: Copying plaintext... ✓\n"); |
|
|
|
// Import CRC32 function |
|
extern uint32_t crc32_calc(const uint8_t *data, size_t len); |
|
uint32_t crc = crc32_calc(plaintext, plaintext_len); |
|
printf("Step 2: CRC32 calculation... 0x%08x\n", crc); |
|
|
|
plaintext_with_crc[plaintext_len] = (crc >> 0) & 0xFF; |
|
plaintext_with_crc[plaintext_len + 1] = (crc >> 8) & 0xFF; |
|
plaintext_with_crc[plaintext_len + 2] = (crc >> 16) & 0xFF; |
|
plaintext_with_crc[plaintext_len + 3] = (crc >> 24) & 0xFF; |
|
printf("Step 3: Adding CRC to data... ✓\n"); |
|
|
|
// 4. Test AES key setup |
|
struct tc_aes_key_sched_struct sched; |
|
printf("\nStep 4: AES key setup...\n"); |
|
printf(" Session key: "); |
|
for (int i = 0; i < SC_SESSION_KEY_SIZE; i++) { |
|
printf("%02x ", ctx.session_key[i]); |
|
} |
|
printf("\n"); |
|
|
|
int aes_result = tc_aes128_set_encrypt_key(&sched, ctx.session_key); |
|
printf(" tc_aes128_set_encrypt_key returned: %d (should be 1)\n", aes_result); |
|
|
|
if (aes_result != 1) { |
|
printf("❌ AES key setup failed!\n"); |
|
return 1; |
|
} |
|
printf("✓ AES key setup successful\n"); |
|
|
|
// 5. Test nonce building |
|
uint8_t nonce[SC_NONCE_SIZE]; |
|
printf("\nStep 5: Building nonce...\n"); |
|
printf(" Counter: %llu\n", (unsigned long long)ctx.tx_counter); |
|
|
|
// Simple nonce building (mimicking sc_build_nonce) |
|
for (int i = 0; i < 4; i++) { |
|
nonce[i] = (ctx.tx_counter >> (i * 8)) & 0xFF; |
|
} |
|
for (int i = 4; i < SC_NONCE_SIZE; i++) { |
|
nonce[i] = i + 0x10; |
|
} |
|
printf(" Nonce: "); |
|
for (int i = 0; i < SC_NONCE_SIZE; i++) { |
|
printf("%02x ", nonce[i]); |
|
} |
|
printf("\n"); |
|
|
|
// 6. Test CCM config |
|
struct tc_ccm_mode_struct ccm_state; |
|
printf("\nStep 6: CCM config...\n"); |
|
printf(" Nonce size: %d, Tag size: %d\n", SC_NONCE_SIZE, SC_TAG_SIZE); |
|
|
|
int ccm_result = tc_ccm_config(&ccm_state, &sched, nonce, SC_NONCE_SIZE, SC_TAG_SIZE); |
|
printf(" tc_ccm_config returned: %d (should be 1)\n", ccm_result); |
|
|
|
if (ccm_result != 1) { |
|
printf("❌ CCM config failed!\n"); |
|
return 1; |
|
} |
|
printf("✓ CCM config successful\n"); |
|
|
|
// 7. Test encryption |
|
printf("\nStep 7: CCM encryption...\n"); |
|
size_t total_plaintext_len = plaintext_len + SC_CRC32_SIZE; |
|
printf(" Total plaintext length: %zu bytes\n", total_plaintext_len); |
|
|
|
int enc_result = tc_ccm_generation_encryption(combined_output, sizeof(combined_output), |
|
NULL, 0, /* no associated data */ |
|
plaintext_with_crc, total_plaintext_len, |
|
&ccm_state); |
|
printf(" tc_ccm_generation_encryption returned: %d (should be 1)\n", enc_result); |
|
|
|
if (enc_result != 1) { |
|
printf("❌ CCM encryption failed!\n"); |
|
return 1; |
|
} |
|
printf("🎉 CCM encryption successful!\n"); |
|
printf(" Ciphertext length: %zu bytes\n", total_plaintext_len + SC_TAG_SIZE); |
|
|
|
// 8. Test decryption |
|
printf("\nStep 8: CCM decryption...\n"); |
|
uint8_t decrypted[total_plaintext_len]; |
|
|
|
int dec_result = tc_ccm_decryption_verification(decrypted, total_plaintext_len, |
|
NULL, 0, combined_output, total_plaintext_len + SC_TAG_SIZE, |
|
&ccm_state); |
|
printf(" tc_ccm_decryption_verification returned: %d (should be 1)\n", dec_result); |
|
|
|
if (dec_result != 1) { |
|
printf("❌ CCM decryption failed!\n"); |
|
return 1; |
|
} |
|
printf("🎉 CCM decryption successful!\n"); |
|
|
|
// Verify result |
|
printf("\nVerification:\n"); |
|
printf(" Original: '%.*s'\n", (int)plaintext_len, plaintext); |
|
printf(" Decrypted: '%.*s'\n", (int)plaintext_len, decrypted); |
|
|
|
if (memcmp(plaintext, decrypted, plaintext_len) == 0) { |
|
printf("✓ Decrypted data matches original!\n"); |
|
} else { |
|
printf("❌ Decrypted data doesn't match original!\n"); |
|
} |
|
|
|
printf("\n=== All crypto operations successful! ===\n"); |
|
return 0; |
|
}
|
|
|