upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/tests/unit/test_relay_validator.c
blob: 327eb99472fe10792eba42d27c14fbc7746a9d09 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include "test_framework.h"
#include "../../main/nostr_event.h"
#include "../../main/identity.h"
#include "../../components/wisp_relay/relay_validator.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

static const char *TEST_NSEC = "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2";

int main(void)
{
    printf("=== test_relay_validator ===\n");

    identity_init(TEST_NSEC);
    const tollgate_identity_t *id = identity_get();

    printf("\n--- Valid event verification ---\n");
    nostr_event_t event;
    esp_err_t ret = nostr_event_init(&event, id->npub_hex, 1, "[]", "test relay validator");
    ASSERT_EQ_INT(ESP_OK, ret, "event init succeeds");
    ret = nostr_event_sign(&event, id->nsec);
    ASSERT_EQ_INT(ESP_OK, ret, "event sign succeeds");

    char json_buf[2048];
    ret = nostr_event_to_json(&event, json_buf, sizeof(json_buf));
    ASSERT_EQ_INT(ESP_OK, ret, "event to json succeeds");

    bool valid = relay_validator_verify_event(json_buf, strlen(json_buf));
    ASSERT(valid, "Valid event passes verification");

    printf("\n--- Tampered event ID detection ---\n");
    char *tampered = strdup(json_buf);
    char *id_pos = strstr(tampered, event.id);
    ASSERT(id_pos != NULL, "Found ID in JSON");
    id_pos[0] = (id_pos[0] == 'a') ? 'b' : 'a';
    bool tampered_valid = relay_validator_verify_event(tampered, strlen(tampered));
    ASSERT(!tampered_valid, "Tampered event ID fails verification");
    free(tampered);

    printf("\n--- Tampered signature detection ---\n");
    tampered = strdup(json_buf);
    char *sig_pos = strstr(tampered, event.sig);
    ASSERT(sig_pos != NULL, "Found sig in JSON");
    sig_pos[0] = (sig_pos[0] == 'a') ? 'b' : 'a';
    tampered_valid = relay_validator_verify_event(tampered, strlen(tampered));
    ASSERT(!tampered_valid, "Tampered signature fails verification");
    free(tampered);

    printf("\n--- Tampered content detection ---\n");
    tampered = strdup(json_buf);
    char *content_pos = strstr(tampered, "test relay validator");
    ASSERT(content_pos != NULL, "Found content in JSON");
    content_pos[0] = 'X';
    tampered_valid = relay_validator_verify_event(tampered, strlen(tampered));
    ASSERT(!tampered_valid, "Tampered content fails verification");
    free(tampered);

    printf("\n--- Empty/invalid JSON ---\n");
    ASSERT(!relay_validator_verify_event("", 0), "Empty string fails");
    ASSERT(!relay_validator_verify_event("{}", 2), "Empty object fails");
    ASSERT(!relay_validator_verify_event("not json", 8), "Non-JSON fails");
    ASSERT(!relay_validator_verify_event("[1,2,3]", 7), "Array fails");

    printf("\n--- Missing fields ---\n");
    ASSERT(!relay_validator_verify_event("{\"id\":\"" "0000000000000000000000000000000000000000000000000000000000000000" "\"}", 71),
           "Missing pubkey/sig fails");

    printf("\n--- result_string ---\n");
    ASSERT_EQ_STR("ok", relay_validator_result_string(VALIDATION_OK), "OK string");
    ASSERT_EQ_STR("invalid: signature", relay_validator_result_string(VALIDATION_ERR_SIG), "SIG string");
    ASSERT_EQ_STR("invalid: event id", relay_validator_result_string(VALIDATION_ERR_ID), "ID string");

    printf("\n=== ALL TESTS PASSED ===\n");
    return 0;
}