Når data skal leveres fra institusjoner til Legemiddelregisteret skal dette sendes i en SignertKryptertBundle
. Denne lages ved å komprimere LegemiddelregisteretBundle
, kryptere og signere innholdet.
Her beskrives hvordan du må gå frem for å lage en SignertKryptertBundle
som skal sendes til Legemiddelregisterets API. Implementasjonsdetaljer (språk, biblioteker osv.) står du fritt til å velge, så lenge resultatet samsvarer med spesifikasjonen under.
Først lages en JSON-representasjon av FHIR-ressursen LegemiddelregisterBundle
. Dette krever at følgende er satt:
completed
, in-progress
etc.)Medication
-ressurs)Bruk standardbiblioteker eller tredjepartsbiblioteker for FHIR hvis ønskelig. Viktig at JSON-strukturen er korrekt for FHIR-standarden slik at validering i Legemiddelregisterets API ikke feiler. Valider gjerne FHIR-ressursen lokalt før kryptering for å unngå at meldinger feiler i serveren.
For å redusere båndbredde og sikre at krypteringsprosessen er effektiv, må dataene GZip-komprimeres
Resultatet blir en byte-array av komprimerte data. GZip benytter DEFLATE-algoritmen og er en standardisert og velprøvd metode.
I Java kan man typisk bruke klasser fra java.util.zip. I .NET finnes tilsvarende funksjonalitet i System.IO.Compression.
Resultatet etter GZip-komprimering skal være en byte-array som inneholder den komprimerte FHIR-JSONen.
nonce
(initialiseringsvektor) skal være 96 bits (12 bytes). Denne skal genereres tilfeldig hver gang en kryptering utføres.Krypter den komprimerte byte-arrayen med AES-GCM. I Java er dette tilgjengelig via AES/GCM/NoPadding, mens i .NET er det tilgjengelig via f.eks. AesGcm (fra .NET 5/6 og nyere).
encryptedContent
(selve cipher-teksten)authenticationTag
(brukes til å validere at innholdet ikke er endret)Den 256-bits AES-nøkkelen fra steg 3 krypteres med Legemiddelregisterets offentlige RSA-nøkkel. Dette er tilgjengelig i sertifikatene som kan lastes ned her
Algoritmen skal være RSA OAEP med SHA-256 (RSAEncryptionPadding.OaepSHA256). Resultatet er et byte-array encryptedKey
.
Legemiddelregisterets offentlige RSA-nøkkel hentes fra Legemiddelregisterets virksomhetssertifikat. Thumbprintet til sertifikatet som benyttes skal angis som encryptionCertificateThumbprint
i SignertKryptertBundle
.
For at Legemiddelregisteret skal være sikre at innholdet faktisk kommer fra rett organisasjon (integritets- og autentisitetskontroll), må meldingen signeres:
signatureCertificateThumbprint
.encryptedContent
.signature
.signatureCertificateThumbprint
) faktisk har denne organisasjonsidentifikatoren.Alle felter skal samles i et JSON-objekt med nøyaktig rekkefølge som nedenfor. Anta at binære data konverteres til Base64-strenger.
Felt | Type | Beskrivelse |
---|---|---|
messageId | string | Unik identifikator for meldingen. Gjerne en UUID |
senderOrganizationIdentifier | string | Avsenders organisasjons-ID eller OID (vanligvis organisasjonsnummer) som skal samsvare med sertifikat brukt for signering. |
messageFormatVersion | string | Gjeldende meldingsformat-versjon: "1.0" . |
rapporteringFra | string | Angir starttidspunkt for tidsperioden som dataene er hentet fra. Tidspunktet skal være i norsk lokaltid formattert etter ISO 8601, for eksempel: 2025-01-22T10:30:00Z |
rapporteringTil | string | Angir sluttidspunkt for tidsperioden som dataene er hentet fra. Tidspunktet skal være i norsk lokaltid formattert etter ISO 8601 |
encryptedContent | string | AES-GCM-kryptert innhold (FHIR-ressursen komprimert og kryptert). Angis som Base64-encodet string. |
encryptionCertificateThumbprint | string | Thumbprint for sertifikatet som ble brukt til kryptering. |
nonce | string | 96-bits nonce (12 bytes) brukt ved AES-GCM-krypteringen. Angis som Base64-encodet string. |
authenticationTag | string | 128-bits (16 bytes) autentiseringstag fra AES-GCM. Angis som Base64-encodet string. |
signatureCertificateThumbprint | string | Thumbprint for avsenders sertifikat (med tilhørende privat nøkkel som ble brukt for signering). |
signature | string | Signatur (RSA-PKCS1-v1.5 over SHA-256 hash) av kryptert innhold. Angis som Base64-encodet string. |
generatedAt | string | Tidspunkt (norsk lokaltid) når meldingen ble generert. |