Pre-mbedTLS cleanup checkpoint - OpenSSL migration complete, all tests passing

This commit is contained in:
2025-08-14 11:51:26 -04:00
parent 5a7c796873
commit 6d7b709f9a
17 changed files with 1438 additions and 49 deletions

View File

@@ -1,13 +1,13 @@
# NOSTR Test Suite Makefile
CC = gcc
CFLAGS = -Wall -Wextra -std=c99 -g -I.. -I../secp256k1/include -I../mbedtls-install/include
LDFLAGS = -L.. -L../secp256k1/.libs -L../mbedtls-install/lib -lnostr_core -l:libsecp256k1.a -l:libmbedtls.a -l:libmbedx509.a -l:libmbedcrypto.a -lm -static
CFLAGS = -Wall -Wextra -std=c99 -g -I.. -I../secp256k1/include -I../openssl-install/include
LDFLAGS = -L.. -lnostr_core -lm -static
# ARM64 cross-compilation settings
ARM64_CC = aarch64-linux-gnu-gcc
ARM64_CFLAGS = -Wall -Wextra -std=c99 -g -I..
ARM64_LDFLAGS = -L.. -lnostr_core_arm64 -lm -static
ARM64_LDFLAGS = -L.. -lnostr_core_arm64 -lssl -lcrypto -lm -static
# Test executables
CRYPTO_TEST_EXEC = nostr_crypto_test
@@ -16,6 +16,8 @@ RELAY_POOL_TEST_EXEC = relay_pool_test
EVENT_GEN_TEST_EXEC = test_event_generation
POW_LOOP_TEST_EXEC = test_pow_loop
NIP04_TEST_EXEC = nip04_test
HTTP_TEST_EXEC = http_test
WSS_TEST_EXEC = wss_test
STATIC_LINKING_TEST_EXEC = static_linking_only_test
ARM64_CRYPTO_TEST_EXEC = nostr_crypto_test_arm64
ARM64_CORE_TEST_EXEC = nostr_core_test_arm64
@@ -55,6 +57,16 @@ $(NIP04_TEST_EXEC): nip04_test.c
@echo "Building NIP-04 encryption test suite (x86_64)..."
$(CC) $(CFLAGS) $< -o $@ $(LDFLAGS)
# Build HTTP test executable (x86_64)
$(HTTP_TEST_EXEC): http_test.c
@echo "Building HTTP/curl compatibility test (x86_64)..."
$(CC) $(CFLAGS) $< -o $@ -lcurl
# Build WebSocket SSL test executable (x86_64)
$(WSS_TEST_EXEC): wss_test.c
@echo "Building WebSocket SSL/OpenSSL compatibility test (x86_64)..."
$(CC) $(CFLAGS) $< -o $@ $(LDFLAGS)
# Build static linking test executable (x86_64)
$(STATIC_LINKING_TEST_EXEC): static_linking_only_test.c
@echo "Building static linking verification test (x86_64)..."
@@ -149,13 +161,23 @@ test-nip04: $(NIP04_TEST_EXEC)
@echo "Running NIP-04 encryption tests (x86_64)..."
./$(NIP04_TEST_EXEC)
# Run HTTP tests (x86_64)
test-http: $(HTTP_TEST_EXEC)
@echo "Running HTTP/curl compatibility tests (x86_64)..."
./$(HTTP_TEST_EXEC)
# Run WebSocket SSL tests (x86_64)
test-wss: $(WSS_TEST_EXEC)
@echo "Running WebSocket SSL/OpenSSL compatibility tests (x86_64)..."
./$(WSS_TEST_EXEC)
# Run static linking verification test (x86_64)
test-static-linking: $(STATIC_LINKING_TEST_EXEC)
@echo "Running static linking verification test (x86_64)..."
./$(STATIC_LINKING_TEST_EXEC)
# Run all test suites (x86_64)
test: test-crypto test-core test-relay-pool test-nip04 test-static-linking
test: test-crypto test-core test-relay-pool test-nip04 test-http test-wss test-static-linking
# Run crypto tests ARM64 (requires qemu-user-static or ARM64 system)
test-crypto-arm64: $(ARM64_CRYPTO_TEST_EXEC)
@@ -202,7 +224,7 @@ test-all: test test-arm64
# Clean
clean:
@echo "Cleaning test artifacts..."
rm -f $(CRYPTO_TEST_EXEC) $(CORE_TEST_EXEC) $(RELAY_POOL_TEST_EXEC) $(EVENT_GEN_TEST_EXEC) $(POW_LOOP_TEST_EXEC) $(NIP04_TEST_EXEC) $(STATIC_LINKING_TEST_EXEC) $(ARM64_CRYPTO_TEST_EXEC) $(ARM64_CORE_TEST_EXEC) $(ARM64_RELAY_POOL_TEST_EXEC) $(ARM64_NIP04_TEST_EXEC)
rm -f $(CRYPTO_TEST_EXEC) $(CORE_TEST_EXEC) $(RELAY_POOL_TEST_EXEC) $(EVENT_GEN_TEST_EXEC) $(POW_LOOP_TEST_EXEC) $(NIP04_TEST_EXEC) $(HTTP_TEST_EXEC) $(WSS_TEST_EXEC) $(STATIC_LINKING_TEST_EXEC) $(ARM64_CRYPTO_TEST_EXEC) $(ARM64_CORE_TEST_EXEC) $(ARM64_RELAY_POOL_TEST_EXEC) $(ARM64_NIP04_TEST_EXEC)
# Help
help:

8
tests/debug.log Normal file
View File

@@ -0,0 +1,8 @@
=== NOSTR WebSocket Debug Log Started ===
[10:59:17.573] SEND nostr.mom:443: ["REQ", "sync_0_1755183556", {
"kinds": [1],
"limit": 1
}]
[10:59:17.726] RECV nostr.mom:443: ["EVENT","sync_0_1755183556",{"content":"#kinostr #odysee #onepunchman\n\nhttps://odysee.com/@AllOverTheFilms:6/One-Punch-Man-(Season-1)---Episode-02--English-Sub-:f\n\n https://blossom.primal.net/77c18e2d7c0da3169baa9bf9161462e12f6f1e569a0863341df33c55ca41f425.jpg \n\nnostr:nprofile1qy88wumn8ghj7mn0wvhxcmmv9uq32amnwvaz7tmjv4kxz7fwv3sk6atn9e5k7tcqypwdt7q993nerey8nu8ymwgngewhz82ltlsvp2ueqjwxqex95w26yja9ph4 ","created_at":1755183592,"id":"e728318c90e8afd0b8769188260a3960ed9d6425d35f0768bd6e60dfcf21f626","kind":1,"pubkey":"362ebffa895acb0aa4ec2f11959b1c233aec2275f61b3beee19b1b6e492e2719","sig":"930d967dcb413eb02d6326778cdcc291cda10e376e0916d28d422759aa62288dbadc1722f4eccde54be87aa203d70f3ac733cef794b952f1965f43dbacedd1da","tags":[["t","kinostr"],["t","odysee"],["t","onepunchman"],["p","5cd5f8052c6791e4879f0e4db913465d711d5f5fe0c0ab99049c6064c5a395a2","wss://nos.lol/","mention"]]}]
[10:59:17.726] SEND nostr.mom:443: ["CLOSE", "sync_0_1755183556"]

BIN
tests/http_test Executable file

Binary file not shown.

67
tests/http_test.c Normal file
View File

@@ -0,0 +1,67 @@
/*
* HTTP Test - Verify curl works with OpenSSL migration
* Simple test to fetch https://google.com using curl
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
// Callback to write received data
static size_t WriteCallback(void *contents, size_t size, size_t nmemb, char *userp) {
size_t realsize = size * nmemb;
printf("%.*s", (int)realsize, (char*)contents);
return realsize;
}
int main() {
printf("HTTP Test - Testing curl with HTTPS\n");
printf("===================================\n");
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl) {
// Set URL
curl_easy_setopt(curl, CURLOPT_URL, "https://google.com");
// Set callback for received data
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
// Follow redirects
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
// Set timeout
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30L);
// Perform the request
printf("Fetching https://google.com...\n");
res = curl_easy_perform(curl);
// Check for errors
if(res != CURLE_OK) {
printf("❌ curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
curl_easy_cleanup(curl);
curl_global_cleanup();
return 1;
} else {
printf("✅ HTTPS request successful!\n");
printf("✅ curl + OpenSSL compatibility verified\n");
}
// Cleanup
curl_easy_cleanup(curl);
} else {
printf("❌ Failed to initialize curl\n");
curl_global_cleanup();
return 1;
}
curl_global_cleanup();
printf("\n🎉 HTTP Test PASSED - No SSL conflicts detected\n");
return 0;
}

BIN
tests/nostr_crypto_test Executable file

Binary file not shown.

View File

@@ -219,7 +219,7 @@ static int test_bip39_entropy_to_mnemonic() {
char mnemonic[256];
int ret = nostr_bip39_mnemonic_from_bytes(entropy, 16, mnemonic, sizeof(mnemonic));
int ret = nostr_bip39_mnemonic_from_bytes(entropy, 16, mnemonic);
// Should generate a valid 12-word mnemonic from zero entropy
if (ret == 0 && strlen(mnemonic) > 0) {

BIN
tests/static_linking_only_test Executable file

Binary file not shown.

View File

@@ -83,7 +83,7 @@ static int test_library_dependency_analysis(void) {
printf("Creating test binary for dependency analysis...\n");
const char* test_code =
"#include \"../nostr_core/nostr_core.h\"\n"
"#include \"nostr_core/nostr_core.h\"\n"
"#include <stdio.h>\n"
"int main() {\n"
" if (nostr_init() == NOSTR_SUCCESS) {\n"
@@ -131,17 +131,15 @@ static int test_library_dependency_analysis(void) {
result = run_command(command, output, sizeof(output));
// Check for problematic dynamic dependencies
// Check for problematic dynamic dependencies (updated for OpenSSL migration)
const char* forbidden_libs[] = {
"libsecp256k1",
"libssl",
"libcrypto",
"libwally",
"libsodium"
"libsecp256k1", // Should be statically linked
"libwally", // Not used
"libsodium" // Not used
};
int found_forbidden = 0;
for (int i = 0; i < 5; i++) {
for (int i = 0; i < 3; i++) {
if (strstr(output, forbidden_libs[i])) {
printf(RED "ERROR: " RESET "Found forbidden dynamic dependency: %s\n", forbidden_libs[i]);
found_forbidden = 1;
@@ -171,31 +169,31 @@ static int test_library_dependency_analysis(void) {
// Test 2: Symbol Resolution Verification
static int test_symbol_resolution_verification(void) {
char command[512];
char output[8192];
printf("Verifying secp256k1 symbols are present in static library...\n");
// Check that critical secp256k1 symbols are present
snprintf(command, sizeof(command), "nm ../libnostr_core.a 2>/dev/null | grep secp256k1");
// Use system() command instead of popen to avoid buffer issues
int result = system("nm ../libnostr_core.a | grep -q secp256k1 2>/dev/null");
if (run_command(command, output, sizeof(output)) != 0 || strlen(output) == 0) {
if (result != 0) {
printf(RED "ERROR: " RESET "No secp256k1 symbols found in library\n");
return 0;
}
// Check for key secp256k1 functions
// Test individual symbols with specific commands
const char* required_symbols[] = {
"secp256k1_context_create",
"secp256k1_ec_pubkey_create",
"secp256k1_schnorrsig_sign",
"secp256k1_schnorrsig_verify",
"secp256k1_ecdh"
"nostr_secp256k1_context_create",
"nostr_secp256k1_ec_pubkey_create",
"nostr_secp256k1_schnorrsig_sign32",
"nostr_secp256k1_schnorrsig_verify",
"nostr_secp256k1_ecdh"
};
int symbols_found = 0;
char command[256];
for (int i = 0; i < 5; i++) {
if (strstr(output, required_symbols[i])) {
snprintf(command, sizeof(command), "nm ../libnostr_core.a | grep -q '%s' 2>/dev/null", required_symbols[i]);
if (system(command) == 0) {
symbols_found++;
printf(GREEN "FOUND: " RESET "%s\n", required_symbols[i]);
} else {
@@ -221,7 +219,7 @@ static int test_build_process_validation(void) {
// Test that we can build with only libnostr_core.a and -lm
const char* minimal_test =
"#include \"../nostr_core/nostr_core.h\"\n"
"#include \"nostr_core/nostr_core.h\"\n"
"int main() { return nostr_init() == NOSTR_SUCCESS ? 0 : 1; }\n";
FILE* fp = fopen("/tmp/minimal_test.c", "w");

BIN
tests/wss_test Executable file

Binary file not shown.

103
tests/wss_test.c Normal file
View File

@@ -0,0 +1,103 @@
/*
* WebSocket SSL Test - Test OpenSSL WebSocket implementation
* Connect to a NOSTR relay and fetch one type 1 event
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../nostr_core/nostr_core.h"
#include "../cjson/cJSON.h"
// Progress callback to show connection status
static void progress_callback(
const char* relay_url,
const char* status,
const char* event_id,
int events_received,
int total_relays,
int completed_relays,
void* user_data)
{
printf("Progress: %s - %s", relay_url ? relay_url : "Summary", status);
if (event_id) {
printf(" (Event: %.12s...)", event_id);
}
printf(" [%d/%d events, %d/%d relays]\n",
events_received, *(int*)user_data, completed_relays, total_relays);
}
int main() {
printf("WebSocket SSL Test - Testing OpenSSL WebSocket with NOSTR relay\n");
printf("================================================================\n");
// Initialize NOSTR library
if (nostr_init() != NOSTR_SUCCESS) {
printf("❌ Failed to initialize NOSTR library\n");
return 1;
}
printf("✅ NOSTR library initialized\n");
// Setup relay and filter
const char* relay_urls[] = {"wss://nostr.mom"};
int relay_count = 1;
// Create filter for type 1 events (text notes), limit to 1 event
cJSON* filter = cJSON_CreateObject();
cJSON* kinds = cJSON_CreateArray();
cJSON_AddItemToArray(kinds, cJSON_CreateNumber(1));
cJSON_AddItemToObject(filter, "kinds", kinds);
cJSON_AddItemToObject(filter, "limit", cJSON_CreateNumber(1));
printf("📡 Connecting to %s...\n", relay_urls[0]);
printf("🔍 Requesting 1 type 1 event (text note)...\n\n");
// Query the relay
int result_count = 0;
int expected_events = 1;
cJSON** events = synchronous_query_relays_with_progress(
relay_urls,
relay_count,
filter,
RELAY_QUERY_FIRST_RESULT, // Return as soon as we get the first event
&result_count,
10, // 10 second timeout
progress_callback,
&expected_events
);
// Process results
if (events && result_count > 0) {
printf("\n✅ Successfully received %d event(s)!\n", result_count);
printf("📄 Raw JSON event data:\n");
printf("========================\n");
for (int i = 0; i < result_count; i++) {
char* json_string = cJSON_Print(events[i]);
if (json_string) {
printf("%s\n\n", json_string);
free(json_string);
}
cJSON_Delete(events[i]);
}
free(events);
printf("🎉 WebSocket SSL Test PASSED - OpenSSL WebSocket working correctly!\n");
} else {
printf("\n❌ No events received or query failed\n");
printf("❌ WebSocket SSL Test FAILED\n");
// Cleanup and return error
cJSON_Delete(filter);
nostr_cleanup();
return 1;
}
// Cleanup
cJSON_Delete(filter);
nostr_cleanup();
printf("✅ WebSocket connection and TLS working with OpenSSL\n");
return 0;
}