Barvna shema: Svetla
Trenutno dejavna stran: start » sl » Dokumentacija » Postkvantna kriptografija » WvdS Crypto Service – pregled » Navodila » Klicanje storitve v sistemu L4Re

Klicanje storitve v sistemu L4Re

Ta navodila pokažejo, kako opravilo L4Re prek DataspaceEndpoint storitvi naroči, naj ustvari ključ ML-DSA in z njim podpiše sporočilo. Primeri so v C++, ker je DataspaceEndpoint razred C++. Potrebujejo le wvds_crypto.h in zaglavje DataspaceEndpoint. Funkciji build_…, ki sestavita sporočili, sta čisti C in ju lahko nespremenjeni prevzamete v kodo C.

Pogoji:

  • Storitev teče kot samostojno opravilo L4Re; glejte Primerjava izvedb.
  • Vaše opravilo ima dostop do DataspaceEndpoint dobavitelja vaše platforme in ga nastavi po njegovih navodilih: strežnik registra kot statična spremenljivka, konstruktor v glavni niti, zanka strežnika na koncu main.

1. Ustvarite končno točko

#include "wvds_crypto.h"
#include "DataspaceEndpoint.h"
 
static L4Re::Util::Registry_server<> server;
 
int main()
{
    DataspaceEndpoint ep(&server,
                         "CRYPTO_CLI",   // lastno ime, kot ga pričakuje storitev
                         "CRYPTO_SVC",   // ime storitve
                         64 * 1024,      // velikost območja nasprotne strani
                         5000000,        // časovna omejitev za nasprotno stran
                         on_crypto_response);
    // zaženite delovno nit, ki pokliče wait_for_initialization() in nato pošilja zahteve
    server.loop();
}

Imeni sta v storitvi stalno nastavljeni. Opravila z drugim imenom storitev ne najde.

2. Naročite ustvarjanje ključa

static size_t build_ml_dsa_keygen(uint8_t *buf, uint8_t level)
{
    wvds_init_header((wvds_message_header_t *)buf, WVDS_REQ_ML_DSA_KEYGEN, 0, 1);
    WVDS_PAYLOAD_PTR(buf)[0] = level;
    return WVDS_MESSAGE_SIZE(1);
}
 
/* v delovni niti, po wait_for_initialization() */
uint8_t *buf = (uint8_t *)ep.allocate_local_blocking(WVDS_MESSAGE_SIZE(1));
size_t len = build_ml_dsa_keygen(buf, WVDS_ML_DSA_65);
ep.add_new_req(next_id++, WVDS_REQ_ML_DSA_KEYGEN, buf, len);

Odgovor vsebuje novi identifikator v prvih 4 bajtih koristnih podatkov, nato javni ključ, pri ML-DSA-65 1952 bajtov.

3. Naročite podpis sporočila

static size_t build_ml_dsa_sign(uint8_t *buf, uint32_t key_id,
                                const uint8_t *msg, uint32_t msg_len)
{
    wvds_init_header((wvds_message_header_t *)buf, WVDS_REQ_ML_DSA_SIGN, key_id, 1 + msg_len);
    uint8_t *p = WVDS_PAYLOAD_PTR(buf);
    p[0] = WVDS_ML_DSA_65;            /* se ne vrednoti, stopnja izhaja iz ključa */
    memcpy(p + 1, msg, msg_len);
    return WVDS_MESSAGE_SIZE(1 + msg_len);
}

Celotna zahteva, torej 16-bajtna glava, bajt stopnje in sporočilo, se mora prilegati 64 KiB velikemu območju, ki ga storitev preslika iz vašega opravila. Sporočila zato ohranite precej pod 64 KiB, pri večjih podatkih pa podpišite zgoščeno vrednost. Odgovor je podpis sam, pri ML-DSA-65 natanko WVDS_ML_DSA_65_SIG_SIZE bajtov.

4. Obdelajte odgovore

int on_crypto_response(DataspaceEndpoint *self, u_int64_t id, u_int8_t type,
                       const u_int8_t *data, l4_size_t size)
{
    wvds_message_header_t hdr;
 
    if (size >= sizeof hdr) {
        memcpy(&hdr, data, sizeof hdr);
        const uint8_t *payload = data + sizeof hdr;
 
        if (!wvds_validate_header(&hdr) || sizeof hdr + hdr.payload_len != size) {
            /* ni veljaven odgovor storitve */
        } else if (wvds_is_error_response(data, size)) {
            uint32_t code;
            memcpy(&code, payload, sizeof code);
            /* wvds_error_name((wvds_error_code_t)code) vrne ime */
        } else {
            /* vsebino ovrednotite glede na odprto zahtevo s tem id */
        }
    }
 
    self->free_peer_req(id, type, data, size);   /* vedno sprostite */
    return 0;
}

Za zanesljivo vgradnjo so odločilne tri točke:

  • Napake so zapisane v glavi. Vrsta IPC odgovora je vedno 0x80. Ali gre za napako, pove le req_type v glavi; wvds_is_error_response preveri natanko to.
  • Vedno sprostite. free_peer_req pokličite za vsak odgovor, tudi za neveljavnega. Sicer se območje storitve napolni in ta ne more več odgovarjati.
  • Predvidite časovno omejitev. Pri preobremenitvi storitev zahteve zavrže brez odgovora. Beležite odprte vrednosti id in zahtevo po izteku roka opustite.

Sorodne teme

sl/wiki/pqcrypt/svc/how-to/call-l4re-service.txt · Zadnja sprememba: uporabnika Wolfgang van der Stille