~~NOTOC~~
{{wvds:title>Protokol}}
===== Specifikacija Protokola =====
Protokol zahtjeva/odgovora je binarni i teče preko dijeljene memorije.
----
==== Format Zahtjeva ====
Pomak Veličina Polje Opis
-----------------------------------------------------------------------
0 1 Magic 0xC7 (fiksna vrijednost)
1 1 Version 0x01 (verzija protokola)
2 1 RequestType Operacija (vidi tablicu)
3 1 Flags Rezervirano (0x00)
4 4 PayloadLength Duljina sadržaja u bajtima (Little-Endian)
8 N Payload Podaci specifični za zahtjev
=== Magic Byte ===
Magic byte ''0xC7'' služi za prepoznavanje važećih zahtjeva. Zahtjevi bez ispravnog magica se odmah odbijaju.
=== Request Types ===
| Tip | Naziv | Opis |
| ''0x01'' | AES_ENCRYPT | AES-256-GCM šifriranje |
| ''0x02'' | AES_DECRYPT | AES-256-GCM dešifriranje |
| ''0x10'' | MLDSA_SIGN | ML-DSA kreiranje potpisa |
| ''0x11'' | MLDSA_VERIFY | ML-DSA provjera potpisa |
| ''0x20'' | MLKEM_KEYGEN | ML-KEM generiranje ključnog para |
| ''0x21'' | MLKEM_ENCAPS | ML-KEM enkapsulacija |
| ''0x22'' | MLKEM_DECAPS | ML-KEM dekapsulacija |
----
==== Format Odgovora ====
Pomak Veličina Polje Opis
-----------------------------------------------------------------------
0 1 Magic 0xC8 (Response Magic)
1 1 Version 0x01
2 1 Status 0x00 = Uspjeh, inače kod greške
3 1 Flags Rezervirano
4 4 PayloadLength Duljina sadržaja odgovora
8 N Payload Podaci specifični za odgovor
=== Statusni Kodovi ===
| Kod | Naziv | Opis |
| ''0x00'' | SUCCESS | Operacija uspješna |
| ''0x01'' | INVALID_HEADER | Format zaglavlja nevažeći |
| ''0x02'' | INVALID_TYPE | Nepoznat Request-Type |
| ''0x03'' | INVALID_PAYLOAD | Format sadržaja nevažeći |
| ''0x04'' | KEY_NOT_FOUND | Key-ID ne postoji |
| ''0x05'' | CRYPTO_ERROR | Kriptografska greška |
| ''0x06'' | DECRYPTION_FAILED | Provjera oznake nije uspjela |
| ''0x07'' | RATE_LIMITED | Previše zahtjeva |
| ''0x08'' | NONCE_REUSE | Nonce već korištena |
| ''0x09'' | PAYLOAD_TOO_LARGE | Sadržaj > 64 KB |
----
==== Formati Sadržaja ====
=== AES_ENCRYPT Zahtjev (0x01) ===
Pomak Veličina Polje
-----------------------------------------------------------------------
0 4 KeyID (Little-Endian)
4 2 AAD_Length (Little-Endian)
6 N AAD (Additional Authenticated Data)
6+N M Plaintext (podaci za šifriranje)
=== AES_ENCRYPT Odgovor ===
Pomak Veličina Polje
-----------------------------------------------------------------------
0 12 Nonce (generirana od servisa)
12 16 Tag (Authentication Tag)
28 N Ciphertext (šifrirani podaci)
=== AES_DECRYPT Zahtjev (0x02) ===
Pomak Veličina Polje
-----------------------------------------------------------------------
0 4 KeyID
4 12 Nonce
16 16 Tag
32 2 AAD_Length
34 N AAD
34+N M Ciphertext
=== AES_DECRYPT Odgovor ===
Pomak Veličina Polje
-----------------------------------------------------------------------
0 N Plaintext (dešifrirani podaci)
----
=== MLDSA_SIGN Zahtjev (0x10) ===
Pomak Veličina Polje
-----------------------------------------------------------------------
0 4 KeyID (Private Key)
4 N Message (poruka za potpis)
=== MLDSA_SIGN Odgovor ===
Pomak Veličina Polje
-----------------------------------------------------------------------
0 2 SignatureLength (Little-Endian)
2 N Signature (ML-DSA-65: 3293 bajta)
=== MLDSA_VERIFY Zahtjev (0x11) ===
Pomak Veličina Polje
-----------------------------------------------------------------------
0 4 KeyID (Public Key)
4 2 SignatureLength
6 N Signature
6+N M Message
=== MLDSA_VERIFY Odgovor ===
Pomak Veličina Polje
-----------------------------------------------------------------------
0 1 Valid (0x01 = važeći, 0x00 = nevažeći)
----
=== MLKEM_KEYGEN Zahtjev (0x20) ===
Pomak Veličina Polje
-----------------------------------------------------------------------
0 4 KeyID (ID za novi ključni par)
=== MLKEM_KEYGEN Odgovor ===
Pomak Veličina Polje
-----------------------------------------------------------------------
0 2 PublicKeyLength (Little-Endian)
2 N PublicKey (ML-KEM-768: 1184 bajta)
**Napomena:** Privatni ključ ostaje u servisu i sprema se pod KeyID.
=== MLKEM_ENCAPS Zahtjev (0x21) ===
Pomak Veličina Polje
-----------------------------------------------------------------------
0 2 PublicKeyLength
2 N PublicKey
=== MLKEM_ENCAPS Odgovor ===
Pomak Veličina Polje
-----------------------------------------------------------------------
0 2 CiphertextLength
2 N Ciphertext (ML-KEM-768: 1088 bajta)
2+N 32 SharedSecret
=== MLKEM_DECAPS Zahtjev (0x22) ===
Pomak Veličina Polje
-----------------------------------------------------------------------
0 4 KeyID (Private Key)
4 2 CiphertextLength
6 N Ciphertext
=== MLKEM_DECAPS Odgovor ===
Pomak Veličina Polje
-----------------------------------------------------------------------
0 32 SharedSecret
----
==== Primjer: Potpuni Zahtjev/Odgovor ====
**AES_ENCRYPT Zahtjev za "Hello":**
Pomak: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
Bajti: C7 01 01 00 0B 00 00 00 01 00 00 00 05 00 48 65
6C 6C 6F
Zaglavlje:
C7 - Magic
01 - Version
01 - RequestType (AES_ENCRYPT)
00 - Flags
0B 00 00 00 - PayloadLength = 11
Sadržaj:
01 00 00 00 - KeyID = 1
05 00 - AAD_Length = 5
48 65 6C 6C 6F - AAD = "Hello" (čisti tekst je prazan u ovom primjeru)
----
[[.:integration|< Primjeri koda]] | [[.:api|Dalje: API Referenca >]]