File size: 5,861 Bytes
119e586
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
; SKC-LISP-WORLD: Digest Verification (PRODUCTION)
; x64 NASM assembly + libblake3 + libsodium linkage
; Real cryptographic digest verification for production
;
; LINKING:
;   gcc -c digest-verifier-prod.asm -o digest-verifier-prod.o
;   gcc digest-verifier-prod.o -o digest-verifier -lblake3 -lsodium
;
; CALLING CONVENTION (System V AMD64 ABI):
;   rdi = pointer to payload (bytes)
;   rsi = payload_length (u64)
;   rdx = pointer to expected_digest (32 bytes for Blake3, 64 for Ed25519)
;   rcx = pointer to public_key (32 bytes, Ed25519 only)
;   r8  = pointer to verification_result (output)

extern blake3_hasher_init

extern blake3_hasher_update

extern blake3_hasher_finalize

extern crypto_sign_open

global blake3_verify

global ed25519_verify

section .data
    blake3_hash_size equ 32     ; BLAKE3 produces 32-byte hash
    ed25519_sig_size equ 64     ; Ed25519 signature is 64 bytes
    ed25519_key_size equ 32     ; Ed25519 public key is 32 bytes

section .text

; ============================================================================
; BLAKE3 VERIFICATION (production)
; ============================================================================

blake3_verify:
    ; rdi = payload*
    ; rsi = payload_length
    ; rdx = expected_digest* (32 bytes)
    ; r8  = verification_result*

    push rbp
    mov rbp, rsp
    sub rsp, 64                 ; stack space for blake3_hasher struct + output

    ; Validate inputs
    test rdi, rdi
    jz .blake3_invalid_input

    test rsi, rsi
    jz .blake3_invalid_input

    test rdx, rdx
    jz .blake3_invalid_input

    test r8, r8
    jz .blake3_invalid_input


    ; Save parameters
    mov r9, rdi                 ; r9 = payload*
    mov r10, rsi                ; r10 = payload_length
    mov r11, rdx                ; r11 = expected_digest*
    mov r12, r8                 ; r12 = verification_result*

    ; Initialize blake3_hasher on stack
    lea rax, [rbp - 64]         ; rax = hasher_buffer*
    mov rdi, rax
    call blake3_hasher_init


    ; Update hasher with payload
    lea rdi, [rbp - 64]         ; rdi = hasher*
    mov rsi, r9                 ; rsi = payload*
    mov rdx, r10                ; rdx = payload_length
    call blake3_hasher_update


    ; Finalize hasher to get digest
    lea rdi, [rbp - 64]         ; rdi = hasher*
    lea rsi, [rbp - 32]         ; rsi = output_buffer* (on stack)
    mov rdx, 32                 ; rdx = output_len
    xor rcx, rcx                ; rcx = seek_offset (0)
    call blake3_hasher_finalize


    ; Compare computed digest with expected_digest
    lea rax, [rbp - 32]         ; rax = computed_digest*
    mov rsi, r11                ; rsi = expected_digest*

    ; Memory compare: 32 bytes
    xor rcx, rcx
    mov r13, 0                  ; match flag



.blake3_compare_loop:
    cmp rcx, 32
    je .blake3_compare_done

    mov al, byte [rax + rcx]
    mov bl, byte [rsi + rcx]
    cmp al, bl

    jne .blake3_mismatch

    inc rcx
    jmp .blake3_compare_loop



.blake3_compare_done:
    ; All bytes matched
    mov byte [r12 + 0], 1       ; digest_valid = 1
    mov byte [r12 + 1], 0       ; error_code = 0 (match)
    mov eax, 1
    jmp .blake3_return



.blake3_mismatch:
    mov byte [r12 + 0], 0       ; digest_valid = 0
    mov byte [r12 + 1], 1       ; error_code = 1 (mismatch)
    xor eax, eax
    jmp .blake3_return



.blake3_invalid_input:
    mov byte [r12 + 0], 0       ; digest_valid = 0
    mov byte [r12 + 1], 2       ; error_code = 2 (invalid_input)
    xor eax, eax



.blake3_return:
    add rsp, 64
    pop rbp
    ret

; ============================================================================
; ED25519 SIGNATURE VERIFICATION (production)
; ============================================================================

ed25519_verify:
    ; rdi = message*
    ; rsi = message_length
    ; rdx = signature* (64 bytes)
    ; rcx = public_key* (32 bytes)
    ; r8  = verification_result*

    push rbp
    mov rbp, rsp
    sub rsp, 32

    ; Validate inputs
    test rdi, rdi
    jz .ed25519_invalid_input
    test rdx, rdx
    jz .ed25519_invalid_input
    test rcx, rcx
    jz .ed25519_invalid_input
    test r8, r8
    jz .ed25519_invalid_input

    ; Save parameters
    mov r9, rdi                 ; r9 = message*
    mov r10, rsi                ; r10 = message_length
    mov r11, rdx                ; r11 = signature*
    mov r12, rcx                ; r12 = public_key*
    mov r13, r8                 ; r13 = verification_result*

    ; Call crypto_sign_open(message*, mlen_p, signature, message, message_length, public_key)
    ; Returns 0 on success, -1 on verification failure
    lea rax, [rbp - 8]          ; rax = output_length* (on stack)
    mov rdi, r9                 ; rdi = message* (output buffer)
    mov rsi, rax                ; rsi = mlen_p*
    mov rdx, r11                ; rdx = signature*
    mov rcx, r9                 ; rcx = message* (input)
    mov r8, r10                 ; r8 = message_length
    mov r9, r12                 ; r9 = public_key*
    call crypto_sign_open

    ; Check return value
    cmp rax, 0
    jne .ed25519_sig_invalid

    ; Signature valid
    mov byte [r13 + 0], 1       ; signature_valid = 1
    mov byte [r13 + 1], 0       ; error_code = 0 (valid)
    mov eax, 1
    jmp .ed25519_return



.ed25519_sig_invalid:
    mov byte [r13 + 0], 0       ; signature_valid = 0
    mov byte [r13 + 1], 1       ; error_code = 1 (invalid)
    xor eax, eax
    jmp .ed25519_return



.ed25519_invalid_input:
    mov byte [r13 + 0], 0       ; signature_valid = 0
    mov byte [r13 + 1], 2       ; error_code = 2 (invalid_input)
    xor eax, eax



.ed25519_return:
    add rsp, 32
    pop rbp
    ret