Page History
...
Følgende properties skal være defineret, for at starte servicen op med DGWS-sikkerhed i forbindelse med kald til NAS, SEAS, SYES:
| STS | |
|---|---|
| idcard.subject.id.type | Subjecttype for IDKortet |
| idcard.subject.id | Subjectid for IDKortet |
| idcard.subject.name | Subjectnavn for IDKortet |
| idcard.level | Sikkerhedsniveau for IDkortet |
| idcard.system.name | Systemnavn i IDkortet |
| sts.endpoint | Endpointet, hvor Samtykkeservicen skal trække sit SOSI IDkort på baggrund af sts.keystore |
| sts.keystore | Keystore, der indeholder DDS Repository funktionscertifikat |
| sts.keystore.password | Password til sts.keystore |
Følgende properties skal være defineret når Samtykkeservicen skal kalde NAS, Personinformation, SAES, SYES, SORES og Minlog ifm. parametervalidering:
| NAS | |
|---|---|
| dk.nsi.consent.nas.notification.endpoint | NAS endpoint |
| dk.nsi.consent.nas.topic | Angiver det Topic, som skal anvendes, når der sendes notifications til NAS. |
| dk.nsi.consent.nas.connect.timeout.millis | Grænse for hvor tid det må tage at oprette forbindelse til NAS (i ms.). |
| dk.nsi.consent.nas.max.total.connections | Maksimalt antal samtidige NAS-forbindelser. |
| dk.nsi.consent.nas.default.max.connections.per.route | Maksimalt antal NAS-forbindelser per rute. |
| Personinformation | |
|---|---|
| dk.nsi.consent.personinformation.endpoint | Personinformation endpoint |
| dk.nsi.consent.personinformation.connect.timeout.millis | Grænse for hvor tid det må tage at oprette forbindelse til Personinformation (i ms.). |
| dk.nsi.consent.personinformation.max.total.connections | Maksimalt antal samtidige Personinformation-forbindelser. |
| dk.nsi.consent.personinformation.default.max.connections.per.route | Maksimalt antal Personinformation-forbindelser per rute. |
| dk.nsi.consent.personinformation.dgws.validation.level | Værdi der angiver om cpr-validering er slået til i dgws-snitfladerne. Skal være enten: OFF, WARNING eller REJECT. OFF betyder at der ikke foretages nogen validering. WARNING betyder at der foretages validering, og skrives til audit-loggen hvis cpr-nummeret ikke er gyldigt, men kaldet fortsætter (key i audit-loggen: dk.nsp.cpr.exists.false). REJECT betyder at udførslen af kaldet fejler. |
| dk.nsi.consent.personinformation.idws.validation.level | Værdi der angiver om cpr-validering er slået til i idws-snitfladerne. Skal være enten: OFF, WARNING eller REJECT. OFF betyder at der ikke foretages nogen validering. WARNING betyder at der foretages validering, og skrives til audit-loggen hvis cpr-nummeret ikke er gyldigt, men kaldet fortsætter (key i audit-loggen: dk.nsp.cpr.exists.false). REJECT betyder at udførslen af kaldet fejler. |
| SAES | |
|---|---|
| dk.nsi.consent.saes.endpoint | SAES endpoint |
| dk.nsi.consent.saes.connect.timeout.millis | Grænse for hvor tid det må tage at oprette forbindelse til SAES (i ms.). |
| dk.nsi.consent.saes.max.total.connections | Maksimalt antal samtidige SAES-forbindelser. |
| dk.nsi.consent.saes.default.max.connections.per.route | Maksimalt antal SAES-forbindelser per rute. |
| dk.nsi.consent.saes.fail.threshold | Grænse for hvor mange gange SAES-kald må fejle i træk, før SAES opfattes som usund. |
| SYES | |
|---|---|
| dk.nsi.consent.syes.endpoint | SYES endpoint |
| dk.nsi.consent.syes.connect.timeout.millis | Grænse for hvor tid det må tage at oprette forbindelse til SYES (i ms.). |
| dk.nsi.consent.syes.max.total.connections | Maksimalt antal samtidige SYES-forbindelser. |
| dk.nsi.consent.syes.default.max.connections.per.route | Maksimalt antal SYES-forbindelser per rute. |
| dk.nsi.consent.syes.fail.threshold | Grænse for hvor mange gange SYES-kald må fejle i træk, før SYES opfattes som usund. |
| SORES | |
|---|---|
| dk.nsi.consent.sor.endpoint | SORES endpoint |
| dk.nsi.consent.sor.connect.timeout.millis | Grænse for hvor tid det må tage at oprette forbindelse til SORES (i ms.). |
| dk.nsi.consent.sor.max.total.connections | Maksimalt antal samtidige SORES-forbindelser. |
| dk.nsi.consent.sor.default.max.connections.per.route | Maksimalt antal SORES-forbindelser per rute. |
| dk.nsi.consent.sor.fail.threshold | Grænse for hvor mange gange SORES-kald må fejle i træk, før SORES opfattes som usund. |
I den properties-fil, der udpeges af propertien ”client.minlog.properties”, skal følgende properties defineres:
| Minlog / Kafka | |
|---|---|
| kafka.producer.bootstrap.servers | Kafka endpoint, som anvendes i forbindelse med kald til MinLog2 |
| kafka.producer.client.id | Navnet som Samtykkeservicen vil fremgå med i listen af Producers på et Kafka Cluster. |
| kafka.producer.key.serializer | Serializer key for Kafka producer |
| kafka.producer.value.serializer | Serializer value for Kafka producer |
| kafka.topic | Kafka topic som anvendes i forbindelse med kald til MinLog2 |
| client.minlog.properties | Angiver placering af properties til kald af MinLog2 |
| dk.nsp.minspaerring.administration.rediger.minlog.tekst | Den tekst, der skrives i minlog, når en administrativ medarbejder redigerer en frabedelse på vegne af en ikke digital borger |
| dk.nsp.minspaerring.administration.tilfoj.minlog.tekst | Den tekst, der skrives i minlog, når en administrativ medarbejder tilføjer en frabedelse på vegne af en ikke digital borger |
| dk.nsp.minspaerring.administration.ophaev.minlog.tekst | Den tekst, der skrives i minlog, når en administrativ medarbejder ophæver en frabedelse på vegne af en ikke digital borger |
| dk.nsp.minspaerring.administration.hent.minlog.tekst | Den tekst, der skrives i minlog, når en administrativ medarbejder indhenter oplysninger om spærringer på vegne af en ikke digital borger |
Eksempel på ”ConsentAdministration.properties” fil (bemærk at ”client.minlog.properties” udpeger filen selv, og at Min-log-klient properties derfor er defineret i samme fil):
| Code Block |
|---|
idcard.version = 1.0.1 sts.test.mode = falsetrue logdefault.configcreating.file=consentadministration.log4j.properties client.minlog.propertiessystem.name = ConsentAdministration.properties registration.wsdl.location = Samtykkeservicen wsdl.app.endpoint=http://localhost:80808081/minlogconsent-registrationadministration/service?wsdl registrationlog.invokerconfig.timeout = 30000file=log4j-consentadministration.properties registration.log.organisation_name=(organisationsnavn blev ikke udfyldt påp\u00e5 registreringstidspunktet) databasecheck.statement.consent=SELECT * FROM consent.consentitem LIMIT 1; databasecheck.statement.what=SELECT * FROM consent.whatitem LIMIT 1; databasecheck.statement.who=SELECT * FROM consent.whoitem LIMIT 1; whitelistds.statement=SELECT * FROM whitelist.whitelist_config LIMIT 1; servicestatuscheck.database.failurethreshold = 1 wsdl.app.endpoint = http://localhost:8080/consent-verification/ idcard.subject.id.type = medcom:cvrnumber idcard.subject.id = 46837428 idcard.subject.name = NETS DANID A/S - TU VOCES gyldig idcard.level = 3 idcard.system.name = Samtykkeservicen sts.endpoint = http://test1-cnsp.ekstern-test.nspop.dk:8080/sts/services/SecurityTokenService sts.keystore = Statens_Serum_Institut_VOCES.jks sts.keystore.password = Test1234 # Kafka kafka.producer.bootstrap.servers=kafka:9092 kafka.producer.client.id=MinSpaerringMinLog2-producer kafka.producer.key.serializer=org.apache.kafka.common.serialization.StringSerializer kafka.producer.value.serializer=org.apache.kafka.common.serialization.StringSerializer kafka.topic=MIT_TOPIC # Ikke digitale dk.nsp.minspaerring.administration.national.rolle=urn:dk:healthcare:national-federation-role:code:41001:value:SundAssistR1 dk.nsp.minspaerring.administration.rediger.minlog.tekst=Administrativ medarbejder har redigeret frabedelser på vegne af borger dk.nsp.minspaerring.administration.tilfoj.minlog.tekst=Administrativ medarbejder har tilføjet frabedelser på vegne af borger dk.nsp.minspaerring.administration.ophaev.minlog.tekst=Administrativ medarbejder har ophævet frabedelse på vegne af borger dk.nsp.minspaerring.administration.hent.minlog.tekst=Adm. medarbejder har indhentet oplysninger om borgers frabedelser |
log4j konfiguration
Log4j konfiguration findes i (hvis ovenstående format anvendes) consentadministration.log4j.properties filen.
Se yderligere opsætning i installationsvejledningen.
SLA-log konfiguration
Konfiguration af SLA-log findes i filen nspslalog-consentadministration.properties.
DKS konfiguration
Indholdet, der returneres ved kald af DCC Konfiguration Service-snitfladen (DKS), indlæses af DDS Registry fra filen:
| Code Block |
|---|
/pack/wildfly8/modules/nsi/consentadministration/config/main/dksConfiguration.xml |
Filen skal overholde DKS XML-skemaet og beskriver de webservice-operationer Samtykkeservicen administrationsservicen udstiller jf. [DKS-beskrivelse].
Test af DKS
Efter konfiguration og deployering af Samtykkeservicen administrationsservicen, kan DKS-snitfladen testes med:
| Code Block |
|---|
curl –i localhost:8081/consent-administration/dccconfig/dks |
Succesfuldt svar giver indholdet svarende til dksConfiguration.xml nævnt ovenfor.
Test af versionsnummer
Efter konfiguration og deploy af Samtykkeservicen administrationsservicen kan versionsnummeret hentes via en HTTP-snitflade.
| Code Block |
|---|
curl –i http://localhost:8081/consent-administration/info/version |
hvilket giver output I stil med:
| Code Block |
|---|
version 1.1.2 |
I eksemplet kørte servicen på en local maskine konfigureret til port 9090.
Samtykkeservicen verifikation
Service konfiguration
Grundlæggende konfiguration foregår ved redigering i filen ConsentVerification.properties, der placeres i følgende WildFly modul:
| Code Block |
|---|
/pack/wildfly8/modules/nsi/consentverification/config/main/ |
I denne skal følgende properties være definerede:
...
Property
...
Beskrivelse
...
idcard.version
...
Servicen afviser kald, hvor ID-kort i Security-header ikke har versionsnummer opgivet som værdien af denne property. Angives til 1.0.1
...
sts.test.mode
...
Angiver med værdien true at servicen benytter test-STS. Værdien skal være ’false’ i drift, hvorved den rigtige SOSI-STS anvendes.
...
log.config.file
...
Angiver placering af log4j properties.
...
databasecheck.statement.consent
...
Se databasemonitorering beskrevet i afsnit 4.3.1.2.
...
databasecheck.statement.what
...
databasecheck.statement.who
...
whitelistds.statement
...
servicestatuscheck.database.failurethreshold
...
Antal kald til lokal database der må fejle før der meldes 500 på statussnitfladen
...
wsdl.app.endpoint
...
Det endpoint, hvor servicen bor. Dette anvendes af wsdl servlet til at returnere en korrekt service location.
...
dk.nsi.app.name
...
Navn på system til SLA-logning.
...
dk.nsi.app.shortName
...
Kort navn på system til SLA-logning.
...
dk.nsi.consent.sor.service.url
...
SORES endpoint.
...
dk.nsi.consent.sor.fail.threshold
...
Grænse for hvor mange gange SORES-kald må fejle i træk, før SORES opfattes som usund.
dk.nsp.minspaerring.administration.national.rolle=urn:dk:healthcare:national-federation-role:code:41008:value:SpaerAdminR8
dk.nsi.app.name = consent-administration
dk.nsi.app.shortName = csnt-adm
dk.nsi.consent.valid.from.allowed.skew.seconds = 60
dk.nsi.consent.validate.healthcare.professional.cpr = true
dk.nsi.consent.validate.organization = true
citizen.powerofattorney.privileges=urn:dk:nspop:sts:consent
citizen.powerofattorney.enabled=false
# Database
datasource.jndi=java:/ConsentServiceDS
whiteList.datasource.jndi=java:/WhitelistDS
databasecheck.statement.consent=SELECT * FROM consentitem LIMIT 1;
databasecheck.statement.what=SELECT * FROM whatitem LIMIT 1;
databasecheck.statement.who=SELECT * FROM whoitem LIMIT 1;
whitelistds.statement=SELECT * FROM whitelist_config LIMIT 1;
servicestatuscheck.database.failurethreshold = 1
# STS
idcard.subject.id.type = medcom:cvrnumber
idcard.subject.id = 33257872
idcard.subject.name = Sundhedsdatastyrelsen
idcard.level = 3
idcard.system.name = MinSp\u00e6rring
sts.endpoint = http://test1-cnsp.ekstern-test.nspop.dk:8080/sts/services/SecurityTokenService
sts.keystore = NSP_Test_Service_Consumer_sds.p12
sts.keystore.password = Test1234
# NAS integration
dk.nsi.consent.nas.notification.endpoint = http://test1.ekstern-test.nspop.dk:8080/nas2/notificationbroker/service
dk.nsi.consent.nas.topic = TESTNAS-TOPIC1
dk.nsi.consent.nas.connect.timeout.millis = 10000
dk.nsi.consent.nas.max.total.connections = 20
dk.nsi.consent.nas.default.max.connections.per.route = 20
# PersonInformation integration
dk.nsi.consent.personinformation.endpoint = http://test1-cnsp.ekstern-test.nspop.dk:8080/stamdata-personinformation/v1
dk.nsi.consent.personinformation.connect.timeout.millis = 10000
dk.nsi.consent.personinformation.max.total.connections = 20
dk.nsi.consent.personinformation.default.max.connections.per.route = 20
dk.nsi.consent.personinformation.dgws.validation.level = OFF
dk.nsi.consent.personinformation.idws.validation.level = OFF
# Stamdata SAES
dk.nsi.consent.saes.endpoint = http://test1-cnsp.ekstern-test.nspop.dk:8080/stamdata-authorization-lookup-ws/service/AuthorizationService
dk.nsi.consent.saes.connect.timeout.millis = 10000
dk.nsi.consent.saes.max.total.connections = 20
dk.nsi.consent.saes.default.max.connections.per.route = 20
dk.nsi.consent.saes.fail.threshold = 1
# Stamdata SYES
dk.nsi.consent.syes.endpoint = http://test1-cnsp.ekstern-test.nspop.dk:8080/stamdata-yder-lookup-ws/service/YderService
dk.nsi.consent.syes.connect.timeout.millis = 10000
dk.nsi.consent.syes.max.total.connections = 20
dk.nsi.consent.syes.default.max.connections.per.route = 20
dk.nsi.consent.syes.fail.threshold = 1
# SORES
dk.nsi.consent.sor.endpoint = http://test1-cnsp.ekstern-test.nspop.dk:8080/sores/
dk.nsi.consent.sor.connect.timeout.millis = 10000
dk.nsi.consent.sor.max.total.connections = 20
dk.nsi.consent.sor.default.max.connections.per.route = 20
dk.nsi.consent.sor.fail.threshold = 10
# Minlog / Kafka
kafka.producer.bootstrap.servers=kafka:9092
kafka.producer.client.id=MinSpaerringMinLog2-producer
kafka.producer.key.serializer=org.apache.kafka.common.serialization.StringSerializer
kafka.producer.value.serializer=org.apache.kafka.common.serialization.StringSerializer
kafka.topic=MIT_TOPIC
client.minlog.properties = ConsentAdministration.properties
dk.nsp.minspaerring.administration.rediger.minlog.tekst=Administrativ medarbejder har redigeret frabedelser p\u00e5 vegne af borger
dk.nsp.minspaerring.administration.tilfoj.minlog.tekst=Administrativ medarbejder har tilf\u00f8jet frabedelser p\u00e5 vegne af borger
dk.nsp.minspaerring.administration.ophaev.minlog.tekst=Administrativ medarbejder har oph\u00e6vet frabedelse p\u00e5 vegne af borger
dk.nsp.minspaerring.administration.hent.minlog.tekst=Adm. medarbejder har indhentet oplysninger om borgers frabedelser |
log4j konfiguration
Log4j konfiguration findes i (hvis ovenstående format anvendes) consentadministration.log4j.properties filen.
Se yderligere opsætning i installationsvejledningen.
SLA-log konfiguration
Konfiguration af SLA-log findes i filen nspslalog-consentadministration.properties.
DKS konfiguration
Indholdet, der returneres ved kald af DCC Konfiguration Service-snitfladen (DKS), indlæses af DDS Registry fra filen:
| Code Block |
|---|
/pack/wildfly8/modules/nsi/consentadministration/config/main/dksConfiguration.xml |
Filen skal overholde DKS XML-skemaet og beskriver de webservice-operationer Samtykkeservicen administrationsservicen udstiller jf. [DKS-beskrivelse].
Test af DKS
Efter konfiguration og deployering af Samtykkeservicen administrationsservicen, kan DKS-snitfladen testes med:
| Code Block |
|---|
curl –i localhost:8081/consent-administration/dccconfig/dks |
Succesfuldt svar giver indholdet svarende til dksConfiguration.xml nævnt ovenfor.
Test af versionsnummer
Efter konfiguration og deploy af Samtykkeservicen administrationsservicen kan versionsnummeret hentes via en HTTP-snitflade.
| Code Block |
|---|
curl –i http://localhost:8081/consent-administration/info/version |
hvilket giver output I stil med:
| Code Block |
|---|
version 1.1.2 |
I eksemplet kørte servicen på en local maskine konfigureret til port 9090.
Samtykkeservicen verifikation
Service konfiguration
Grundlæggende konfiguration foregår ved redigering i filen ConsentVerification.properties, der placeres i følgende WildFly modul:
| Code Block |
|---|
/pack/wildfly8/modules/nsi/consentverification/config/main/ |
I denne skal følgende properties være definerede:
Property | Beskrivelse |
|---|---|
idcard.version | Servicen afviser kald, hvor ID-kort i Security-header ikke har versionsnummer opgivet som værdien af denne property. Angives til 1.0.1 |
sts.test.mode | Angiver med værdien true at servicen benytter test-STS. Værdien skal være ’false’ i drift, hvorved den rigtige SOSI-STS anvendes. |
log.config.file | Angiver placering af log4j properties. |
databasecheck.statement.consent | Se databasemonitorering beskrevet i afsnit 4.3.1.2. |
databasecheck.statement.what | |
databasecheck.statement.who | |
whitelistds.statement | |
servicestatuscheck.database.failurethreshold | Antal kald til lokal database der må fejle før der meldes 500 på statussnitfladen |
wsdl.app.endpoint | Det endpoint, hvor servicen bor. Dette anvendes af wsdl servlet til at returnere en korrekt service location. |
dk.nsi.app.name | Navn på system til SLA-logning. |
dk.nsi.app.shortName | Kort navn på system til SLA-logning. |
Følgende properties skal være defineret, for at starte servicen op med DGWS-sikkerhed i forbindelse med kald til SYES:
| STS | |
|---|---|
| idcard.subject.id.type | Subjecttype for IDKortet |
| idcard.subject.id | Subjectid for IDKortet |
| idcard.subject.name | Subjectnavn for IDKortet |
| idcard.level | Sikkerhedsniveau for IDkortet |
| idcard.system.name | Systemnavn i IDkortet |
| sts.endpoint | Endpointet, hvor Samtykkeservicen skal trække sit SOSI IDkort på baggrund af sts.keystore |
| sts.keystore | Keystore, der indeholder DDS Repository funktionscertifikat |
| sts.keystore.password | Password til sts.keystore |
Følgende properties skal være defineret når Samtykkeservicen skal kalde SORES og SYES:
| SYES | |
|---|---|
| dk.nsi.consent.syes.endpoint | SYES endpoint |
| dk.nsi.consent.syes.connect.timeout.millis | Grænse for hvor tid det må tage at oprette forbindelse til SYES (i ms.). |
| dk.nsi.consent.syes.max.total.connections | Maksimalt antal samtidige SYES-forbindelser. |
| dk.nsi.consent.syes.default.max.connections.per.route | Maksimalt antal SYES-forbindelser per rute. |
| dk.nsi.consent.syes.fail.threshold | Grænse for hvor mange gange SYES-kald må fejle i træk, før SYES opfattes som usund. |
| SORES | |
|---|---|
| dk.nsi.consent.sor.endpoint | SORES endpoint |
| dk.nsi.consent.sor.connect.timeout.millis | Grænse for hvor tid det må tage at oprette forbindelse til SORES (i ms.). |
| dk.nsi.consent.sor.max.total.connections | Maksimalt antal samtidige SORES-forbindelser. |
| dk.nsi.consent.sor.default.max.connections.per.route | Maksimalt antal SORES-forbindelser per rute. |
| dk.nsi.consent.sor.fail.threshold | Grænse for hvor mange gange SORES-kald må fejle i træk, før SORES opfattes som usund. |
Eksempel på properties fil:
| Code Block |
|---|
idcard.version = 1.0.1 sts.test.mode = true wsdl.app.endpoint=http://localhost:8080/consent-verification/ log.config.file=log4j-consentverification.properties dk.nsi.app.name = consent-verification dk.nsi.app.shortName = csnt-ver # Database datasource.jndi=java:/ConsentServiceDS whiteList.datasource.jndi=java:/WhitelistDS databasecheck.statement.consent=SELECT * FROM consentitem LIMIT 1; databasecheck.statement.what=SELECT * FROM whatitem LIMIT 1; databasecheck.statement.who=SELECT * FROM whoitem LIMIT 1; whitelistds.statement=SELECT * FROM whitelist_config LIMIT 1; servicestatuscheck.database.failurethreshold = 1 # STS idcard.subject.id.type = medcom:cvrnumber idcard.subject.id = 33257872 idcard.subject.name = Sundhedsdatastyrelsen idcard.level = 3 idcard.system.name = MinSpærring sts.endpoint = http://test1-cnsp.ekstern-test.nspop.dk:8080/sts/services/SecurityTokenService sts.keystore = NSP_Test_Service_Consumer_sds.p12 sts.keystore.password = Test1234 # SORES dk.nsi.consent.sor.endpoint = http://test1.ekstern-test.nspop.dk:8080/sores/ dk.nsi.consent.sor.connect.timeout.millis = 10000 dk.nsi.consent.sor.fail.threshold = 10 dk.nsi.consent.sor.max.total.connections |
...
= 200 dk.nsi.consent.sor.default.max.connections |
...
. |
...
Eksempel på properties fil:
| Code Block |
|---|
idcard.version = 1.0.1 sts.test.mode = false log.config.file=consentverification.log4j.properties databasecheck.statement.consent=SELECT * FROM consent.consentitem LIMIT 1; databasecheck.statement.what=SELECT * FROM consent.whatitem LIMIT 1; databasecheck.statement.who=SELECT * FROM consent.whoitem LIMIT 1; whitelistds.statement=SELECT * FROM whitelist.whitelist_config LIMIT 1; servicestatuscheck.database.failurethreshold = 1 wsdl.app.endpoint=http://localhost:8081/consent-administration/per.route = 20 # Stamdata SYES dk.nsi.consent.syes.endpoint = http://test1-cnsp.ekstern-test.nspop.dk:8080/stamdata-yder-lookup-ws/service/YderService dk.nsi.consent.syes.fail.threshold = 1 dk.nsi.consent.syes.connect.timeout.millis = 10000 dk.nsi.consent.syes.max.total.connections = 20 dk.nsi.consent.syes.default.max.connections.per.route = 20 |
Log4j konfiguration
Log4j konfiguration findes i (hvis ovenstående format anvendes) consentverification.log4j.properties filen.
...
nsp-role-mapping.properties
DDS Registry og Repository anvender denne property fil til at mappe hvilken rolle (role), der kommer ned i minlog registreringen.
Property filen vedligeholdes her: https://git.nspop.dk/projects/TOOL/repos/nsp-role-mapping/browse/nsp-role-mapping.properties
...
Auditlogning is done using the official NSP Audit Log modul.
De forskellige håndtag logges på følgende måde.
Samtykkeservicen verificering Audit data
...
Type mapning mellem ovenstående tabel og faktisk data i fil: Personlig = RegularPersonalInformation/RPI, Ikke personlig = NonPersonalInformation/NPI og Følsomme = SensitivePersonalInformation/SPI
...