File size: 4,581 Bytes
9425aed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <stdio.h>
#include <string.h>
#include "cuda_validation_chain.h"
#include "sov_test_stubs.h"

static const uint8_t FAKE_PTX_A[] = "// fake ptx kernel A .entry main";
static const uint8_t FAKE_PTX_B[] = "// fake ptx kernel B .entry main";

static int test_hash_deterministic(void) {
    sov_ptx_evidence_t ev1, ev2;
    SOV_ASSERT(sov_ptx_hash(FAKE_PTX_A, sizeof(FAKE_PTX_A), 1, 100, &ev1) == 0);
    SOV_ASSERT(sov_ptx_hash(FAKE_PTX_A, sizeof(FAKE_PTX_A), 1, 100, &ev2) == 0);
    SOV_ASSERT(memcmp(ev1.ptx_hash, ev2.ptx_hash, 32) == 0);
    SOV_PASS("hash_deterministic");
    return 0;
}

static int test_hash_differs_on_ptx(void) {
    sov_ptx_evidence_t ev1, ev2;
    SOV_ASSERT(sov_ptx_hash(FAKE_PTX_A, sizeof(FAKE_PTX_A), 1, 100, &ev1) == 0);
    SOV_ASSERT(sov_ptx_hash(FAKE_PTX_B, sizeof(FAKE_PTX_B), 1, 100, &ev2) == 0);
    SOV_ASSERT(memcmp(ev1.ptx_hash, ev2.ptx_hash, 32) != 0);
    SOV_PASS("hash_differs_on_ptx");
    return 0;
}

static int test_commit_basic(void) {
    sov_rowm_record_t rec;
    memset(&rec, 0, sizeof(rec));
    sov_ptx_evidence_t ev;
    SOV_ASSERT(sov_ptx_hash(FAKE_PTX_A, sizeof(FAKE_PTX_A), 1, 200, &ev) == 0);
    SOV_ASSERT(sov_rowm_commit(&rec, &ev) == 0);
    SOV_ASSERT(rec.state == SOV_ROWM_COMMITTED);
    SOV_ASSERT(rec.sequence == 1);
    SOV_PASS("commit_basic");
    return 0;
}

static int test_commit_idempotent(void) {
    sov_rowm_record_t rec;
    memset(&rec, 0, sizeof(rec));
    sov_ptx_evidence_t ev;
    SOV_ASSERT(sov_ptx_hash(FAKE_PTX_A, sizeof(FAKE_PTX_A), 1, 300, &ev) == 0);
    SOV_ASSERT(sov_rowm_commit(&rec, &ev) == 0);
    uint8_t saved_root[32];
    memcpy(saved_root, rec.rowm_root, 32);
    SOV_ASSERT(sov_rowm_commit(&rec, &ev) == 0);
    SOV_ASSERT(rec.sequence == 1);
    SOV_ASSERT(memcmp(rec.rowm_root, saved_root, 32) == 0);
    SOV_PASS("commit_idempotent");
    return 0;
}

static int test_commit_conflict(void) {
    sov_rowm_record_t rec;
    memset(&rec, 0, sizeof(rec));
    sov_ptx_evidence_t evA, evB;
    SOV_ASSERT(sov_ptx_hash(FAKE_PTX_A, sizeof(FAKE_PTX_A), 1, 400, &evA) == 0);
    SOV_ASSERT(sov_ptx_hash(FAKE_PTX_B, sizeof(FAKE_PTX_B), 1, 400, &evB) == 0);
    /* Same epoch, different PTX hash must match evidence */
    evB.device_epoch = 400;
    SOV_ASSERT(sov_rowm_commit(&rec, &evA) == 0);
    SOV_ASSERT(sov_rowm_commit(&rec, &evB) == -2);
    SOV_ASSERT(rec.state == SOV_ROWM_CONFLICT);
    SOV_PASS("commit_conflict");
    return 0;
}

static int test_authorize_and_check(void) {
    sov_rowm_record_t rec;
    memset(&rec, 0, sizeof(rec));
    sov_ptx_evidence_t ev;
    SOV_ASSERT(sov_ptx_hash(FAKE_PTX_A, sizeof(FAKE_PTX_A), 1, 500, &ev) == 0);
    SOV_ASSERT(sov_rowm_commit(&rec, &ev) == 0);

    void* handles[2] = { (void*)0x1, (void*)0x2 };
    sov_cuda_auth_t auth;
    memset(&auth, 0, sizeof(auth));
    SOV_ASSERT(sov_rowm_authorize_kernels(&rec, &auth, handles, 2) == 0);
    SOV_ASSERT(rec.state == SOV_ROWM_AUTHORIZED);
    SOV_ASSERT(sov_rowm_check_authorized(&rec, &auth) == 0);
    SOV_PASS("authorize_and_check");
    return 0;
}

static int test_authorize_without_commit_fails(void) {
    sov_rowm_record_t rec;
    memset(&rec, 0, sizeof(rec));
    void* handles[1] = { (void*)0x1 };
    sov_cuda_auth_t auth;
    memset(&auth, 0, sizeof(auth));
    SOV_ASSERT(sov_rowm_authorize_kernels(&rec, &auth, handles, 1) == -1);
    SOV_PASS("authorize_without_commit_fails");
    return 0;
}

static int test_receipt_mismatch_rejected(void) {
    sov_rowm_record_t rec;
    memset(&rec, 0, sizeof(rec));
    sov_ptx_evidence_t ev;
    SOV_ASSERT(sov_ptx_hash(FAKE_PTX_A, sizeof(FAKE_PTX_A), 1, 600, &ev) == 0);
    SOV_ASSERT(sov_rowm_commit(&rec, &ev) == 0);
    void* handles[1] = { (void*)0x1 };
    sov_cuda_auth_t auth;
    memset(&auth, 0, sizeof(auth));
    SOV_ASSERT(sov_rowm_authorize_kernels(&rec, &auth, handles, 1) == 0);
    /* Tamper receipt */
    auth.bound_worm[0] ^= 0xFF;
    SOV_ASSERT(sov_rowm_check_authorized(&rec, &auth) == -2);
    SOV_PASS("receipt_mismatch_rejected");
    return 0;
}

int main(void) {
    int fail = 0;
    fail |= test_hash_deterministic();
    fail |= test_hash_differs_on_ptx();
    fail |= test_commit_basic();
    fail |= test_commit_idempotent();
    fail |= test_commit_conflict();
    fail |= test_authorize_and_check();
    fail |= test_authorize_without_commit_fails();
    fail |= test_receipt_mismatch_rejected();
    if (!fail) printf("ALL PASS\n");
    return fail;
}