Sigurnosni Mehanizmi

WvdS Crypto Service implementira više zaštitnih mehanizama koji su automatski aktivni. Ne trebate ništa konfigurirati.


Ograničavanje Brzine

Štiti od napada uskraćivanja usluge (DoS) preopterećenjem.

Parametar Vrijednost
Maks. zahtjeva/sekundi 1000
Burst tolerancija 100
Cooldown 100 ms

Ponašanje pri prekoračenju:

Zahtjev --> [Rate Limiter] --> Status: 0x07 (RATE_LIMITED)
                           --> Kriptografska operacija nije izvršena

Preporuka za klijente:

int send_with_retry(const uint8_t* request, size_t len) {
    int retry = 0;
    int delay_ms = 100;
 
    while (retry < 5) {
        send_request(request, len);
        int status = get_response_status();
 
        if (status != 0x07) return status;  // Nije rate-limited
 
        usleep(delay_ms * 1000);
        delay_ms *= 2;  // Eksponencijalni backoff
        retry++;
    }
    return -1;  // Timeout
}

Praćenje Nonce

Ponovna uporaba Nonce = Katastrofa

Kod AES-GCM, ponovna uporaba nonce vodi do potpune kompromitacije oba čista teksta!

Crypto Service aktivno štiti od ponovne uporabe nonce:

Za Encrypt

Za Decrypt

Napomena: Praćenje nonce je po Key-ID. Pri rotaciji ključa pratilica se resetira.


Validacija Unosa

Svi unosi se provjeravaju prije obrade:

Provjera Kod greške
Magic Byte != 0xC7 0x01 (INVALID_HEADER)
Nepoznat Request-Type 0x02 (INVALID_TYPE)
Duljina sadržaja pogrešna 0x03 (INVALID_PAYLOAD)
Key-ID ne postoji 0x04 (KEY_NOT_FOUND)
Sadržaj > 64 KB 0x09 (PAYLOAD_TOO_LARGE)

Bez iznimaka:

Servis ne baca iznimke. Sve greške se vraćaju putem statusnih kodova.


Maksimalna Veličina Sadržaja

Ograničenje 64 KB (65536 bajta)

Razlozi:

Šifriranje velikih podataka:

// Chunked Encryption za velike datoteke
#define CHUNK_SIZE (60 * 1024)  // 60 KB po komadu
 
int encrypt_large_file(FILE* in, FILE* out) {
    uint8_t buffer[CHUNK_SIZE];
    size_t bytes_read;
    uint32_t chunk_id = 0;
 
    while ((bytes_read = fread(buffer, 1, CHUNK_SIZE, in)) > 0) {
        // AAD sadrži Chunk-ID za zaštitu redoslijeda
        char aad[32];
        snprintf(aad, sizeof(aad), "chunk:%u", chunk_id++);
 
        uint8_t ct[CHUNK_SIZE + 28];
        size_t ct_len;
        uint8_t nonce[12], tag[16];
 
        encrypt_message(buffer, bytes_read, aad, strlen(aad),
                       ct, &ct_len, nonce, tag);
 
        fwrite(nonce, 1, 12, out);
        fwrite(tag, 1, 16, out);
        fwrite(ct, 1, ct_len, out);
    }
    return 0;
}

Brisanje pri Oslobađanju

Svi sigurnosno kritični podaci se prepisuju nakon uporabe:

Implementacija:

// Spriječi optimizaciju kompajlera
static void secure_zero(void* ptr, size_t len) {
    volatile uint8_t* p = (volatile uint8_t*)ptr;
    while (len--) *p++ = 0;
}

L4Re Izolacija

Crypto Service radi kao izolirani L4Re task:

+---------------------------------------------------------------+
|                    L4Re Microkernel                           |
+---------------------------------------------------------------+
|     |              |              |              |            |
|  +--+--+       +---+---+      +---+---+      +---+---+        |
|  | Sigma0 |    | Moe   |      | Crypto |     | OEM   |        |
|  | (Root) |    | (Mem) |      | Service|     | Gateway|       |
|  +--------+    +-------+      +--------+     +--------+        |
|                                   |              |             |
|                                   +--------------+             |
|                                   SAMO ovaj IPC                |
+---------------------------------------------------------------+

Sigurnosna jamstva:


Rješavanje Problema

Simptom Mogući uzrok Rješenje
Status 0x04 trajno Key-Storage oštećen Regenerirajte ključeve
Status 0x07 često Brzina zahtjeva previsoka Batching, caching
Status 0x08 Rotacija ključa zaboravljena Generirajte novi ključ
Spore performanse FIPS način + Debug Koristite release build
Curenje memorije Odgovori nisu obrađeni Očistite dijeljenu memoriju

< API Referenca | Dalje: Usklađenost >