snapkitty-clojure-lisp-bridge / native /digest-verifier-prod.asm
SNAPKITTYWEST's picture
push from SNAPKITTYWEST/snapkitty-clojure-lisp-bridge
119e586 verified
Raw History Blame Contribute Delete
5.86 kB
; 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