1. Inleiding
Met de inwerkingtreding van de ‘Ministeriele Regeling specificaties en typegoedkeuring
boordcomputer taxi’ zijn de specificaties van de ‘Boordcomputer Taxi’ (BCT) van kracht
geworden. Met deze regelgeving wordt elke taxi in Nederland voorzien van een boordcomputer,
die zowel de arbeids-, rij- en rusttijden van de taxichauffeur als de rittenstaat
behorend bij de taxi vastlegt.
Om de authenticiteit en integriteit van de vastgelegde data te waarborgen, voorziet
de boordcomputer deze data van elektronische handtekeningen. Daartoe wordt een zogeheten
‘Public Key Infrastructure’ worden opgezet. De boordcomputer wordt voorzien van een
certificaat en een sleutelpaar (publieke- en private sleutels), zodat hij in staat
is data elektronisch te ondertekenen en de authenticiteit van aangeboden gebruikerskaarten
vast te stellen. Het certificaat en het sleutelpaar van de boordcomputer worden hiertoe
opgeslagen op een chipkaart, de zogeheten systeemkaart, die in een speciaal kaartslot
van de boordcomputer wordt geplaatst.
Alle gebruikers van de boordcomputer worden voorzien van gebruikerskaarten, de zogeheten
boordcomputerkaarten. Deze kaarten bevatten evenals de systeemkaart certificaten en
sleutelparen. Toegang tot de boordcomputer is alleen mogelijk na authenticatie van
een boordcomputerkaart door (de logica van) de boordcomputer.
Binnen de groep gebruikers van de boordcomputer zijn vier rollen te onderscheiden,
namelijk die van bestuurder, vervoerder, werkplaats en toezichthouder. Elk van deze
rollen is gebonden aan een apart type boordcomputerkaart. Elke rol heeft zijn eigen
autorisatieniveau, bijvoorbeeld waar het gaat om toegang tot de op de boordcomputer
vastgelegde data.
Binnen BCT zijn dus vijf verschillende chipkaarten te onderscheiden:
-
• Een apparaatgebonden systeemkaart behorend bij een boordcomputer;
-
• Een persoonsgebonden chauffeurskaart behorend bij een bestuurder;
-
• Een organisatiegebonden ondernemerskaart behorend bij een vervoerder;
-
• Een organisatiegebonden keuringskaart behorend bij een werkplaats;
-
• Een persoonsgebonden inspectiekaart behorend bij een toezichthouder.
1.1. Bereik van dit document
Dit document bevat technische specificaties en richtlijnen voor het gebruik van de
hierboven genoemde chipkaarten. Dit document is primair bedoeld voor fabrikanten van
boordcomputers. De hoofdstukken 2 en 5 t/m 8, alsmede bijlage A, zijn echter ook interessant
voor ontwikkelaars van toepassingen bedoeld om chauffeurskaarten uit te lezen.
4. Beveiligde gegevensoverdracht
Overeenkomstig het gestelde in Referentie [14] hoeft de gegevensoverdracht tussen
boordcomputer en boordcomputerkaart niet te worden beveiligd. Volgens diezelfde referenties
dient de gegevensoverdracht tussen boordcomputerlogica en systeemkaart wel beveiligd
te zijn.
Deze beveiligde gegevensoverdracht wordt bereikt door het versleutelen van de gegevens
en het toevoegen van een cryptografische controlesom (MAC) aan de binnen het commando
of het antwoord gezonden gegevensobjecten (MAC-ENC mode).
De MAC van binnen een commando gezonden gegevens moet de commando-kop en alle gezonden
gegevensobjecten integreren (=> CLA = '0C', en alle gegevensobjecten moeten worden
ingekapseld met tags waarin b1 = 1).
De MAC moet door de ontvanger geverifieerd worden.
De bytes van de statusinformatie van het antwoord moeten altijd door een MAC worden
beveiligd, met uitzondering van de gevallen beschreven in paragraaf 4.2.
4.1. Structuur van commando’s en antwoorden bij beveiligde gegevensoverdracht
In de onderstaande figuren zijn schematisch een beveiligd commando en een beveiligd
antwoord weergegeven. Voor een verdere beschrijving hiervan wordt verwezen naar Referentie
[7], section 7.1.9 en section 7.1.10.
Figuur 1: Beveiligd commando
Figuur 2: Beveiligd antwoord
4.2. Fouten bij de beveiligde gegevensoverdracht
Wanneer de systeemkaart tijdens het verwerken van een commando een Secure Messaging-fout
ontdekt, dan moeten de statuswoorden zonder Secure Messaging teruggezonden worden.
Overeenkomstig ISO/IEC 7816-4 moeten de onderstaande statuswoorden gebruikt worden
om Secure Messaging-fouten aan te geven:
'69 82' Veiligheids toestand voldoet niet,
'69 85' Sessiesleutels zijn niet beschikbaar,
'69 87' Verwachte Secure Messaging-gegevensobjecten ontbreken,
'69 88' Secure Messaging-gegevensobjecten onjuist.
Wanneer de systeemkaart statuswoorden zonder Secure Messaging gegevensobjecten of
met een foutieve Secure Messaging gegevensobjecten terugzendt, moet de sessie door
de boordcomputerlogica afgebroken worden.
In het geval van een Secure Messaging-fout vervallen de sessiesleutels en SSC.
4.3. Sessiesleutels
Voor beveiligde gegevensoverdracht tussen de boordcomputerlogica en de systeemkaart
worden twee 16 bytes lange sessiesleutels gebruikt. De methode om deze sessiesleutels
SKENC en SKMAC te genereren wordt beschreven in Referentie [7], section 7.1.4.
4.4. Zendsequentieteller (SSC)
Tijdens de authenticatie procedure wordt er door zowel de systeemkaart als door de
boordcomputerlogica een 8 bytes random gegenereerd, RND.BCT resp. RND.ICC.
De vier minst significante bytes (LSB) van beiden worden gebruikt om de initiële waarde
voor de SSC te bepalen: SSC = RND.ICC (4 LSB) || RND.BCT (4 LSB).
De SSC wordt iedere keer voordat een MAC berekend wordt met 1 verhoogd, dus voor de
eerste MAC-berekening wordt de waarde SSC + 1 gebruikt.
4.5. Algoritmes
Het algoritme dat gebruikt wordt voor het berekenen van cryptogrammen wordt beschreven
in Referentie [7], section 7.1.9 en section 7.1.10.
Het algoritme dat gebruikt wordt voor het berekenen van cryptografische controlesommen
(MACs) wordt beschreven in Referentie [7], section 7.1.12.
De MAC is 8 bytes lang.
Iedere keer voordat er een MAC berekend wordt, wordt de zendsequentieteller (SSC)
met 1 verhoogd.
4.6. Authenticatiescenario Systeemkaart-Boordcomputer
Het authenticatiescenario tussen systeemkaart en boordcomputer wordt uitgevoerd zoals
beschreven is in Referentie [7], section 5.2.2.
Hierbij moet gelet worden op de volgende punten:
-
1. Er wordt gebruik gemaakt van symmetrische sleutels (zie hoofdstuk 3). De initiële
sleutels worden afgeleid van “transportkey1”:
-
• KS.KMAC bestaat uit de eerste 16 bytes van “transportkey1”,
-
• KS.KENC bestaat uit de laatste 16 bytes van “transportkey1”.
-
2. Na het uitlezen van EF.SN.ICC worden de laatste 8 bytes hiervan gebruikt voor SN.ICC.
-
3. Bij het berekenen van de MAC moet gebruik gemaakt worden van padding, zoals beschreven
is in Referentie [7], section 10.1.
Na een succesvolle uitvoering van de Mutual Authenticate kunnen de sessiesleutels
en de SSC berekend worden, zoals beschreven is in Referentie [7], section 7.1.4 en
7.1.5.
Er is dan een secure messaging kanaal tussen de systeemkaart en de boordcomputer (MAC-ENC
mode) en alle volgende commando’s en antwoorden moeten beveiligde gegevensoverdracht
gebruiken.
5. Gegevens op chauffeurskaart (EF.Driver_Activity_Data)
Op de chauffeurskaart worden de arbeids- rij- en rusttijden van een chauffeur opgeslagen
in de bestandsstructuur EF.Driver_Activity_Data. De grootte van die bestandsstructuur
wordt door de Personalisator op elke chauffeurskaart gemaximeerd (zie ook § 7.1, §
9.5 en Referentie [9] in hoofdstuk 10).
5.1. Opbouw van EF.Driver_Activity_Data
Figuur 3: EF.Driver_Activity_Data
Naam
|
Grootte (bytes)
|
PointerOldestDayRecord
|
2
|
PointerLastDayRecord
|
2
|
DriverCardNumber
|
16
|
DailyRecords
|
variabel
|
EF.Driver_Activity_Data is opgebouwd uit de volgende elementen:
-
•
PointerOldestDayRecord: specificeert het begin van de geheugenplaats (aantal bytes vanaf het begin van EF.Driver_Activity_Data)
van de oudste volledige dagregistratie in DailyRecords.
De initiële waarde (na personalisatie) is ‘00 00’H (0) wat betekent dat er nog geen
DailyRecords bestaan.
Na toevoeging van het eerste DailyRecord moet de waarde ‘00 14’H (20) zijn.
De maximale waarde wordt door de lengte van EF.Driver_Activity_Data bepaald.
Gegevenssoort: INTEGER (unsigned)
-
•
PointerLastDayRecord: specificeert het begin van de geheugenplaats (aantal bytes vanaf het begin van EF.Driver_Activity_Data)
van de meest recente dagregistratie in DailyRecords.
De initiële waarde (na personalisatie) is ‘00 00’H (0) wat betekent dat er nog geen
DailyRecords bestaan.
Na toevoeging van het eerste DailyRecord moet de waarde ‘00 14’H (20) zijn.
De maximale waarde wordt door de lengte van EF.Driver_Activity_Data bepaald.
Gegevenssoort: INTEGER (unsigned)
-
•
DriverCardNumber: betreft een kopie van het chauffeurskaartnummer zoals dat ook aanwezig is in het
subjectSerialNumber-veld van het (“read-only”) authenticiteitcertificaat van de chauffeurskaart.
Na personalisatie zal dit element gevuld zijn met het chauffeurskaartnummer. Handhavingsapplicaties
downloaden in principe uitsluitend EF_Driver_Activity_Data van een chauffeurskaart.
Om die applicaties te informeren over het chauffeurskaartnummer, dient een boord¬computer
de correcte invulling van dit veld telkens na een succesvolle login te verifiëren
en zo nodig te herstellen (zie ook § 7.1).
Gegevenssoort: PrintableString (16 bytes)
-
•
DailyRecords: de records waarin de gegevens van de activiteiten van de chauffeur opgeslagen worden
(zie Figuur 4). Voor iedere dag dat de kaart gebruikt wordt, wordt een DailyRecord
aangemaakt. De gegevens van minimaal de laatste 31 kalenderdagen worden op de kaart
bewaard.
5.1.1. DailyRecord
Een DailyRecord bevat alle gegevens van de activiteiten van de chauffeur op een bepaalde
dag. Na personaliseren bestaat er nog geen enkel DailyRecord.
Figuur 4: DailyRecord
Naam
|
Grootte (bytes)
|
DayRecordLength
|
2
|
PointerLastSessionRecord
|
2
|
PreviousDayRecordLength
|
2
|
DayRecordDate
|
4
|
SessionRecords
|
variabel
|
Een DailyRecord bestaat uit de volgende elementen:
-
•
DayRecordLength: de lengte van het huidige DailyRecord.
De initiële waarde bij een nieuw DailyRecord (dat nog geen enkel SessionRecord omvat)
is ‘00 0A’H (10); de lengte van de kop van dit DailyRecord (zonder de SessionRecords).
Gegevenssoort: INTEGER (unsigned)
-
•
PointerLastSessionRecord: specificeert het begin van de geheugenplaats (aantal bytes vanaf het begin van EF.Driver_Activity_Data)
van de meest recente sessie in dit DailyRecord.
De initiële waarde bij een nieuw DailyRecord (dat nog geen enkel SessionRecord bevat)
is ‘00 00’H (0).
Nadat aan dit DailyRecord het eerste SessionRecord is toegevoegd, moet de waarde 10
hoger zijn dan het startadres van dit DailyRecord; bij het eerste SessionRecord van
het eerstgeboekte DailyRecord zal dit 20 + 10 = 30 (’00 1E'H) zijn.
Uitgezonderd de waarde 0, zal de waarde van PointerLastSessionRecord nooit kleiner
zijn dan 30 (’00 1E’H).
Gegevenssoort: INTEGER (unsigned)
-
•
DayPreviousRecordLength: de lengte van het vorige DailyRecord. Is er geen vorige DailyRecord omdat deze de
oudste is, dan is de waarde ‘00 00’H (0).
Uitgezonderd de waarde 0, zal de waarde van DayPreviousRecordLength nooit kleiner
zijn dan 10 (’00 0A’H).
Gegevenssoort: INTEGER (unsigned)
-
•
DayRecordDate: de datum waarvoor dit DailyRecord is. Dit is in het formaat JJJJMMDD.
Gegevenssoort: BCD
-
•
SessionRecords: een of meerdere SessionRecords (zie Figuur 5) voor deze dag.
5.1.2. SessionRecord
Een SessionRecord bevat de gegevens van de activiteiten van de chauffeur voor een
kaartsessie. Indien er meerdere kaartsessies op een dag zijn, zijn er voor die dag
ook meerdere SessionRecords. Na personaliseren bestaat er nog geen enkel SessionRecord.
Figuur 5: SessionRecord
Naam
|
|
Grootte (bytes)
|
PointerLastActivityRecord
|
2
|
299
|
PointerLastPWActivityRecord
|
2
|
SignatureDateTime
|
|
|
SignatureDate
|
8 nibbles
|
|
SignatureTime
|
6 nibbles
|
SessionSignature
|
256
|
SessionCreationDateTime
|
|
|
SessionCreationDate
|
8 nibbles
|
|
SessionCreationTime
|
6 nibbles
|
SystemCardNumber
|
|
|
Boordcomputernr
|
9 nibbles
|
|
Kaartvolgnummer
|
5 nibbles
|
Kenteken
|
6
|
CompanyCardNumber
|
|
|
KvKnummer
|
12 nibbles
|
|
Kaartvolgnummer
|
5 nibbles
|
Pnummer
|
7 nibbles
|
ActivityRecords
|
variabel
|
variabel
|
De lengte van een SessionRecord kop (zonder de ActivityRecords) is 299 bytes.
Een SessionRecord bestaat uit de volgende elementen:
-
•
PointerLastActivityRecord: specificeert het begin van de geheugenplaats (aantal bytes vanaf het begin van EF.Driver_Activity_Data)
van de het laatste ActivityRecord in deze SessionRecords.
De initiële waarde bij een nieuw SessionRecord (nog zonder ActivityRecords) is ‘00
00’H (0).
Uitgezonderd de waarde 0, zal de waarde van PointerLastActivityRecord nooit kleiner
zijn dan 20+10+299 = 329 (’01 49’H).
Gegevenssoort: INTEGER (unsigned)
-
•
PointerLastPWActivityRecord: specificeert het begin van de geheugenplaats (aantal bytes vanaf het begin van EF.Driver_Activity_Data)
van het laatste ActivityRecord met een activiteit “Start pauze” of “Start werk”.
De initiële waarde bij een nieuw SessionRecord (nog zonder ActivityRecords) is ‘00
00’H (0).
Zo lang er nog geen “Start pauze” of “Start werk” ActivityRecord in dit SessionRecord
aanwezig is, blijft de waarde gelijk aan 0.
Uitgezonderd de waarde 0, zal de waarde van PointerLastPWActivityRecord nooit kleiner
zijn dan 20+10+299 = 329 (’01 49’H).
Gegevenssoort: INTEGER (unsigned)
-
•
SignatureDateTime: het tijdstip direct voorafgaand aan het berekenen van de SessionSignature. Voor verdere
informatie over de handtekening zetten, zie 5.4.
Dit veld bestaat uit twee delen:
-
–
SignatureDate:
formaat JJJJMMDD,
initiële waarde bij een nieuw SessionRecord: ‘00000000’H,
gegevenssoort BCD.
-
–
SignatureTime:
formaat hhmmss (24-uurs klok)
initiële waarde bij een nieuw SessionRecord: ‘000000’H,
gegevenssoort BCD.
-
•
SessionSignature: de door de boordcomputer gezette handtekening over de gegevens zoals gespecificeerd
in § 5.4.
De initiële waarde bij een nieuw SessionRecord is “ongedefinieerd”.
Gegevenssoort: OCTET_STRING(SIZE(256))
-
•
SessionCreationDateTime: het tijdstip waarop dit SessionRecord werd gecreëerd.
Dit veld bestaat uit twee delen:
-
–
SignatureDate:
formaat JJJJMMDD,
initiële waarde bij een nieuw SessionRecord: de datum waarop dit SessionRecord werd
gecreëerd,
gegevenssoort BCD.
-
–
SignatureTime:
formaat hhmmss
initiële waarde bij een nieuw SessionRecord: het tijdstip waarop dit SessionRecord
werd gecreëerd,
gegevenssoort BCD.
-
•
SystemCardNumber: bestaat uit 2 delen:
-
–
Boordcomputernr: het nummer van de systeemkaart zoals op het moment van creëren van dit SessionRecord
bekend in de boordcomputer (9 digits BCD)
-
–
Kaartvolgnummer: het volgnummer van de systeemkaart zoals op het moment van creëren van dit SessionRecord
bekend in de boordcomputer (5 digits BCD)
-
•
Kenteken: het kenteken van het voertuig zoals op het moment van creëren van dit SessionRecord
bekend in de boordcomputer (6 bytes ASCII)
-
•
CompanyCardNumber: bestaat uit 2 delen:
-
–
KvKnummer: Kamer van Koophandel nummer van de ondernemer zoals op het moment van creëren van
dit SessionRecord bekend in de boordcomputer (12 digits BCD)
-
–
Kaartvolgnummer: volgnummer van de ondernemerskaart zoals op het moment van creëren van dit SessionRecord
bekend in de boordcomputer (5 digits BCD)
-
•
Pnummer: personenvervoernummer van de ondernemer zoals op het moment van creëren van dit SessionRecord
bekend in de boordcomputer (7 digits BCD)
-
•
ActivityRecords: een of meerdere ActivityRecords (zie Figuur 6).
5.1.3. ActivityRecord
Er wordt een aantal types ActivityRecords onderscheiden aan de hand van de activiteit.
Figuur 6: ActivityRecord
Activiteit
Type
|
Kop
|
Gegevens
|
Opmerking
|
activiteit
|
handm.
|
rijden
|
tijdstip
|
Veld 1
|
Veld 2
|
Login
|
‘00001’B
|
‘0’B
|
‘0’/’1’B
|
hh:mm:ss
|
geen
|
geen
|
Het tijdstip waarop de BCT het inloggen constateerde.
|
‘1’B
|
Een login kan geen handmatig ingesteld tijdstip hebben. Deze combinatie komt dus niet
voor.
|
(Start) pauze
|
‘00010’B
|
‘0’B
|
‘0’/’1’B
|
hh:mm:ss
|
geen
|
geen
|
Het tijdstip waarop de BCT de start van de pauze constateerde. Recordvorm indien dit
record niet het laatste ActivityRecord van de sessie is.
|
aantal secondes pauze
|
Het tijdstip waarop de BCT de start van de pauze constateerde. Recordvorm indien dit
record het laatste ActivityRecord van de sessie is.
|
‘1’B
|
geen
|
Het handmatig opgegeven tijdstip dat de pauze aanving. Recordvorm indien dit record
niet het laatste ActivityRecord van de sessie is.
|
aantal secondes pauze
|
Het handmatig opgegeven tijdstip dat de pauze aanving. Recordvorm indien dit record
het laatste ActivityRecord van de sessie is.
|
(Start) werk
|
‘00011’B
|
‘0’B
|
‘0’/’1’B
|
hh:mm:ss
|
aantal secondes rijden
|
geen
|
Het tijdstip waarop de BCT de start van werk constateerde. Recordvorm indien dit record
niet het laatste ActivityRecord van de sessie is.
|
aantal secondes werk
|
Het tijdstip waarop de BCT de start van werk constateerde. Recordvorm indien dit record
het laatste ActivityRecord van de sessie is.
|
‘1’B
|
geen
|
Het handmatig opgegeven tijdstip dat werk aanving. Recordvorm indien dit record niet
het laatste ActivityRecord van de sessie is.
|
aantal secondes werk
|
Het handmatig opgegeven tijdstip dat werk aanving. Recordvorm indien dit record het
laatste ActivityRecord van de sessie is.
|
Afsluiting
|
‘00100’B
|
‘0’B
|
‘0’/’1’B
|
hh:mm:ss
|
geen
|
geen
|
reguliere Afsluiting: Het tijdstip waarop de BCT het afsluiten en aftekenen van de
sessie constateerde.
|
Nieuwe eindtijd
|
‘1’B
|
handmatige Afsluting / Nieuwe eindtijd: Het handmatig opgegeven tijdstip dat een sessie
(“werkdag”) stopte.
|
Dagovergang
|
‘00101’B
|
‘0’B
|
‘0’/’1’B
|
23:59:59
|
geen
|
geen
|
Middernacht automatisch: Een dagovergang geconstateerd tijdens normale modus.
|
‘1’B
|
Middernacht handmatig: Een dagovergang geconstateerd tijdens handmatige invoer.
|
Een ActivityRecord heeft een kop van 24 bits (3 bytes) groot die de volgende elementen
bevat:
-
•
activiteit: geeft het type activiteit aan (5 bits).
-
•
handmatig: geeft aan of het tijdstip van de activiteit handmatig of automatisch is geboekt (1
bit).
-
•
rijden: geeft aan of de activiteit tijdens het rijden of stilstaan is geboekt (1 bit).
-
•
tijdstip: geeft het starttijdstip van de activiteit aan in het formaat hhmmss. Dit formaat
is als volgt opgebouwd:
-
–
hh: 5 bits
-
–
mm: 6 bits
-
–
ss: 6 bits
Noot 1: Bij de activiteit “Start werk” wordt een Rijtijdveld aan de kop toegevoegd. Dit
werkt als volgt:
-
• gedurende het werk wordt volautomatisch bijgehouden hoeveel secondes er gereden worden
(3 bytes INTEGER (unsigned)). Wanneer (na een periode van rijden gedurende werktijd)
het aantal secondes gewijzigd is, wordt hetzelfde record opnieuw geschreven, waarbij
de kop gelijk blijft en het aantal secondes aangepast. Dit bijwerken van rijtijd moet
ook plaatsvinden indien de laatste keer bijwerken (meer dan) vijf minuten geleden
was. Er wordt dus geen nieuw record aangemaakt.
Noot 2: Bij zowel de activiteit “Start werk” als “Start pauze” wordt een Tijdsduurveld aan
de kop toegevoegd. Dit werkt als volgt:
-
• gedurende het werk / de pauze wordt volautomatisch bijgehouden hoeveel secondes er
verstreken zijn sinds de activiteit startte (3 bytes INTEGER (unsigned)). Telkens
wanneer de auto stopt en telkens vijf minuten na de vorige vastlegging van de tijdsduur
worden de laatste 3 bytes van hetzelfde record opnieuw geschreven, waarbij de voorgaande
bytes gelijk blijven en het aantal secondes aangepast. Er wordt dus geen nieuw record
aangemaakt.
-
• Het eerstvolgende toe te voegen ActivityRecord overschrijft deze laatste 3 bytes (de
daadwerkelijke tijdsduur van de dan voorafgaande “Start werk” / “Start pauze” activiteit
wordt met de starttijd van de nieuwe activiteit definitief vastgelegd).
Noot 3: Bij iedere toevoeging van een ActivityRecord bestaat de mogelijkheid dat er een
nieuw DailyRecord en/of nieuw SessionRecord aangemaakt moet worden. Zie hiervoor ook
§ 7.5 en § 0.
5.1.4. Overzicht
De gegevens worden per dag vastgelegd en moeten minimaal 31 kalenderdagen beschikbaar
blijven op de kaart. Voor iedere dag dat er gegevens op de chauffeurskaart vastgelegd
moeten worden, wordt er een DailyRecord aangemaakt.
Naast de arbeids- rij- en rusttijden zelf moet ook vastgelegd worden voor welke ondernemer
en in welk voertuig deze tijden gemaakt zijn en welke boordcomputer er gebruikt is.
Dit wordt per sessie vastgelegd in het SessionRecord.
In Figuur 7 staat een overzicht van EF.Driver_Activity_Data en hoe de verschillende
records hier onder vallen.
Figuur 7: Overzicht EF.Driver_Activity_Data
5.2. Schrijven naar EF.Driver_Activity_Data
Activiteiten van de chauffeur worden opgeslagen in ActivityRecords. In Figuur 6 worden
de verschillende typen van ActivityRecords genoemd. Het verloop van een sessie staat
in hoofdstuk 7 beschreven. Het exacte verloop van het toevoegen van een ActivityRecord
staat in § 0.
5.2.1. Toevoegen van de eerste activiteit binnen een SessionRecord
Elk van de navolgende subparagrafen (5.2.2 t/m 5.2.7) gaat er van uit dat de toe te
voegen activiteit niet de eerste activiteit binnen het betreffende SessionRecord is. Indien dat echter wél het geval
is, moeten de instructies voor het overschrijven van de PointerLastActivityRecord
en de DayRecordLength velden telkens worden vervangen door de volgende:
-
1. In het SessionRecord dient PointerLastActivityRecord gezet te worden op PointerLastSessionRecord
+ 299;
-
2. In het huidige DailyRecord dient de DayRecordLength verhoogd te worden met de (ongecorrigeerde)
lengte van het toe te voegen ActivityRecord:
-
– Voor een “Start werk”, verhogen met 9;
-
– Voor een “Start pauze”, verhogen met 6;
-
– Voor elke andere activiteit, verhogen met 3.
5.2.2. Toevoegen “Login” activiteit
De “Login” activiteit geeft de werkelijke tijd aan dat de chauffeurskaart in de boordcomputer
ingebracht is en de authenticatie plaatsgevonden heeft. Dit is het login-tijdstip.
Dit staat beschreven in 7.1.
Bij een “Login” wordt er een nieuw ActivityRecord aangemaakt.
PointerLastSessionRecord geeft het begin van het huidige SessionRecord aan.
In dit SessionRecord wordt
-
1. PointerLastActivityRecord verhoogd met de lengte van de laatste ActivityRecord (verminderd
met 3 indien het huidige ActivityRecord een “Start werk” of “Start pauze” betreft).
-
2. het ActivityRecord “Login” toegevoegd op de plaats die aangegeven wordt door de verhoogde
PointerLastActivityRecord. Dit record bestaat uit 3 bytes (alleen een kop). De handmatig
bit staat altijd op ‘0’B.
-
3. SessionSignature = de tussentijdse handtekening (zie 5.4).
In het huidige DailyRecord wordt
-
1. DayRecordLength = oude waarde DayRecordLength + 3 (verminderd met 3 indien het (inmiddels)
vorige ActivityRecord een “Start werk” of “Start pauze” betreft).
-
2. Direct na het toevoegen van de “Login” activiteit wordt een (automatisch) geklokte
“Start werk” activiteit toegevoegd.
5.2.3. Toevoegen “Start pauze” activiteit
Bij een “Start pauze” wordt er een nieuw ActivityRecord aangemaakt.
PointerLastSessionRecord geeft het begin van het huidige SessionRecord aan.
In dit SessionRecord wordt
-
1. PointerLastActivityRecord verhoogd met de lengte van de laatste ActivityRecord (verminderd
met 3 indien het huidige ActivityRecord een “Start werk” of “Start pauze” betreft).
-
2. PointerLastPWActivityRecord wordt gelijkgesteld aan de zojuist verhoogde PointerLastActivityRecord.
-
3. het ActivityRecord “Start pauze” toegevoegd op de plaats die aangegeven wordt door
de verhoogde PointerLastActivityRecord. Dit record bestaat uit 6 bytes (een kop +
een tijdsduurteller), waarbij de tijdsduurteller initieel wordt gevuld met ‘00 00
00’H en daarna periodiek wordt bijgewerkt volgens Noot 2 in § 5.1.3.
-
4. SessionSignature = de tussentijdse handtekening (zie 5.4).
In het huidige DailyRecord wordt
5.2.4. Toevoegen “Start werk” activiteit
Bij een “Start werk” wordt er een nieuw ActivityRecord aangemaakt.
“Start werk” wijkt af van de andere activiteiten. Hierin wordt bijgehouden hoeveel
secondes het voertuig gereden heeft gedurende deze activiteit. Zolang de chauffeur
nog aan het werk is en het voertuig afwisselend rijdt en stilstaat, wordt iedere keer
zodra het voertuig stopt het aantal secondes dat er gereden is bijgewerkt. Er wordt
dus niet iedere keer een nieuw ActivityRecord aangemaakt.
PointerLastSessionRecord geeft het begin van het huidige SessionRecord aan.
In dit SessionRecord wordt
-
1. PointerLastActivityRecord verhoogd met de lengte van de laatste ActivityRecord (verminderd
met 3 indien het huidige ActivityRecord een “Start werk” of “Start pauze” betreft).
-
2. PointerLastPWActivityRecord wordt gelijkgesteld aan de zojuist verhoogde PointerLastActivityRecord.
-
3. het ActivityRecord “Start werk” toegevoegd op de plaats die aangegeven wordt door
de verhoogde PointerLastActivityRecord.
Dit record bestaat uit een kop van 3 bytes gevolgd door 2 x 3 bytes data.
De data geeft het aantal secondes aan dat er met het voertuig gereden is en het aantal
secondes dat deze activiteit in totaal duurde. Bij het begin van “Start werk” zijn
beiden ‘00 00 00’H. Deze waardes worden conform Noten 1 en 2 in § 5.1.3 tussentijds
bijgewerkt tot er een andere activiteit plaats vindt.
-
4. SessionSignature = de tussentijdse handtekening (zie 5.4).
In het huidige DailyRecord wordt
5.2.5. Toevoegen “Afsluiting” activiteit
Bij een normale afsluiting door de chauffeur, “Afsluiting”, wordt er een nieuw ActivityRecord
aangemaakt.
PointerLastSessionRecord geeft het begin van het huidige SessionRecord aan.
In dit SessionRecord wordt
-
1. PointerLastActivityRecord verhoogd met de lengte van de laatste ActivityRecord (verminderd
met 3 indien het huidige ActivityRecord een “Start werk” of “Start pauze” betreft).
-
2. het ActivityRecord “Afsluiting” toegevoegd op de plaats die aangegeven wordt door
de verhoogde PointerLastActivityRecord. Dit record bestaat uit 3 bytes (alleen een
kop).
-
3. SessionSignature = de definitieve handtekening (zie 5.4).
In het huidige DailyRecord wordt
5.2.6. Toevoegen “Nieuwe eindtijd” (=handmatige Afsluiting) activiteit
Wanneer er bij een sessie nog activiteiten toegevoegd worden, kan het voorkomen dat
de eindtijd aangepast moet worden. Dit wordt gedaan met een “Nieuwe eindtijd” activiteit.
Hierbij wordt er een nieuwe ActivityRecord aangemaakt.
PointerLastSessionRecord geeft het begin van het huidige SessionRecord aan.
In dit SessionRecord wordt
-
1. PointerLastActivityRecord verhoogd met de lengte van de laatste ActivityRecord (verminderd
met 3 indien het huidige ActivityRecord een “Start werk” of “Start pauze” betreft).
-
2. het ActivityRecord “Nieuwe eindtijd” toegevoegd op de plaats die aangegeven wordt
door de verhoogde PointerLastActivityRecord. De handmatig-bit staat hier altijd op
‘1’B. Dit record bestaat uit 3 bytes (alleen een kop).
-
3. SessionSignature = de definitieve handtekening (zie 5.4).
In het huidige DailyRecord wordt
5.2.7. Toevoegen “Dagovergang (handmatig/automatisch)” activiteit
Wanneer er een sessie actief is, de laatstgeboekte activiteit een “Start werk” of
“Start pauze” is en:
-
• (situatie 1) het betreft een automatische activiteit en de BCT-klok geeft 0:00:00u
aan OF;
-
• (situatie 2) er wordt een handmatige activiteit toegevoegd met een tijdstip op of
na 0:00:00u van de dag volgend op het huidige DailyRecord,
dan moet:
-
• de rijtijdteller worden bijgewerkt indien de laatstgeboekte activiteit een “Start
werk” betreft,
-
• de huidige sessie gestopt worden door toevoeging van een “Dagovergang” activiteit
met:
-
○ het tijdstip 23:59:59u
-
○ het handmatig bit op ‘0’B indien het situatie 1 betreft OF
-
○ het handmatig bit op ‘1’B indien het situatie 2 betreft,
-
• de huidige sessie worden “afgetekend” door de boordcomputer
-
• EN een nieuw DailyRecord voor de volgende kalenderdag worden aangemaakt met een nieuw
SessionRecord en een eerste ActivityRecord met
-
○ hetzelfde ActivityType als de laatstgeboekte activiteit EN
-
○ het tijdstip op 00:00:00u
-
○ het handmatig bit op ‘0’B indien het situatie 1 betreft OF
-
○ het handmatig bit op ‘1’B indien het situatie 2 betreft
Het toevoegen van het nieuwe DailyRecord met een nieuw SessionRecord en een eerste
“Start pauze” of “Start werk” activiteit wordt beschreven in respectievelijk § 8.11,
§ 8.10, § 5.2.1 en § 5.2.3 / 5.2.4. Hier wordt uitsluitend toevoeging van de “Dagovergang”
aan het huidige SessionRecord beschreven.
PointerLastSessionRecord geeft het begin van het huidige SessionRecord aan.
In dit SessionRecord wordt
-
1. PointerLastActivityRecord verhoogd met de lengte van het laatste ActivityRecord verminderd
met 3 omdat het huidige ActivityRecord een “Start werk” of “Start pauze” betreft.
-
2. het ActivityRecord “Dagovergang” toegevoegd op de plaats die aangegeven wordt door
de verhoogde PointerLastActivityRecord. De handmatig-bit en het tijdstip worden gevuld
zoals hierboven beschreven. Dit record bestaat uit 3 bytes (alleen een kop).
-
3. SessionSignature = de definitieve handtekening (zie 5.4).
In het huidige DailyRecord blijft DayRecordLength gelijk, omdat het (inmiddels) vorige
ActivityRecord een “Start werk” of “Start pauze” betreft.
NB. Indien de invoeging van de dagovergang en de nieuwe kalenderdag het gevolg is van
het toevoegen van een handmatige activiteit, dan kán het zo zijn dat er meer dan één
kalenderdag tussen de huidige activiteit en de toe te voegen activiteit bestaat. Indien
dat zo blijkt te zijn dan dienen de instructies in deze paragraaf te worden herhaald
voor iedere betreffende (kalender)dagovergang.
5.3. Algemene opmerkingen bij lezen en schrijven naar EF.Driver_Activity_Data
Bij lees- en schrijfacties (Read Binary en Update Binary) dient met de volgende punten
rekening te worden gehouden:
-
1. EF.Driver_Activity_Data kan records bevatten vanaf positie ‘00 14’H tot aan het eind
(Length_EF.Driver_Activity_Data). De eerste 20 bytes van EF.Driver_Activity_Data worden
in beslag genomen worden door twee 16-bits pointers en een 16-bytes veld voor het
chauffeurskaartnummer.
-
2. Wanneer er voor een toevoeging niet meer voldoende ruimte aan het eind van EF.Driver_Activity_Data
is, wordt eerst de resterende ruimte benut en daarna gaat het toevoegen verder vanaf
het begin van de EF.Driver_Activity_Data. Dit is dan vanaf positie ‘00 14’H.
-
3. De lengte van een te lezen of te schrijven record kan nooit langer zijn dan Length_EF.Driver_Activity_Data
– 20 (‘14’H).
-
4. De offset bij een Read Binary of Update Binary (Pointer_1) moet kleiner zijn dan Length_EF.Driver_Activity_Data.
Indien dit niet het geval is, moet de offset vervangen worden door de Pointer_1 –
Length_EF.Driver_Activity_Data + 20 (‘14’H).
-
5. Indien bij een Read Binary de offset (Pointer_1) + het verwachte aantal bytes in de
response (Length_1) groter is dan Length_EF.Driver_Activity_Data, dan moet de Read
Binary in tweeën gesplitst worden: 1 Read Binary tot aan het eind van EF.Driver_Activity_Data
en 1 Read Binary vanaf positie ‘00 14’H tot aan Pointer_1 + Length_1 – Length_EF.Driver_Activity_Data
+ 20 (‘14’H).
-
6. Indien bij een Update Binary de offset (Pointer_1) + het aantal weg te schrijven bytes
(Length_1) groter is dan Length_EF.Driver_Activity_Data, dan moet de Update Binary
in tweeën gesplitst worden: 1 Update Binary tot aan het eind van EF.Driver_Activity_Data
en 1 Update Binary vanaf positie ‘00 14’H tot aan Pointer_1 + Length_1 – Length_EF.Driver_Activity_Data
+ 20 (‘14’H).
-
7. Bij een Update Binary bestaat de mogelijkheid dat de oudste dagregistratie overschreven
wordt. Dit is het geval wanneer data voorbij PointerOldestDayRecord geschreven zou
worden. Hier moet dus bij iedere schrijfactie op getest worden.
Om te voorkomen dat voorbij PointerOldestDayRecord geschreven wordt, moet het oudste
DailyRecord weggehaald worden.
Dit wordt op de volgende manier gedaan:
-
1. PointerOldestDayRecord wijst naar het oudste DailyRecord. In dit DailyRecord staat
de lengte van dit record (DayRecordLength). Uit deze pointer en lengte kan de positie
van het volgende DailyRecord bepaald worden.
-
2. In dit volgende DailyRecord wordt de PreviousDayRecordLength op ‘00 00’H gezet.
-
3. PointerOldestDayRecord wordt op de positie van dit volgende DailyRecord gezet.
-
4. Wanneer er nog niet genoeg ruimte is voor de toevoeging, moeten de bovenstaande punten
herhaald worden.
5.4. Digitale handtekening
Om de integriteit van gegevens te waarborgen, worden digitale handtekeningen gebruikt.
Er worden twee soorten digitale handtekeningen onderscheiden:
-
1. De handtekening die door de chauffeurskaart over de gegevens van de kaartsessie gezet
wordt in de boordcomputer.
-
2. De handtekening die door de boordcomputer gezet wordt over de kaartsessie gegevens
op de chauffeurskaart.
In dit document gaat het om de tweede soort, waarbij de handtekeningen op de chauffeurskaart
worden opgeslagen. De handtekeningen die op de boordcomputer opgeslagen worden, worden
hier verder buiten beschouwing gelaten.
De digitale handtekening wordt berekend over het DriverCardNumber, de DayRecordDate
en een deel van het SessionRecord (zie 5.1.2) en wordt opgeslagen in het veld SessionSignature
in het betreffende SessionRecord. Daarbij worden de mogelijke vorige SignatureDateTime
en handtekening in dit SessionRecord overschreven. Het te ondertekenen DriverCardNumber
is een 16-karakter PrintableString zoals die aansluitend op het inloggen van de chauffeur
door de boordcomputer uit de eerste 16 bytes van het subject.serialNumber van het
authenticiteitcertificaat van de chauffeurskaart is gelezen. De kopie van het DriverCardNumber die is opgeslagen in bytes ‘00 04’H t/m ‘00 13’H van EF.Driver_Activity_Data
mag NIET worden gebruikt bij de berekening van de handtekening.
Om het verlies van gegevens zoveel mogelijk te voorkomen wanneer de chauffeurskaart
voortijdig uitgenomen wordt, wordt er na iedere toevoeging van een ActivityRecord (zie 5.1.3) een digitale handtekening berekend en opgeslagen.
Bij de berekening van de handtekening wordt van het laatst toegevoegde ActivityRecord
alleen de kop van 3 bytes meegenomen. De reden hiervoor is gelegen in de activiteiten
“Start werk” en “Start pauze”. De 6 respectievelijk 3 gegevensbytes die bij deze activiteitsoorten
horen worden te vaak bijgewerkt (voor het telkens herberekenen van handtekeningen)
en de laatste 3 gegevensbytes worden sowieso overschreven door de vervolgactiviteit.
De rijtijdteller van een “Start werk” activiteit wordt hiermee pas meegenomen in de
handtekening nadat een vervolgactiviteit wordt gestart.
Om een handtekening te kunnen berekenen, moet eerst de SignatureDateTime worden bijgewerkt
met de huidige datum en tijd volgens BCT-klok, dan moet een hashcode berekend worden.
Deze hashcode wordt dan gebruikt als input voor het berekenen van de handtekening.
De gegevens voor het berekenen van de hashcode moeten in de hieronder genoemde volgorde
staan:
1. DriverCardNumber
|
16 bytes ASCII
|
2. DayRecordDate
|
4 bytes BCD
|
3. SessionCreationDateTime
|
4 + 3 bytes BCD
|
4. SystemCardNumber
|
4½ + 2½ bytes BCD
|
5. Kenteken
|
6 bytes ASCII
|
6. CompanyCardNumber
|
6 + 2½ bytes BCD
|
7. Pnummer
|
3½ bytes BCD
|
8. ActivityRecords*)
|
variable
|
9. PointerLastActivityRecord
|
2 bytes INTEGER
|
10. PointerLastPWActivityRecord
|
2 bytes INTEGER
|
11. SignatureDateTime
|
4 + 3 bytes BCD
|
*) Van het laatste ActivityRecord wordt alleen de kop (3 bytes) meegenomen.
De berekening van de handtekening wordt volledig door de boordcomputer uitgevoerd
en gebeurt als volgt:
-
• Over de gegevens, als hierboven vermeld, wordt met behulp van de private sleutel voor
authenticiteit van de boordcomputer een handtekening gegenereerd volgens PKCS#1 v1.5
met SHA-256.
-
• De handtekening wordt opgeslagen in het SessionSignature veld van het huidige SessionRecord.
NB. Telkens bij het berekenen van de SHA-256 hash dient de boordcomputerlogica het eerste
en grootste deel van de berekening (de hash over de data vanaf het DriverCardNumber
t/m de ActivityRecords) uit te voeren, waarna het laatste deel van de hashberekening
(over de PointerLastActivitityRecord t/m de SignatureDateTime) door de systeemkaart
dient te worden berekend. Ook de PKCS#1 v1.5 handtekening dient door de systeemkaart
te worden berekend.
NB2. Met behulp van het certificaat behorende bij de private sleutel voor authenticiteit
van de boordcomputer (het boordcomputercertificaat) kan gecontroleerd worden of de
gegevens in een SessionRecord authentiek zijn. Behalve het boordcomputercertificaat
en het SessionRecord zelf, zijn voor zo’n validatie het DriverCardNumber en de DayRecordDate
benodigd. Die twee gegevens staan elders in EF.Driver_Activity_Data opgeslagen. Welk
boordcomputercertificaat voor een bepaalde SessionRecord-validatie moet worden gebruikt,
kan worden achterhaald door het SystemCardNumber in de SessionRecord-kop uit te lezen.
NB3. Indien bij het valideren van de SessionRecord-data de betreffende EF.BCT_Certificates
aanwezig is en het betreffende boordcomputercertificaat is daarin ook (nog) aanwezig,
kan de validatie direct worden uitgevoerd. Indien het betreffende boordcomputercertificaat
niet (meer) in EF.BCT_Certificates is opgeslagen of indien EF.BCT_Certificates niet
voorhanden is, dan kan het betreffende boordcomputercertificaat via de Kaartuitgever
worden verkregen.
7. Kaartsessie
Een kaartsessie is de periode tussen het ingeven van de chauffeurskaart en het wegschrijven
van de afsluitende gegevens op de chauffeurskaart door de boordcomputer. In Figuur
10 is het overzicht van een kaartsessie weergegeven.
De wijzigingen in de arbeids- rij- en rusttijden worden tijdens een kaartsessie op
de chauffeurskaart opgeslagen in ActivityRecords (zie Figuur 6 en paragrafen 5.2 en
0). Hieronder wordt aangegeven welke informatie op welk ogenblik opgeslagen wordt.
Voor voorbeelden van kaartsessies wordt verwezen naar Bijlage A.
Figuur 10: Overzicht kaartsessie
7.1. Begin van een kaartsessie
Het begin van een kaartsessie gaat als volgt:
-
1. De chauffeurskaart wordt in de boordcomputer ingebracht en er vindt een authenticatie
van de chauffeurskaart plaats. Zie hiervoor § 0. Dit ogenblik bepaalt het login-tijdstip
wat in stap 5 als activiteitrecord wordt toegevoegd.
-
2. Direct na het inloggen moet worden geverifieerd of in posities ‘00 04’H t/m ‘00 13’H
van de EF.Driver_Activity_Data het chauffeurskaartnummer nog steeds overeenstemt met
het chauffeurskaartnummer zoals dat in (de eerste 16 bytes van) het subject.serialNumber
van het authenticiteitcertificaat is opgeslagen. Indien het niet meer overeenstemt,
dienen de genoemde byteposities in EF.Driver_Activity_Data te worden bijgewerkt en
dient de gebruiker te worden gewaarschuwd.
Ook dient in deze stap de daadwerkelijke grootte van EF.Driver_Activity_Data te worden
vastgesteld. Zie hiervoor § 9.5.
-
3. Er wordt dan gecontroleerd of het certificaat van deze boordcomputer al op deze chauffeurskaart
staat en zo niet, dan wordt dit toegevoegd (zie 6 Gegevens op chauffeurskaart (EF.BCT_Certificates)).
In beide gevallen wordt dit certificaat als meest recente gemarkeerd. Eventueel andere,
reeds bestaande certificaatentries worden gemarkeerd als minder recente. Indien er
geen ruimte meer is vervalt de oudste entry.
-
4. Er wordt gecontroleerd of er op de boordcomputer nog een geblokkeerde sessie voor
deze kaart is (zie 7.4):
-
– Is er geen geblokkeerde sessie voor deze kaart op de boordcomputer of is de kaart
inmiddels in een andere boordcomputer gebruikt, dan wordt gecontroleerd of op de kaart
de vorige sessie correct afgesloten was.
Hiervoor moet de laatste activiteit in het huidige SessionRecord “Afsluiting”, “Nieuwe
eindtijd” of “Dagovergang” zijn. Is dit niet het geval, dan wordt de gebruiker er
op geattendeerd dat deze vorige sessie niet correct was afgesloten.
-
– Is de laatste activiteit in het laatste SessionRecord een “Afsluiting”, “Dagovergang”
of “Nieuwe eindtijd” en wijst de PointerLastPWActivityRecord van dat SessionRecord
naar een “Start pauze” activiteit, dan is er iets bijzonders aan de hand. Een arbeidsperiode
lijkt dan te eindigen met een pauze. In dit geval dient de boordcomputer de bestuurder
er extra op te attenderen dat er mogelijk een handmatige aanvulling / correctie benodigd
is die met stap 5 kan worden gedaan.
-
– Is er nog een geblokkeerde sessie voor deze kaart op de boordcomputer en is de kaart
tussentijds niet in een andere boordcomputer gebruikt, dan vervalt de blokkering en
wordt de sessie vervolgd.
-
5. Zijn er, tussen de laatst op de kaart geboekte “Start werk” of “Start pauze” activiteit
en het onthouden login-tijdstip, nog activiteiten toe te voegen, dan kan dat nu gebeuren
(zie vooral ook het tweede aandachtsstreepje van de vorige stap).
Bepaal hiertoe de start-datumtijd en de eventuele eind-datumtijd van die laatstgeboekte
“Start pauze” of “Start werk” activiteit, waarbij de eindtijd hetzij kan worden gelezen
uit de afsluitingsactiviteit die volgt op de “Start werk” / “Start pauze”, hetzij
kan worden berekend m.b.v. de tijdsduurteller van de “Start werk” / “Start pauze”
zelf.
In dat geval,
-
– Presenteer de laatstgeboekte “Start werk” / “Start pauze” inclusief diens uitgelezen
start- en eind-datumtijd.
-
– Dan kan er een “Start werk” of een “Start pauze” activiteit toegevoegd worden.
De standaard (start)datumtijd hiervoor is de eind-datumtijd van de laatste “Start
werk” of “Start pauze” activiteit; dit kan de gebruiker veranderen in een waarde tussen
minimaal de start-datumtijd van die laatste “Start werk” of “Start pauze” activiteit
en maximaal het login-tijdstip. De “handmatig”-bit wordt op ‘1’B gezet.
Een start die eerder is dan het einde van de vorige “Start werk” of “Start pauze”
activiteit, zal die eerdere activiteit geheel of gedeeltelijk veranderen.
Een start die gelijk is dan het einde van de vorige “Start werk” of “Start pauze”
activiteit, zal direct op die eerdere activiteit aansluiten.
Een start die later is dan het einde van de vorige “Start werk” of “Start pauze” activiteit,
zal een rustperiode inlassen.
Gebruik voor het toevoegen van deze handmatige activiteit de logica beschreven in
§ 0 en geef daarbij door of een kaartsessie al dan niet gecontinueerd mocht worden.
-
– Ook kan er voor gekozen worden om handmatig een “Nieuwe eindtijd” op te geven.
Ook daarvan kan de datumtijd ingesteld worden tussen minimaal de start-datumtijd van
de laatste activiteit en maximaal het login-tijdstip.
De “handmatig”-bit wordt op ‘1’B gezet.
Een nieuw einde dat gelijk is aan de start van de vorige “Start werk” of “Start pauze”
activiteit, zal die eerdere activiteit effectief verwijderen.
Een nieuw einde tussen de start en het (momenteel geldende) einde van de vorige “Start
werk” of “Start pauze” activiteit, zal die eerdere activiteit effectief inkorten.
Een nieuw einde later dan het (momenteel geldende) einde van de vorige activiteit,
zal die eerdere activiteit effectief verlengen.
Gebruik voor het toevoegen van deze handmatige activiteit de logica beschreven in
§ 0 en geef daarbij door of een kaartsessie al dan niet gecontinueerd mocht worden.
-
– Toevoegen kan meerdere keren uitgevoerd worden. De laatst (handmatig) toegevoegde
activiteit geldt dan telkens als de “vorige”.
-
– De mogelijkheid bestaat dat dit toevoegen over meerdere dagen gaat. In dat geval zal
de logica beschreven in § 0 de eventuele aanmaak van nieuwe DailyRecords en/of SessionRecords
verzorgen.
-
– Hoeft er niets meer toegevoegd te worden, dan kan met de volgende stap worden verder
gegaan.
-
6. Vervolgens wordt het login-tijdstip middels een “Login” activiteit toegevoegd (zie
5.2.1), waarna direct een “Start werk” (zie 5.2.4) zal worden toegevoegd. Beide ActivityRecords
zullen de handmatig bit op ‘0’B hebben staan.
ook nu zullen de toevoegingen gedaan worden conform de logica beschreven in § 0
Vanaf dit punt begint de reguliere vastlegging van activiteiten.
7.2. Tijdens een kaartsessie
Tijdens een kaartsessie zijn er twee activiteiten mogelijk: “Start pauze” en “Start
werk”. Voor het toevoegen van deze activiteiten, zie 5.2.1 respectievelijk 5.2.4.
“Start werk” moet regelmatig bijgewerkt worden met het aantal secondes dat er met
het voertuig gereden is (zie Noot 1 in § 5.1.3). “Start werk” en “Start pauze” moeten
regelmatig bijgewerkt worden met het aantal secondes dat de betreffende activiteit
duurt (zie Noot 2 in § 5.1.3).
7.3. Afsluiten van een kaartsessie
Bij het beeindigen van een kaartsessie dient de chauffeur de kaartsessie af te sluiten,
voordat hij de chauffeur zijn kaart uit de boordcomputer neemt. Zou hij de sessie
niet afsluiten wordt deze geblokkeerd.
Bij het afsluiten van een kaartsessie wordt een “Afsluiting” activiteit toegevoegd,
zie 5.2.5.
Direct nadat de “Afsluiting” activiteit is toegevoegd en nog voordat de chauffeur
zijn kaart uitneemt, dient de boordcomputer:
-
1. in EF.BCT_Certificates het DownloadLog controleren en vast te stellen of de laatste
download van EF.Driver_Activity_Data naar een boordcomputer al dan niet te lang geleden
is of lijkt. Indien dat zo blijkt te zijn, dan dient de boordcomputer de bestuurder
hierop te attenderen;
-
2. de chauffeur de gelegenheid te bieden om de volledige inhoud van EF.Driver_Activity_Data
naar het geheugen van de boordcomputer te downloaden. Indien de chauffeur hierop ingaat,
dan dient de boordcomputer:
-
a. Aan de chauffeur een waarschuwing te tonen dat de kaart (nog) niet mag worden uitgenomen;
-
b. De volledige inhoud van EF.Driver_Activity_Data te downloaden naar het geheugen van
de boordcomputer;
-
c. In EF.BCT_Certificates het DownloadLog bij te werken;
-
d. Aan de chauffeur te melden dat de kaart nu mag worden uitgenomen.
7.4. Niet afgesloten kaartsessie
Het is mogelijk dat de chauffeur zijn kaart uit de boordcomputer haalt zonder dat
hij de kaartsessie afgesloten heeft. In dat geval is er dus geen ActivityRecord aangemaakt
voor het afsluiten van de kaartsessie. De boordcomputer constateert dat de kaart is
uitgenomen zonder dat de sessie is afgesloten en blokkeert deze kaartsessie.
De op de boordcomputer geblokkeerde kaartsessie wordt beëindigd door:
-
• binnen 60 minuten dezelfde chauffeurskaart weer in te brengen in de boordcomputer.
Zijn er in de tussentijd activiteiten op de boordcomputer geregistreerd geweest, dan
worden die allereerst op de chauffeurskaart bijgewerkt.
-
• binnen 60 minuten dezelfde chauffeurskaart weer in te brengen en er blijkt dat de
kaart in de tussentijd in een andere boordcomputer heeft gezeten. Eventuele tussentijdse
activiteiten die op deze boordcomputer waren geregistreerd worden niet meer op de
kaart geplaatst.
-
• een andere boordcomputerkaart in te brengen, uitgezonderd een inspectiekaart.
-
• een time-out van 60 minuten.
De eerstvolgende keer dat een chauffeurskaart met een niet afgesloten kaartsessie
weer in een boordcomputer wordt ingebracht, krijgt de chauffeur een melding dat de
kaartsessie niet goed afgesloten was. De uitzondering hierop is het eerste punt hierboven,
waarbij de kaartsessie voortgezet wordt.
In alle gevallen wordt na het inloggen de chauffeur de mogelijkheid geboden voor het
handmatig toevoegen van activiteiten die hebben plaatsgevonden tussen de laatstgeboekte
“Start werk” of “Start pauze” activiteit en het login-tijdstip. Pas nadat dergelijke
handmatige boekingen op de kaart zijn bijgeschreven, wordt het Login-tijdstip vastgelegd
door het toevoegen van een “Login” ActivityRecord die aangeeft wanneer de kaart weer
in de boordcomputer ingebracht is (zie 5.2.1). Direct aansluitend wordt (met hetzelfde
tijdstempel) een “Start werk” activiteit toegevoegd.
7.5. Dagoverschrijdende kaartsessie
Het is mogelijk dat een kaartsessie actief is om 12 uur ’s nachts. Ook kan dat het
geval blijken te zijn tijdens het handmatig invoegen van activiteiten (de laatst geboekte
activiteit blijkt “Start werk” of “Start pauze” te zijn en de toe te voegen activiteit
blijkt te moeten starten in de kalenderdag na die van zijn voorganger). Omdat de activiteiten
per dag opgeslagen worden, moet de kaartsessie hier gesplitst worden.
Hiervoor wordt
-
1. Indien de huidige activiteit een (automatische) “Start werk” is, het aantal secondes
rijden bijgewerkt.
-
2. Een interne kopie gemaakt van de huidige activiteit (“Start werk” of “Start pauze”).
In die kopie wordt het tijdstipveld op 00:00:00 gezet en de handmatig bit dient te
reflecteren of deze dagovergang tijdens het handmatig bijwerken van de administratie
dan wel tijdens de normale operatie van de boordcomputer werd geconstateerd.
-
3. Een “Dagovergang” activiteit toegevoegd aan het huidige SessionRecord om 23:59:59
(zie 5.2.7). Het handmatig bit dient ook hierbij te reflecteren of deze dagovergang
tijdens het handmatig bijwerken van de administratie dan wel tijdens de normale operatie
van de boordcomputer werd geconstateerd.
-
4. De interne kopie van de voort te zetten activiteit toegevoegd op de eerstvolgende
kalenderdag. Omdat dit de eerste activiteit in die volgende kalenderdag betreft, worden
er eerst een nieuw DailyRecord en SessionRecord aangemaakt.
-
5. Indien de splitsing het gevolg van een handmatige toevoeging was:
-
a. wordt eerst gecontroleerd of die toevoeging wellicht nóg een of meer kalenderdagen
vooruit betreft en indien dat zo is, worden de bovenstaande stappen herhaald,
-
b. wordt pas daarna de opgegeven activiteit toegevoegd.
8. Functies
De commando-antwoord paren (zie hoofdstuk 9) vormen het laagste niveau van communicatie
met de boordcomputerkaarten.
Met behulp van één of meerdere commando’s kunnen functies benoemd worden die een logische
actie vertegenwoordigen, zoals het wijzigen of deblokkeren van een pincode.
Bij deze functies moeten ook de punten uit 5.3 (Algemene opmerkingen bij lezen en
schrijven) in acht worden genomen.
8.1. PIN wijzigen
Naam
Gebruik
|
ChangePIN
Boordcomputerkaarten
|
Input gegevens
|
Oude PIN || Nieuwe PIN
|
Resultaat
|
‘90 00’H OK
‘xx xx’H Foutcode van Change Reference Data, afhankelijk van de implementatie
|
Voor het wijzigen van een PIN moet de oude PIN bekend zijn, anders is dit niet mogelijk.
Voor de oude en nieuwe PIN wordt het PIN formaat 2 gebruikt. Dit is 8 bytes lang en
is als volgt opgebouwd:
C
|
N
|
P
|
P
|
P
|
P
|
P/F
|
P/F
|
P/F
|
P/F
|
P/F
|
P/F
|
P/F
|
P/F
|
F
|
F
|
Waarin:
Naam
|
Waarde
|
C
|
Controle veld
|
4 bits binair getal ‘0010’B
|
N
|
PIN lengte
|
4 bits binair getal tussen ‘0100’B en ‘1100’B
|
P
|
PIN cijfer
|
4 bits binair getal tussen ‘0000’B en ‘1001’B
|
P/F
|
PIN cijfer / Vulteken
|
Afhankelijk van PIN lengte
|
F
|
Vulteken
|
4 bits binair getal ‘1111’B
|
De PIN is dus maximaal 12 cijfers lang.
Het gebruikte commando is Change Reference Data, waarbij de PIN reference de waarde
‘01’H heeft en oude PIN || nieuwe PIN als data meegegeven wordt.
8.2. SM keyset wijzigen
Naam
|
ChangeSMKeySet
|
Gebruik
|
Systeemkaart
|
Input gegevens
|
Nieuwe Key Set
|
Resultaat
|
‘90 00’H OK
‘xx xx’H Foutcode van Put Data (SDO), afhankelijk van de implementatie
|
Op de systeemkaart mag deze functie alleen uitgevoerd worden onder beveiligde gegevensoverdracht
(zie Hoofdstuk 4).
Voor het wijzigen van een SM key set moet er een Secure Messaging kanaal bestaan en
daarmee moet de oude SM key set bekend zijn, anders is dit niet mogelijk.
Het gebruikte commando is Put Data, waarbij de nieuwe (symmetrische) key set als data
meegegeven wordt. Het volledige data veld heeft de vorm
‘70 2A BF 8A 03 26 A2 24 90 10’ || Kmac || ‘91 10’ || Kenc
waarbij Kmac en Kenc de 16 bytes sleutels zijn voor de MAC resp. de ENC.
8.3. PIN deblokkeren
Naam
|
DeblockPIN
|
Gebruik
|
Boordcomputerkaarten
|
Input gegevens
|
Geen
|
Resultaat
|
‘90 00’H OK
‘xx xx’H Foutcode van Reset Retry Counter, afhankelijk van de implementatie
|
Hierbij wordt de bestaande PIN gedeblokkeerd.
Het gebruikte commando is Reset Retry Counter, waarbij P1 de waarde ‘03’H heeft en
P2 (de PIN reference) de waarde ‘01’H heeft.
Voorafgaand aan dit commando moet een succesvol Verify commando uitgevoerd worden
met P1 = ‘00’H en P2 = ‘02’H (de PUK reference). Voor de PUK wordt PIN formaat 2 gebruikt
(zie onder 8.1).
8.4. PIN deblokkeren en wijzigen
Naam
|
DeblockAndChangePIN
|
Gebruik
|
Boordcomputerkaarten
|
Input gegevens
|
Nieuwe PIN
|
Resultaat
|
‘90 00’H OK
‘xx xx’H Foutcode van Reset Retry Counter, afhankelijk van de implementatie
|
Hierbij wordt de bestaande PIN gedeblokkeerd en gewijzigd in de Nieuwe PIN.
Het gebruikte commando is Reset Retry Counter, waarbij P1 de waarde ‘02’H heeft en
P2 (de PIN reference) de waarde ‘01’H heeft.
Voorafgaand aan dit commando moet een succesvol Verify commando uitgevoerd worden
met P1 = ‘00’H en P2 = ‘02’H (de PUK reference). Voor de PUK wordt PIN formaat 2 gebruikt
(zie onder 8.1).
8.5. Elektronische handtekening zetten met een chauffeurs- of inspectiekaart
Naam
|
SignDataLegally
|
Gebruik
|
Chauffeurskaart, Inspectiekaart
|
Input gegevens
|
Gegevens waarover handtekening berekend moet worden
|
Resultaat
|
Handtekening || ‘90 00’H OK
‘xx xx’H Foutcode van een van de gebruikte commando’s, afhankelijk van de implementatie
|
Deze functie wordt gebruikt voor het door een natuurlijke persoon zetten van een rechtsgeldige
elektronische handtekening met de sleutel-certificaatcombinatie PKI.CH.DS die uitsluitend
op chauffeurs- en inspectiekaarten bestaat.
Voor deze functie moet een aantal stappen doorlopen worden:
-
1. Selectie hash template en algoritme: alvorens de digitale handtekening berekend kan
worden, moet het hash template geselecteerd worden en het te gebruiken algoritme.
Dit wordt gedaan met het commando Manage Security Environment, met P1 de waarde ‘41’H
en P2 de waarde ‘AA’H. De data bij dit commando is ‘80 01 40’H (‘40’H om de algoritme
identifier voor SHA-256 aan te geven).
-
2. Selectie private key en algoritme: de private key van de BCT Handtekening moet geselecteerd
worden met het te gebruiken algoritme.
Dit wordt gedaan met het commando Manage Security Environment, met P1 de waarde ‘41’H
en P2 de waarde ‘B6’H. De data bij dit commando is ‘80 01 42 84 01 86’H (‘42’H om
“PKCS#1 v1.5 – SHA-256” aan te duiden en ‘86’H om het Security Data Object (SDO) van
PKI.CH.DS aan te duiden).
-
3. PIN valideren: de private key van de BCT Handtekening mag pas gebruikt worden nadat
de PIN gevalideerd is. Dit is nodig voor iedere keer dat deze key gebruikt wordt.
Dit wordt gedaan met het commando Verify, waarbij P2 (de PIN reference) de waarde
‘01’H heeft. Voor de PIN wordt PIN formaat 2 gebruikt (zie onder 8.1).
-
4. Berekenen van de intermediate hash (SHA256) over de input gegevens door de boordcomputerlogica.
Hierbij wordt het laatste gegevensblok niet gehashed, maar wordt de intermediate hash
en het aantal gehashte bits onthouden voor de volgende stap.
NB. Wanneer het totaal aan input gegevens uit maximaal 64 bytes bestaat, wordt er geen
intermediate hash berekend en worden alle inputgegevens in de volgende stap gebruikt.
-
5. Berekenen van de uiteindelijke hash (SHA256) door de boordcomputerkaart. Hiervoor
wordt het commando PSO Hash gebruikt. Hierbij worden de “intermediate hash value”,
het aantal gehashte bits en het laatste (of enige) blok inputdata van minimaal 1 en
maximaal 64 bytes opgenomen in het Dataveld van het commando. Bij een succesvol uitgevoerde
PSO HASH zal de uiteindelijke hash waarde in het geheugen van de boordcomputerkaart
(chip) achterblijven ten behoeve van de volgende en laatste stap.
-
6. Handtekening berekenen: hierbij wordt met de gekozen private key de handtekening berekend
over de in het chipgeheugen aanwezige hashwaarde en geeft de kaart die handtekening
terug aan de boordcomputerlogica.
Dit wordt gedaan met het commando PSO Compute Digital Signature. Le, het verwachte
aantal bytes in de response, moet daarbij op ‘00’H staan.
Zie ook PSO Hash en PSO Compute Digital Signature in Referentie [7].
Voor de vermelde SDO ID wordt verwezen naar de kaartstructuur documenten in Referenties
[9] en [12]. Omdat dit SDO een lokaal object is, moet de in de kaartstructuur documenten
gespecificeerde keyReference niet letterlijk worden overgenomen, maar met bit8 hoog
(dus ‘86’H in plaats van ‘06’H).
8.6. Elektronische handtekening zetten met een systeemkaart
Naam
|
SignDataSystem
|
Gebruik
|
Systeemkaart
|
Input gegevens
|
Gegevens waarover handtekening berekend moet worden
|
Resultaat
|
Handtekening || ‘90 00’H OK
‘xx xx’H Foutcode van een van de gebruikte commando’s, afhankelijk van de implementatie
|
Deze functie wordt gebruikt voor het door een boordcomputer zetten van een elektronische
handtekening met de sleutel-certificaatcombinatie PKI.CH.AUT van de systeemkaart.
Op de systeemkaart mag deze functie alleen uitgevoerd worden onder beveiligde gegevensoverdracht
(zie Hoofdstuk 4), gebruikmakend van de sleutelset SM.ICC.
Voor deze functie moet een aantal stappen doorlopen worden:
-
1. Selectie hash template en algoritme: alvorens de digitale handtekening berekend kan
worden, moet het hash template geselecteerd worden en het te gebruiken algoritme.
Dit wordt gedaan met het commando Manage Security Environment, met P1 de waarde ‘41’H
en P2 de waarde ‘AA’H. De data bij dit commando is ‘80 01 40’H (‘40’H om de algoritme
identifier voor SHA-256 aan te geven).
-
2. Selectie private key en algoritme: de private key van de BCT Authenticiteit moet geselecteerd
worden met het te gebruiken algoritme.
Dit wordt gedaan met het commando Manage Security Environment, met P1 de waarde ‘41’H
en P2 de waarde ‘B6’H. De data bij dit commando is ‘80 01 42 84 01 85’H (‘42’H om
“PKCS#1 v1.5 – SHA-256” aan te duiden en ‘85’H om het Security Data Object (SDO) van
PKI.CH.AUT aan te duiden).
-
3. Berekenen van de intermediate hash (SHA256) over de input gegevens door de boordcomputerlogica.
Hierbij wordt het laatste gegevensblok niet gehashed, maar wordt de intermediate hash
en het aantal gehashte bits onthouden voor de volgende stap.
NB. Wanneer het totaal aan input gegevens uit maximaal 64 bytes bestaat, wordt er geen
intermediate hash berekend en worden alle inputgegevens in de volgende stap gebruikt.
-
4. Berekenen van de uiteindelijke hash (SHA256) door de systeemkaart. Hiervoor wordt
het commando PSO Hash gebruikt. Hierbij worden de “intermediate hash value”, het aantal
gehashte bits en het laatste (of enige) blok inputdata van minimaal 1 en maximaal
64 bytes opgenomen in het Dataveld van het commando. Bij een succesvol uitgevoerde
PSO HASH zal de uiteindelijke hash waarde in het geheugen van de systeemkaart (chip)
achterblijven ten behoeve van de volgende en laatste stap.
-
5. Handtekening berekenen: hierbij wordt met de gekozen private key de handtekening berekend
over de in het chipgeheugen aanwezige hashwaarde en geeft de kaart die handtekening
terug aan de boordcomputerlogica.
Dit wordt gedaan met het commando PSO Compute Digital Signature. Le, het verwachte
aantal bytes in de response, moet daarbij op ‘00’H staan.
Zie ook PSO Hash en PSO Compute Digital Signature in Referentie [7]).
Voor de vermelde SDO ID wordt verwezen naar het kaartstructuur documenten in Referentie
[8]. Omdat dit SDO een lokaal object is, moet de in het kaartstructuur document gespecificeerde
keyReference niet letterlijk worden overgenomen, maar met bit8 hoog (dus ‘85’H in
plaats van ‘05’H).
Noot: Zie ook 5.4 (Digitale handtekening).
8.7. Authenticiteit handtekening zetten met een boordcomputerkaart
Naam
|
SignDataForAuthenticity
|
Gebruik
|
Chauffeurskaart, Ondernemerskaart, Keuringskaart, Inspectiekaart
|
Input gegevens
|
Gegevens waarover handtekening berekend moet worden
|
Resultaat
|
Handtekening || ‘90 00’H OK
‘xx xx’H Foutcode van een van de gebruikte commando’s, afhankelijk van de implementatie
|
Deze functie wordt gebruikt voor het door een boordcomputerkaarthouder zetten van
een elektronische handtekening met de sleutel-certificaatcombinatie PKI.CH.AUT die
op elke boordcomputerkaart bestaat.
NB. Gebruik van deze functie is niet voorzien binnen de regelgeving van Boordcomputer
Taxi, maar voor de volledigheid is deze paragraaf toch opgenomen.
Voor deze functie moet een aantal stappen doorlopen worden:
-
1. Selectie hash template en algoritme: alvorens de digitale handtekening berekend kan
worden, moet het hash template geselecteerd worden en het te gebruiken algoritme.
Dit wordt gedaan met het commando Manage Security Environment, met P1 de waarde ‘41’H
en P2 de waarde ‘AA’H. De data bij dit commando is ‘80 01 40’H (‘40’H om de algoritme
identifier voor SHA-256 aan te geven).
-
2. Selectie private key en algoritme: de private key van de BCT Authenticiteit moet geselecteerd
worden met het te gebruiken algoritme.
Dit wordt gedaan met het commando Manage Security Environment, met P1 de waarde ‘41’H
en P2 de waarde ‘B6’H. De data bij dit commando is ‘80 01 42 84 01 85’H (‘42’H om
“PKCS#1 v1.5 – SHA-256” aan te duiden en ‘85’H om het Security Data Object (SDO) van
PKI.CH.AUT aan te duiden).
-
3. PIN valideren: de private key van de BCT Authenticiteit mag pas gebruikt worden nadat
de PIN gevalideerd is. Een eenmaal uitgevoerde PIN validatie mag – zo lang de kaart
in de boordcomputer aanwezig blijft – worden “herbruikt” bij elke volgende keer dat
deze key gebruikt wordt.
Dit wordt gedaan met het commando Verify, waarbij P2 (de PIN reference) de waarde
‘01’H heeft. Voor de PIN wordt PIN formaat 2 gebruikt (zie onder 8.1).
-
4. Berekenen van de intermediate hash (SHA256) over de input gegevens door de boordcomputerlogica.
Hierbij wordt het laatste gegevensblok niet gehashed, maar wordt de intermediate hash
en het aantal gehashte bits onthouden voor de volgende stap.
NB. Wanneer het totaal aan input gegevens uit maximaal 64 bytes bestaat, wordt er geen
intermediate hash berekend en worden alle inputgegevens in de volgende stap gebruikt.
-
5. Berekenen van de uiteindelijke hash (SHA256) door de boordcomputerkaart. Hiervoor
wordt het commando PSO Hash gebruikt. Hierbij worden de “intermediate hash value”,
het aantal gehashte bits en het laatste (of enige) blok inputdata van minimaal 1 en
maximaal 64 bytes opgenomen in het Dataveld van het commando. Bij een succesvol uitgevoerde
PSO HASH zal de uiteindelijke hash waarde in het geheugen van de boordcomputerkaart
(chip) achterblijven ten behoeve van de volgende en laatste stap.
-
6. Handtekening berekenen: hierbij wordt met de gekozen private key de handtekening berekend
over de in het chipgeheugen aanwezige hashwaarde en geeft de kaart die handtekening
terug aan de boordcomputerlogica.
Dit wordt gedaan met het commando PSO Compute Digital Signature. Le, het verwachte
aantal bytes in de response, moet daarbij op ‘00’H staan.
Zie ook PSO Hash en PSO Compute Digital Signature in Referentie [7].
Voor de vermelde SDO ID wordt verwezen naar de kaartstructuur documenten in Referenties
[9] t/m [12]. Omdat dit SDO een lokaal object is, moet de in de kaartstructuur documenten
gespecificeerde keyReference niet letterlijk worden overgenomen, maar met bit8 hoog
(dus ‘85’H in plaats van ‘05’H).
8.8. Authenticeren boordcomputerkaart aan boordcomputer
Naam
|
AuthenticateCardToBCT
|
Gebruik
|
Boordcomputerkaarten
|
Input gegevens
|
Random waarde (16 bytes)
|
Resultaat
|
Handtekening || ‘90 00’H OK
‘xx xx’H Foutcode van een van de gebruikte commando’s, afhankelijk van de implementatie
|
Om te controleren of een boordcomputerkaart authentiek is, wordt er een Client/Server
authenticatie uitgevoerd (zie Referentie [7]). Hierbij wordt een boordcomputer challenge
ondertekend met behulp van de sleutel-certificaatcombinatie PKI.CH.AUT van de een
boordcomputerkaart. Deze functie is analoog aan SignDataForAuthenticity, maar wordt
hier uitsluitend voor authenticatiedoeleinden gebruikt.
Voor deze functie moeten een aantal stappen doorlopen worden:
-
1. Selectie private key en algoritme: alvorens de digitale handtekening berekend kan
worden, moet de private key van de BCT Authenticiteit geselecteerd worden en het te
gebruiken algoritme.
Dit wordt gedaan met het commando Manage Security Environment, met P1 de waarde ‘41’H
en P2 de waarde ‘A4’H. De data bij dit commando is ‘80 01 02 84 01 85’H (‘02’H om
“C/S RSA with DSI according to PKCS#1, parameter Digestinfo” aan te duiden en ‘85’H
om het Security Data Object (SDO) van PKI.CH.AUT aan te duiden).
-
2. PIN valideren: de private key van de BCT Authenticiteit mag pas gebruikt worden nadat
de PIN gevalideerd is. Dit is nodig voor de eerste keer dat deze key gebruikt wordt,
maar een eenmaal uitgevoerde PIN validatie mag – zo lang de kaart in de boordcomputer
aanwezig blijft – worden “herbruikt” bij elke volgende keer dat deze key gebruikt
wordt.
Dit wordt gedaan met het commando Verify waarbij P2 (de PIN reference) de waarde ‘01’H
heeft. Voor de PIN wordt PIN formaat 2 gebruikt (zie onder 8.1).
-
3. De boordcomputer stuurt een Internal Authenticate commando naar de boordcomputerkaart.
P1 P2 = ‘00 00’ en de data = 16 bytes random.
-
4. Het antwoord hiervan wordt teruggestuurd naar de boordcomputer en deze controleert
met behulp van de publieke key en een padvalidatie van het authenticiteitcertificaat
of de boordcomputerkaart authentiek is.
-
5. Ook de geldigheid van het authenticiteitcertificaat dient te worden gecontroleerd
middels minimaal een padvalidatie en een controle van de attributen validity.notBefore
en validity.notAfter.
-
6. Met behulp van het eerste karakter van het kaartnummer, zoals dat in het subject.serialNumber
of in de subject.title van het authenticiteitcertificaat is opgeslagen, kan de boordcomputer
het kaarttype en daarmee de gebruikerssoort (bestuurder, vervoerder, werkplaats, dan
wel toezichthouder) herkennen.
NB. De boordcomputerkaarten ondersteunen Windows/Kerberos smartcard logon. Ook deze
wijze van authenticeren is toegestaan, mits ook hier de geldigheid van het authenticiteitcertificaat
middels een padvalidatie wordt gevalideerd.
Voor de vermelde SDO ID wordt verwezen naar de kaartstructuur documenten in Referenties
[9] t/m [12]. Omdat dit SDO een lokaal object is, moet de in de kaartstructuur documenten
gespecificeerde keyReference niet letterlijk worden overgenomen, maar met bit8 hoog
(dus ‘85’H in plaats van ‘05’H).
8.9. Schrijf nieuw ActivityRecord
Naam
|
WriteNewActivityRecord
|
Gebruik
|
Chauffeurskaart
|
Input gegevens
|
ActivityRecord, ActivityDate
|
Resultaat
|
90h 00h OK
xxh xxh Foutcode van een van de gebruikte commando’s, afhankelijk van smartcard implementatie
|
Deze functie wordt gebruikt om een ActivityRecord toe te voegen in EF.Driver_Activity_Data.
De functie moet gevoed worden met de volgende argumenten met betrekking tot het toe
te voegen ActivityRecord:
-
1.
ActivityDate de datum (JJJJMMDD) waarop de activiteit startte c.q. gebeurtenis plaatsvond;
-
2.
ActivityTime het tijdstip (hhmmss) waarop de activiteit startte c.q. gebeurtenis plaatsvond;
-
3.
ActivityType: het type activiteit / gebeurtenis;
-
4.
ManualBit: de handmatig-bit die weergeeft of het tijdstempel (datum en tijd) handmatig dan
wel automatisch werd bepaald.
Deze functie moet, voorafgaand aan het daadwerkelijk toevoegen van het ActivityRecord,
aan de hand van meegestuurde argumenten, het laatst in EF.Driver_Activity_Data geboekte
ActivityRecord en de status van de boordcomputer bepalen of voor het ActivityRecord
al dan niet een nieuw DailyRecord en/of SessionRecord moet worden aangemaakt en op
welke geheugenpositie het nieuwe ActivityRecord moet worden toegevoegd. Stapsgewijs
is de daarvoor te volgen logica als volgt:
-
1. Selecteer EF.Driver_Activity_Data met het commando Select met P1P2 = ‘04 0C’H en data
= ‘E8 28 BD 08 0F A0 00 00 01 67 45 53 49 47 4E’H, gevolgd door het commando Select
met P1P2 = ‘02 0C’H en data = ‘44 01’H.
-
2. Lees de PointerLastDayRecord met het commando Read Binary, waarbij de offset 2 is en het verwachte aantal bytes
in de response 2.
Indien PointerLastDayRecord gelijk aan ‘00 00’H is, dan bestaat er (nog) geen enkel DailyRecord:
Indien PointerLastDayRecord niet gelijk aan ‘00 00’H is:
-
a. Lees de DayRecordLength met het commando Read Binary, waarbij de offset PointerLastDayRecord is en het verwachte aantal bytes in de response 2.
-
b. Lees de DayRecordDate met het commando Read Binary, waarbij de offset PointerLastDayRecord + 6 is en het verwachte aantal bytes in de response 4.
Indien DayRecordDate groter is dan ActivityDate,
dan betreft dit een foutsituatie en stopt verdere verwerking.
Indien DayRecordDate kleiner is dan ActivityDate,
dan ontbreekt de gewenste DailyRecord
(hou hier ook rekening met Dagovergangen zoals beschreven in § 5.2.7 en § 7.5):
Indien DayRecordDate gelijk is aan ActivityDate:
-
a. Lees de PointerLastSessionRecord met het commando Read Binary, waarbij de offset PointerLastDayRecord + 2 is en het verwachte aantal bytes in de response 2.
Indien de PointerLastSessionRecord gelijk aan ‘00 00’H is,
dan bevat het DailyRecord (nog) geen enkel SessionRecord:
Indien de PointerLastSessionRecord niet gelijk aan ‘00 00’H is:
-
i. Lees de PointerLastActivityRecord met het commando Read_Binary, waarbij de offset PointerLastSessionRecord is en het verwachte aantal bytes in de response 2.
Indien de PointerLastActivityRecord gelijk aan ‘00 00’H is,
dan wordt nu het eerste ActivityRecord aan het SessionRecord toegevoegd: zet de NewActivityPointer dus op PointerLastSessionRecord + Length(SessionRecordHeader).
Indien de PointerLastActivityRecord niet gelijk aan ‘00 00’H is,
dan bestaat er een eerder ActivityRecord:
-
a. Lees de LastActivityRecordHeader met het commando Read_Binary, waarbij de offset PointerLastActivityRecord is en het verwachte aantal bytes in de response 3.
-
b. Bepaal uit de eerste 5 bits van de LastActivityRecordHeader de LastActivityType.
Indien de LastActivityType gelijk is aan “Afsluiting” of “Nieuwe eindtijd”,
dan moet er een nieuwe sessie worden geboekt:
Indien de LastActivityType gelijk is aan “Login”, “Start werk” of “Start pauze”, maar de boordcomputer heeft
geen kaartsessie meer actief of geblokkeerd,
dan moet er ook een nieuwe sessie worden geboekt:
Indien de LastActivityType gelijk is aan “Start werk”,
Werk dan diens Rijtijdteller voor de laatste maal bij: voer een Update Binary commando
uit, waarbij de offset PointerLastActivityRecord + 3 is en de data de door de boordcomputer bijgehouden rijtijdteller; reset die laatste
ook direct naar nul (0).
Zet NewActivityPointer = PointerLastActivityRecord + 6
Indien de LastActivityType NIET gelijk is aan “Start werk”,
Zet NewActivityPointer = PointerLastActivityRecord + 3
NB1. NewActivityPointer, LastActivityRecordHeader en NewActivityLength maken géén onderdeel
van de structuur uit, maar zijn tijdelijke waardes in het geheugen van de boordcomputer.
NB2. Indien het LastActivityRecord een “(Start) werk” of “(Start) pauze” betreft worden
met het bovenstaande algoritme de laatste 3 bytes (waarin de tijdsduur van de activiteit
tijdelijk werd bijgehouden) overschreven door het nieuw toe te voegen ActivityRecord.
Voeg nu het nieuwe ActivityRecord toe in het in het huidige SessionRecord:
-
1. Bepaal eerst aan de hand van de ActivityType de lengte van het nieuwe ActivityRecord:
-
a. Indien “(Start) werk”, dan NewActivityLength = 9;
-
b. Indien “(Start) pauze”, dan NewActivityLength = 6;
-
c. Indien anders, dan NewActivityLength = 3;
-
2. Bepaal dan aan de hand van NewActivityPointer + NewActivityLength of er nog voldoende vrije ruimte resteert in EF.Driver_Activity_Data en ruim zo nodig
een of meer van de oudste DailyRecords op (zie ook 5.3).
-
3. Voer een Update Binary commando uit, waarbij de offset PointerLastSessionRecord is en de data NewActivityPointer (hiermee wordt PointerLastActivityRecord bijgewerkt).
-
4. Voer een Update Binary commando uit, waarbij de offset NewActivityPointer is en de data bestaat uit 3 bytes:
-
a. 5 bits ActivityType: het als argument gegeven type activiteit / gebeurtenis;
-
b. 1 bit ManualBit: de als argument gegeven handmatig-bit;
-
c. 1 bit RijdenBit: de bit die aangeeft of de auto NU rijdt (‘1’B) of stilstaat (‘0’B);
-
d. 17 bits ActivityTime: het als argument gegeven (start)tijdstip.
-
5. Indien de nieuwe activiteit een “(Start) werk” of “(Start) pauze” betreft:
-
a. Voer een Update Binary commando uit, waarbij de offset PointerLastSessionRecord + 2 is en de data NewActivityPointer (hiermee wordt PointerLastPWActivityRecord bijgewerkt);
-
b. Voer een Update Binary commando uit, waarbij de offset NewActivityPointer + 3 is en de data bestaat uit 3 bytes gelijk aan ‘00 00 00’H;
-
c. Reset op de boordcomputer de tijdsduurteller naar nul (0) seconden;
-
d. Indien de nieuwe activiteit een “(Start) werk” betreft:
-
i. Voer een Update Binary commando uit, waarbij de offset NewActivityPointer + 6 is en de data bestaat uit 3 bytes gelijk aan ‘00 00 00’H;
-
ii. Reset op de boordcomputer de rijtijdteller naar nul (0) seconden.
-
6. Voer een Update Binary commando uit met offset is PointerLastDayRecord en als data DayRecordLength + NewActivityLength (hiermee wordt DayRecordLength bijgewerkt).
Voer tot slot nog de procedure uit voor het door de boordcomputer ondertekenen van
het aangepaste SessionRecord, zoals beschreven in § 5.4.
8.10. Schrijf nieuw SessionRecord
Naam
|
WriteNewSessionRecord
|
Gebruik
|
Chauffeurskaart
|
Input gegevens
|
StartSessionData
|
Resultaat
|
‘90 00’H OK
‘xx xx’H Foutcode van een van de gebruikte commando’s, afhankelijk van de implementatie
|
Deze functie wordt gebruikt om een nieuw leeg SessionRecord aan het huidige DailyRecord
toe te voegen. Deze functie wordt altijd aangeroepen vanuit de functie voor het toevoegen
van een ActivityRecord (zie 0)
Hiervoor moeten de volgende stappen doorlopen worden:
-
1. Selecteer EF.Driver_Activity_Data met het commando Select met P1P2 = ‘04 0C’H en data
= ‘E8 28 BD 08 0F A0 00 00 01 67 45 53 49 47 4E’H, gevolgd door het commando Select
met P1P2 = ‘02 0C’H en data = ‘44 01’H.
-
2. Lees de PointerLastDayRecord met het commando Read Binary, waarbij de offset 2 is
en het verwachte aantal bytes in de response 2. Dit levert de pointer voor het meest
recente DailyRecord (Pointer_1).
-
3. Lees in deze DailyRecord de DayRecordLength met Read Binary, de offset is Pointer_1
en het verwachte aantal bytes in de response is 2. Dit levert de lengte van dit DailyRecord
(Length_1). Daarmee wordt de pointer waar het SessionRecord weggeschreven kan worden:
Pointer_2 = Pointer_1 + Length_1.
-
4. Maak een nieuw SessionRecord (alleen de kop) aan met
-
– PointerLastActivityRecord = ‘00 00’H (0).
-
– PointerLastPWActivityRecord = ‘00 00’H (0).
-
– SignatureDateTime = ‘00000000 000000’H
-
– SessionSignature = 256 willekeurige bytes.
-
– SessionCreationDateTime = de huidige datum en tijd volgens de BCT klok in BCD en geformatteerd
als ‘JJJJMMDDhhmmss’H
-
– SystemCardNumber, Kenteken, CompanyCardNumber en Pnummer zoals die in de boordcomputer
bekend zijn.
Voer een Update Binary commando uit, waarbij de offset Pointer_2 is en de data de
weg te schrijven SessionRecord kop.
-
5. Verhoog DayRecordLength door een Update Binary commando met offset is Pointer_1 en
als data Length_1 + 299.
-
6. Wijzig de PointerLastSessionRecord door een Update Binary commando, waarbij de offset
Pointer_1 + 2 is en de data Pointer_2.
Noot: Zie 5.3, aangezien de mogelijkheid bestaat dat de te schrijven data niet aan het
eind van EF.Driver_Activity_Data past.
8.11. Schrijf nieuw DailyRecord
Naam
|
WriteNewDailyRecord
|
Gebruik
|
Chauffeurskaart
|
Input gegevens
|
Datum (BCD)
|
Resultaat
|
‘90 00’H OK
‘xx xx’H Foutcode van een van de gebruikte commando’s, afhankelijk van de implementatie
|
Deze functie wordt gebruikt om een nieuw leeg DailyRecord toe te voegen. Dit wordt
gedaan voor de eerste registratie van een dag. Dit nieuwe DailyRecord bevat nog geen
SessionRecords.
Hiervoor moeten de volgende stappen doorlopen worden:
-
1. Selecteer EF.Driver_Activity_Data met het commando Select met P1P2 = ‘04 0C’H en data
= ‘E8 28 BD 08 0F A0 00 00 01 67 45 53 49 47 4E’H, gevolgd door het commando Select
met P1P2 = ‘02 0C’H en data = ‘44 01’H.
-
2. Lees de PointerLastDayRecord met het commando Read Binary, waarbij de offset 2 is
en het verwachte aantal bytes in de response 2. Dit levert de pointer voor de meest
recente DailyRecord (Pointer_1).
-
3. Lees in deze DailyRecord de DayRecordLength met Read Binary, offset is Pointer_1 en
het verwachte aantal bytes in de response is 2. Dit levert de lengte van het DailyRecord
(Length_1).
Daarmee is de pointer bekend waar de nieuwe DailyRecord weggeschreven kan worden:
Pointer_2 = Pointer_1 + Length_1.
-
4. Maak een nieuwe DailyRecord kop aan met
-
– DayRecordLength = ‘00 0A’H (10)
-
– PointerLastSessionRecord = ‘00 00’H (0)
-
– PreviousDayRecordLength = Length_1
-
– DayRecordDate = datum in BCD formaat.
en voer een Update Binary commando uit, waarbij de offset Pointer_2 is en de data
de weg te schrijven DailyRecord kop.
-
5. Verzet de PointerLastDayRecord naar het nieuwe DailyRecord met een Update Binary,
waarbij de offset 2 is en de data Pointer_2 is.
Noot: Zie 5.3, aangezien de mogelijkheid bestaat dat de te schrijven data niet aan het
eind van EF.Driver_Activity_Data past.
8.12. Selecteer laatste (nieuwste) DailyRecord
Naam
|
SelectLastDailyRecord
|
Gebruik
|
Chauffeurskaart
|
Input gegevens
|
Geen
|
Resultaat
|
DailyRecordPointer || ‘90 00’H OK
‘xx xx’H Foutcode van een van de gebruikte commando’s, afhankelijk van de implementatie
|
Hiervoor moeten de volgende stappen doorlopen worden:
-
1. Indien EF.Driver_Activity_Data nog niet geselecteerd is, selecteer EF.Driver_Activity_Data
met het commando Select met P1P2 = ‘04 0C’H en data = ‘E8 28 BD 08 0F A0 00 00 01
67 45 53 49 47 4E’H, gevolgd door het commando Select met P1P2 = ‘02 0C’H en data
= ‘44 01’H.
-
2. Lees de PointerLastDayRecord met het commando Read Binary, waarbij de offset 2 is
en het verwachte aantal bytes in de response 2. Dit levert de pointer voor de meest
recente DailyRecord (DailyRecordPointer).
8.13. Selecteer oudste (eerste) DailyRecord
Naam
|
SelectOldestDailyRecord
|
Gebruik
|
Chauffeurskaart
|
Input gegevens
|
Geen
|
Resultaat
|
DailyRecordPointer || ‘90 00’H OK
‘xx xx’H Foutcode van een van de gebruikte commando’s, afhankelijk van de implementatie
|
Hiervoor moeten de volgende stappen doorlopen worden:
-
1. Indien EF.Driver_Activity_Data nog niet geselecteerd is, selecteer EF.Driver_Activity_Data
met het commando Select met P1P2 = ‘04 0C’H en data = ‘E8 28 BD 08 0F A0 00 00 01
67 45 53 49 47 4E’H, gevolgd door het commando Select met P1P2 = ‘02 0C’H en data
= ‘44 01’H.
-
2. Lees de PointerOldestDayRecord met het commando Read Binary, waarbij de offset 0 is
en het verwachte aantal bytes in de response 2. Dit levert de pointer voor de oudst
bekende DailyRecord (DailyRecordPointer).
8.14. Selecteer vorige DailyRecord
Naam
|
SelectPreviousDailyRecord
|
Gebruik
|
Chauffeurskaart
|
Input gegevens
|
CurrentDailyRecordPointer (bereik ‘00 14’H t/m (Length_EF.Driver_Activitiy_Data –
1))
PointerOldestDayRecord
|
Resultaat
|
DailyRecordPointer || ‘90 00’H OK
‘xx xx’H Foutcode van een van de gebruikte commando’s, afhankelijk van de implementatie
|
Hiervoor moeten de volgende stappen doorlopen worden:
-
1. Indien EF.Driver_Activity_Data nog niet geselecteerd is, selecteer EF.Driver_Activity_Data
met het commando Select met P1P2 = ‘04 0C’H en data = ‘E8 28 BD 08 0F A0 00 00 01
67 45 53 49 47 4E’H, gevolgd door het commando Select met P1P2 = ‘02 0C’H en data
= ‘44 01’H.
-
2. Indien PointerOldestDayRecord niet was meegegeven als inputgegeven, lees dan PointerOldestDayRecord
met het commando Read Binary met offset = 0 en het verwachte aantal bytes in de respons
2.
-
3. Als CurrentDailyRecordPointer gelijk is aan PointerOldestDayRecord, dan is de geselecteerde
DailyRecord de eerste (oudste) en is er geen vorige DailyRecord aanwezig. Breek dan
deze functie af.
-
4. Zet Pointer_1 = CurrentDailyRecordPointer + 4 om de pointer naar PreviousDayRecordLength
te verkrijgen.
-
5. Als Pointer_1 >= Length_EF.Driver_Activity_Data herbereken dan de positie met de formule:
Pointer_1 = (Pointer_1 modulo Length_EF.Driver_Activity_Data) + ‘00 14’H (20)
-
6. Als nu Pointer_1 precies gelijk is aan (Length_EF.Driver_Activity_Data – 1), dan staat
de MSB van PreviousDayRecordLength in de laatste byte van EF.Driver_Activity_Data
en de LSB op positie ‘00 14’H (20). Voer dan twee keer het commando Read Binary uit
met het verwachte aantal bytes in de response gelijk aan 1; één keer met offset =
(Length_EF.Driver_Activity_Data – 1) voor Length_1_MSB en één keer met offset = 20
(‘00 14’H) voor Length_1_LSB. Bereken dan PreviousDayRecordLength = 256 x Length_1_MSB
+ Length_1_LSB.
-
7. Als ‘00 14’H <= Pointer_1 < (Length_EF.Driver_Activity_Data – 1) is, dan kan PreviousDayRecordLength
in één keer worden uitgelezen met het commando Read Binary met offset = Pointer_1
en het verwachte aantal bytes in de response 2.
-
8. Als PreviousDayRecordLength gelijk is aan ‘00 00’H, dan is er geen vorig DailyRecord
en dan moet de functie hier worden afgebroken.
-
9. Bereken nu voorlopig Pointer_2 = CurrentDailyRecordPointer – PreviousDayRecordLength.
-
10. Indien Pointer_2 kleiner is dan ‘00 14’H (20), voer dan nog de volgende correctie
uit:
Pointer_2 = Length_EF.Driver_Activity_Data – (20 – Pointer_2).
-
11. Geef nu de gevraagde DailyRecordPointer = Pointer_2 terug.
8.15. Selecteer volgende DailyRecord
Naam
|
SelectNextDailyRecord
|
Gebruik
|
Chauffeurskaart
|
Input gegevens
|
CurrentDailyRecordPointer (bereik ‘00 14’H t/m (Length_EF.Driver_Activitiy_Data –
1))
PointerLastDayRecord
|
Resultaat
|
DailyRecordPointer || ‘90 00’H OK
‘xx xx’H Foutcode van een van de gebruikte commando’s, afhankelijk van de implementatie
|
Hiervoor moeten de volgende stappen doorlopen worden:
-
1. Indien EF.Driver_Activity_Data nog niet geselecteerd is, selecteer EF.Driver_Activity_Data
met het commando Select met P1P2 = ‘04 0C’H en data = ‘E8 28 BD 08 0F A0 00 00 01
67 45 53 49 47 4E’H, gevolgd door het commando Select met P1P2 = ‘02 0C’H en data
= ‘44 01’H.
-
2. Indien PointerLastDayRecord niet was meegegeven als inputgegeven, lees dan PointerLastDayRecord
met het commando Read Binary met offset = 2 en het verwachte aantal bytes in de respons
2.
-
3. Als CurrentDailyRecordPointer gelijk is aan PointerLastDayRecord, dan is de geselecteerde
DailyRecord de laatste (meest recente) en is er geen volgende DailyRecord aanwezig.
Breek dan deze functie af.
-
4. Zet Pointer_1 = CurrentDailyRecordPointer om de pointer naar DayRecordLength te verkrijgen.
-
5. Als Pointer_1 precies gelijk is aan (Length_EF.Driver_Activity_Data – 1), dan staat
de MSB van DayRecordLength in de laatste byte van EF.Driver_Activity_Data en de LSB
op positie ‘00 14’H (20). Voer dan twee keer het commando Read Binary uit met het
verwachte aantal bytes in de response gelijk aan 1; één keer met offset = (Length_EF.Driver_Activity_Data
– 1) voor Length_1_MSB en één keer met offset = 20 (‘00 14’H) voor Length_1_LSB. Bereken
dan DayRecordLength = 256 x Length_1_MSB + Length_1_LSB.
-
6. Als ‘00 14’H <= Pointer_1 < (Length_EF.Driver_Activity_Data – 1) is, dan kan DayRecordLength
in één keer worden uitgelezen met het commando Read Binary met offset = Pointer_1
en het verwachte aantal bytes in de response 2.
-
7. Bereken nu voorlopig Pointer_2 = CurrentDailyRecordPointer + DayRecordLength.
-
8. Als Pointer_2 >= Length_EF.Driver_Activity_Data herbereken dan de positie met de formule:
Pointer_2 = (Pointer_2 modulo Length_EF.Driver_Activity_Data) + ‘00 14’H (20)
-
9. Geef nu de gevraagde DailyRecordPointer = Pointer_2 terug.
8.16. Lees huidige / geselecteerde DailyRecord
Naam
|
ReadSelectedDailyRecord
|
Gebruik
|
Chauffeurskaart
|
Input gegevens
|
CurrentDailyRecordPointer (bereik ‘00 14’H t/m (Length_EF.Driver_Activitiy_Data –
1))
|
Resultaat
|
Data || ‘90 00’H OK
‘xx xx’H Foutcode van een van de gebruikte commando’s, afhankelijk van de implementatie
|
Hiervoor moeten de volgende stappen doorlopen worden:
-
1. Indien EF.Driver_Activity_Data nog niet geselecteerd is, selecteer EF.Driver_Activity_Data
met het commando Select met P1P2 = ‘04 0C’H en data = ‘E8 28 BD 08 0F A0 00 00 01
67 45 53 49 47 4E’H, gevolgd door het commando Select met P1P2 = ‘02 0C’H en data
= ‘44 01’H.
-
2. Zet Pointer_1 = CurrentDailyRecordPointer om de pointer naar DayRecordLength te verkrijgen.
-
3. Als Pointer_1 precies gelijk is aan (Length_EF.Driver_Activity_Data – 1), dan staat
de MSB van DayRecordLength in de laatste byte van EF.Driver_Activity_Data en de LSB
op positie ‘00 14’H (20). Voer dan twee keer het commando Read Binary uit met het
verwachte aantal bytes in de response gelijk aan 1; één keer met offset = (Length_EF.Driver_Activity_Data
– 1) voor Length_1_MSB en één keer met offset = 20 (‘00 14’H) voor Length_1_LSB. Bereken
dan DayRecordLength = 256 x Length_1_MSB + Length_1_LSB.
-
4. Als ‘00 14’H <= Pointer_1 < (Length_EF.Driver_Activity_Data – 1) is, dan kan DayRecordLength
in één keer worden uitgelezen met het commando Read Binary met offset = Pointer_1
en het verwachte aantal bytes in de response 2.
-
5. Onthou de DayRecordLength nu voorlopig als Length_1.
-
6. Voer Read Binary commando’s uit tot Length_1 bytes gelezen zijn. Per Read Binary kan
een maximaal aantal bytes gelezen worden. Dit maximum is van een aantal factoren afhankelijk
(zie referentie [7]) en wordt hier max_read genoemd. De eerste Read Binary heeft als
offset Pointer_1 en het verwachte aantal bytes ‘00’H (in het geval dat Length_1 <
max_read, dan wordt het verwachte aantal bytes Length_1). Voor iedere volgende Read
Binary wordt de offset met max_read verhoogd. Het verwachte aantal bytes in de response
is ‘00’H, behalve bij de laatste Read Binary, daar is het Length_1 modulo max_read.
NB. Voorafgaand aan elke Read Binary moet worden gecontroleerd of de te lezen bytes
verder zouden doorlopen dan EF.Driver_Activity_Data groot is. In zo’n geval dient
de betreffende Read Binary in twee slagen te worden uitgevoerd:
-
a. De eerste keer met een ongewijzigde offset en een aangepast verwacht aantal_bytes
(aantal_bytes_a), zijnde (Length_EF.DriverActivity_Data – offset_a);
-
b. De tweede keer met een gecorrigeerde offset gelijk aan 20 (‘00 14’H) en het restant
van het verwachte aantal_bytes, zijnde aantal_bytes_b = aantal_bytes – aantal_bytes_a.
-
c. Hierna kan vanaf offset (‘00 14’H + aantal_bytes_b) worden vervolgd met de eerstvolgende
reguliere Read Binary.
8.17. Controleer EF.Driver_Activity_Data structuur
Naam
|
CheckEFDriverActivityStructure
|
Gebruik
|
Chauffeurskaart
|
Input gegevens
|
Geen
|
Resultaat
|
00 OK
01 Invalid Pointer Value
02 Wrong Length
03 Length Not Matching
04 Record Not Closed
05 Invalid PW Pointer
06 DayRecordLength Wrong
07 DriverCardNumber was overwritten
|
Hiervoor moeten de volgende stappen doorlopen worden:
-
1. Selecteer EF.Driver_Activity_Data met het commando Select met P1P2 = ‘04 0C’H en data
= ‘E8 28 BD 08 0F A0 00 00 01 67 45 53 49 47 4E’H, gevolgd door het commando Select
met P1P2 = ‘02 0C’H en data = ‘44 01’H.
-
2. Lees PointerOldestDayRecord en PointerLastDayRecord.
-
3. Controleer:
20 (‘00 14’H) <= PointerOldestDayRecord < Length_EF.Driver_Activity_Data of
PointerOldestDayRecord == 0.
Wanneer dit niet het geval is, geef dan “Invalid Pointer Value” terug.
-
4. Controleer:
20 (‘00 14’H) <= PointerLastDayRecord < Length_EF.Driver_Activity_Data of
PointerLastDayRecord == 0.
Wanneer dit niet het geval is, geef dan “Invalid Pointer Value” terug.
-
5. Controleer of DriverCardNumber gelijk is aan de eerste 20 bytes (karakters) van het
subject.SerialNumber van het authenticiteitcertificaat.
Wanneer dit niet het geval is, geef dan “DriverCardNumber was overwritten” terug (en
herstel de fout).
-
6. Controleer de DailyRecord structuur (voorwaarts):
-
a. Ga met de PointerOldestDayRecord naar de oudste DailyRecord.
-
b. Controleer of PreviousDayRecordLength = ‘00 00’H.
Wanneer dit niet het geval is, geef dan “Wrong Length” terug.
-
c. Bepaal mbv de DayRecordLength de positie van het volgende DailyRecord.
-
d. Controleer of de PreviousDayRecordLength in dit record gelijk is aan de DayRecordLength
van het vorige record.
Wanneer dit niet het geval is, geef dan “Length Not Matching” terug.
-
e. Herhaal de vorige 2 punten totdat
-
– het beginpunt van een record gelijk is aan PointerLastDayRecord, of
-
– de referenties DayRecordLength/PreviousDayRecordLength niet meer kloppen. Beschouw
dan het DailyRecord waar dit nog wel correct was als laatste record. Pas in dit geval
ook de PointerLastDayRecord aan.
-
7. Controleer de DailyRecord structuur (terugwaarts):
-
a. Ga met de PointerLastDayRecord naar de laatste DailyRecord.
-
b. Bepaal mbv de PreviousDayRecordLength de positie van het vorige DailyRecord.
-
c. Controleer of de DayRecordLength in dit record gelijk is aan de PreviousDayRecordLength
van het volgende record.
Wanneer dit niet het geval is, geef dan “Length Not Matching” terug.
-
d. Herhaal de vorige 2 punten totdat
-
– het beginpunt van een record gelijk is aan PointerOldestDayRecord, of
-
– de referenties DayRecordLength/PreviousDayRecordLength niet meer kloppen.
In het eerste geval moet de PreviousDayRecordLength = ‘00 00’H. Wanneer dit niet het
geval is, geef dan “Wrong Length” terug.
Beschouw in het tweede geval het DailyRecord waar dit nog wel correct was als oudste
record. Pas in dat geval ook PointerOldestDayRecord en PreviousDayRecordLength aan.
-
8. Controleer de laatste DailyRecord:
-
a. Ga met de PointerLastDayRecord naar de laatste DailyRecord.
-
b. Ga naar het eerste SessionRecord in het DailyRecord (PointerLastDayRecord + 10).
-
c. Controleer of dit SessionRecord het laatste is door de beginpositie hiervan te vergelijken
met de PointerLastSessionRecord.
-
d. Is dit niet het laatste SessionRecord, controleer dan met PointerLastActivityRecord
of de laatste activiteit een “Afsluiting” of een “Dagovergang” is. Is dit niet het
geval, geef dan ”Record Not Closed” terug.
Ga met behulp van PointerLastActivityRecord + de lengte van de laatste activiteit
naar het volgende SessionRecord en herhaal het vorige punt.
-
e. Controleer in het laatste SessionRecord of de PointerLastPWActivityRecord verwijst
naar een “Start pauze” of “Start werk” activiteit.
Is dit niet het geval, geef dan een “Invalid PW Pointer” terug.
-
f. Controleer of de lengte van alle SessionRecords in dit DailyRecord samen gelijk is
aan de DayRecordLength – 10.
Is dit niet het geval, geef dan “DayRecordLength Wrong” terug.
-
9. Bij alle controles en leesacties moet rekening gehouden worden met de lengte van EF.Driver_Activity_Data.
8.18. Controleren op opgeslagen boordcomputercertificaat
Naam
|
IsCertificatePresent
|
Gebruik
|
Chauffeurskaart
|
Input gegevens
|
Systeemkaartnummer
|
Resultaat
|
Recent||‘90 00’H Certificaat aanwezig met ranking Recent (‘01’H-‘03’H)
‘6A 82’H Certificaat niet aanwezig op chauffeurskaart
|
In deze functie wordt gecontroleerd of het certificaat behorende bij het systeemkaartnummer
al opgeslagen is in EF.BCT_Certificates.
Voor deze functie moeten de volgende stappen doorlopen worden:
-
1. Selecteer EF.BCT_Certificates met het commando Select met P1P2 = ‘04 0C’H en data
= ‘E8 28 BD 08 0F A0 00 00 01 67 45 53 49 47 4E’H, gevolgd door het commando Select
met P1P2 = ‘02 0C’H en data = ‘44 02’H.
-
2. Lees Index_1 t/m Index_3 met het commando Read Binary met offset = 3 (‘00 03’H) en
het aantal verwachte bytes in de response 21 (‘15’H), en controleer of Index_x overeenkomt
met het systeemkaartnummer.
Zo ja, lees dan de bijbehorende Rank_x met het commando Read Binary met offset = de
offset voor Rank_x en het aantal verwachte bytes in de response 1 en geef het resultaat
|| ‘90 00’H terug.
Komt het systeemkaartnummer niet voor, geef dan de foutcode dat het certificaat niet
gevonden is.
8.19. Volgorde bijwerken van opgeslagen boordcomputercertificaten
Naam
|
UpdateRanking
|
Gebruik
|
Chauffeurskaart
|
Input gegevens
|
Systeemkaartnummer
|
Resultaat
|
‘90 00’H OK
‘6A 82’H Certificaat niet aanwezig op chauffeurskaart
|
Indien het certificaat behorende bij het systeemkaartnummer aanwezig is in EF.BCT_Certificates,
wordt deze als meest recente in de Rank gezet.
Voor deze functie moeten de volgende stappen doorlopen worden:
-
1. Selecteer EF.BCT_Certificates met het commando Select met P1P2 = ‘04 0C’H en data
= ‘E8 28 BD 08 0F A0 00 00 01 67 45 53 49 47 4E’H, gevolgd door het commando Select
met P1P2 = ‘02 0C’H en data = ‘44 02’H.
-
2. Lees Index_1 t/m Index_3 met het commando Read Binary met offset = 3 (‘00 03’H) en
het aantal verwachte bytes in de response 21 (‘15’H) en controleer of één hiervan
overeenkomt met het systeemkaartnummer.
Zo niet, geef dan de foutcode terug dat het bijbehorende certificaat niet aanwezig
is.
Zo ja, lees dan de bijbehorende Rank_Highest
8.20. Geef opgeslagen boordcomputercertificaat
Naam
|
GetCertificate
|
Gebruik
|
Chauffeurskaart
|
Input gegevens
|
Systeemkaartnummer
|
Resultaat
|
Certificate||‘90 00’H OK
‘6A 82’H Certificaat niet aanwezig op chauffeurskaart
|
Indien het certificaat behorende bij het systeemkaartnummer aanwezig is in EF.BCT_Certificates,
wordt dit als resultaat terug gegeven.
Voor deze functie moeten de volgende stappen doorlopen worden:
-
1. Selecteer EF.BCT_Certificates met het commando Select met P1P2 = ‘04 0C’H en data
= ‘E8 28 BD 08 0F A0 00 00 01 67 45 53 49 47 4E’H, gevolgd door het commando Select
met P1P2 = ‘02 0C’H en data = ‘44 02’H.
-
2. Lees Index_1 t/m Index_3 met het commando Read Binary met offset = 3 (‘00 03’H) en
het aantal verwachte bytes in de response 21 (‘15’H) en controleer of één hiervan
overeenkomt met het systeemkaartnummer.
Zo niet, geef dan de foutcode terug dat het bijbehorende certificaat niet aanwezig
is.
Zo ja, ga dan door met stap 3.
-
3. Voer Read Binary commando’s uit tot Length_1 (de certificaatlengte) bytes gelezen
zijn. Per Read Binary kan een maximaal aantal bytes gelezen worden. Dit maximum is
van een aantal factoren afhankelijk (zie referentie [7]) en wordt hier max_read genoemd.
De eerste Read Binary heeft als offset de offset voor Certificate_x en het verwachte
aantal bytes ‘00’H (in het geval dat Length_1 < max_read, dan wordt het verwachte
aantal bytes Length_1). Voor iedere volgende Read Binary wordt de offset met max_read
verhoogd. Het verwachte aantal bytes in de response is ‘00’H, behalve bij de laatste
Read Binary, daar is het Length_1 modulo max_read.
-
4. geef het resultaat || ‘90 00’H terug.
8.21. Sla boordcomputercertificaat op
Naam
|
StoreCertificate
|
Gebruik
|
Chauffeurskaart
|
Input gegevens
|
Systeemkaartnummer, certificaat
|
Resultaat
|
‘90 00’H OK
‘xx xx’H Foutcode van een van de gebruikte commando’s, afhankelijk van smartcard implementatie
|
Het systeemkaartnummer wordt met het bijbehorende certificaat als meest recente opgeslagen
in EF.BCT_Certificates. Hierbij wordt de plaats van het minst recente certificaat
overschreven.
Voor deze functie moeten de volgende stappen doorlopen worden:
-
1. Selecteer EF.BCT_Certificates met het commando Select met P1P2 = ‘04 0C’H en data
= ‘E8 28 BD 08 0F A0 00 00 01 67 45 53 49 47 4E’H, gevolgd door het commando Select
met P1P2 = ‘02 0C’H en data = ‘44 02’H.
-
2. Lees Rank_1 t/m Rank_3 met het commando Read Binary met offset = 0 en het aantal verwachte
bytes in de response 3, en zoek de eerste waarde ‘00’ of ‘03’. Dit is Rank_target.
-
3. Sla het systeemkaartnummer op in Index_target met het commando Update Binary met offset
= de offset voor Index_target en het systeemkaartnummer als data.
-
4. Sla het certificaat op in Certificate_target met een reeks Update Binary commando’s
met de offset van het eerste commando gelijkgezet aan de offset voor Certificate_target
en telkens de volgende max_write bytes van het certificaat als data. Indien het certificaat
korter is dan de gereserveerde lengte voor het certificaat, vul bij het laatste Update
Binary commando de rest dan aan met nullen (‘00’).
NB. de hoogte van max_write is van een aantal factoren afhankelijk (zie referentie
[7]).
-
5. Voor Rank_1 t/m Rank_3, met uitzondering van Rank_target: als de inhoud van Rank_x
> 0, verhoog de inhoud dan met 1. Maak Rank_target = ‘01’.
-
6. Geef ‘90 00’H terug.
8.22. Geef meest recente DownloadLog
Naam
|
GetLastDownloadLog
|
Gebruik
|
Chauffeurskaart
|
Input gegevens
|
geen
|
Resultaat
|
DownloadLog || ‘90 00’H OK
‘6A 82’H DownloadLog niet aanwezig op chauffeurskaart
‘xx xx’H Foutcode van een van de gebruikte commando’s, afhankelijk van smartcard implementatie
|
Voor deze functie moeten de volgende stappen doorlopen worden:
-
1. Selecteer EF.BCT_Certificates met het commando Select met P1P2 = ‘04 0C’H en data
= ‘E8 28 BD 08 0F A0 00 00 01 67 45 53 49 47 4E’H, gevolgd door het commando Select
met P1P2 = ‘02 0C’H en data = ‘44 02’H.
-
2. Lees IndexOldestDL met het commando Read Binary met offset = ‘18 B4’H en het aantal
verwachte bytes in de response 1
-
3. Indien de gelezen waarde ‘00’H is, zet dan de IndexNewestDL (variabele in het geheugen)
op 7, anders wordt de IndexNewestDL gelijkgesteld aan IndexOldestDL – 1.
-
4. Bereken nu de offset van de (meest recente) DownloadLog_X behorende bij IndexNewestDL
als volgt: offset_x = ‘18 B5’H + 33 x IndexNewestDL.
-
5. Lees de aangeduide DownloadLog_X met het commando Read Binary met offset = offset_x
en het verwachte aantal bytes in de respons 33.
-
6. Indien de respons uit 33 nullen (‘00’H) bestaat, geef dan de foutcode terug dat er
geen DownloadLog records aanwezig zijn, retourneer anders de gelezen respons || ‘90
00’H.
8.23. Sla DownloadLog op
Naam
|
StoreDownloadLog
|
Gebruik
|
Chauffeurskaart
|
Input gegevens
|
DownloadLog
|
Resultaat
|
‘90 00’H OK
‘xx xx’H Foutcode van een van de gebruikte commando’s, afhankelijk van smartcard implementatie
|
Het in de Input opgegeven DownloadLog wordt als het meest recente opgeslagen in DownloadLogs
van EF.BCT_Certificates. Hierbij wordt de plaats van het minst recente DownloadLog
overschreven.
Voor deze functie moeten de volgende stappen doorlopen worden:
-
1. Selecteer EF.BCT_Certificates met het commando Select met P1P2 = ‘04 0C’H en data
= ‘E8 28 BD 08 0F A0 00 00 01 67 45 53 49 47 4E’H, gevolgd door het commando Select
met P1P2 = ‘02 0C’H en data = ‘44 02’H.
-
2. Lees IndexOldestDL met het commando Read Binary met offset = ‘18 B4’H en het aantal
verwachte bytes in de response 1
-
3. Sla het gegeven DownloadLog op in DownloadLogs met het commando Update Binary met
offset = ‘18 B5’H + 33 x IndexOldestDL. en het DownloadLog als data.
-
4. Indien de gelezen IndexOldestDL ‘07’H is, zet dan index_new = ‘00’H, zet anders index_new
op IndexOldestDL + 1.
-
5. Sla de bijgewerkte index op met het commando Update Binary met offset = ‘18 B4’H en
index_new (1 byte) als data.
-
6. Geef ‘90 00’H terug.
9. Commando’s
De communicatie met de boordcomputerkaarten gebeurt door middel van commando-antwoord
paren. Het commando wordt naar de boordcomputerkaart toegestuurd en daarop komt een
antwoord terug.
Een commando bestaat uit:
-
• een Class byte (CLA),
-
• een Instruction byte (INS),
-
• een Parameter 1 byte (P1),
-
• een Parameter 2 byte (P2),
-
• een Lengte gegevens byte (Lc) in het geval er gegevens zijn,
-
• gegevens (Data), optioneel
-
• een verwachte lengte antwoord byte (Le), optioneel.
Een antwoord bestaat uit:
Dit hoofdstuk geeft enkele tips voor het gebruik van de commando’s voor het selecteren,
uitlezen en beschrijven van transparante elementaire files (transparent EF’s). Voor
de exacte opbouw van de commando-antwoord paren wordt echter verwezen naar Referentie
[7].
De paragrafen hieronder vermelden bepaalde file identifiers en short EF identifiers.
Voor een volledig overzicht van de beschikbare short EF identifiers (SFIDs) wordt
verwezen naar Referenties [8] t/m [12].
9.1. Selecteren van EF’s
Voordat een EF kan worden uitgelezen of beschreven, dient deze geselecteerd te worden.
Voordat een EF geselecteerd kan worden, dient eerst de Dedicated File (DF) waar deze
EF onderdeel van uitmaakt te worden geselecteerd. Conform Referenties [8] t/m [12]
bevat elke BCT kaart de volgende twee DF’s:
-
1. De Master File (MF)
te selecteren met INS P1 P2 Lc Data = ‘A0 00 0C 02 3F00’H
-
2. De Application DF (DF.CIA)
te selecteren met INS P1 P2 Lc Data = ‘A4 04 0C 0F E828BD080FA000000167455349474E’H
De verwachte respons op elk van de bovenstaande commando’s is SW1-SW2 = ’90 00’H.
Nadat de betreffende DF is geselecteerd, kan elke daarin opgenomen EF op een van de
volgende wijzen worden geselecteerd:
-
1. Met een expliciete SELECT op basis van de 2-bytes file identifier (FID):
INS P1 P2 Lc Data = ‘A4 02 0C 02 (FID)
-
2. Met een expliciete SELECT inclusief opvragen van de file control parameters:
INS P1 P2 Lc Data Le = ‘A4 02 04 02 (FID) 00
-
3. Met een impliciete SELECT als onderdeel van het data handling commando:
-
a. Voor offsets < 256:
INS = INS met bit1 = 0 (EVEN instruction)
P1 = bit8 t/m bit6 = 100b || bit5 t/m bit1 = short EF id
P2 = offset [0...255]
Lc Data Le = afhankelijk van de instructie
-
b. Voor 0 <= offsets < ∞:
INS = INS met bit1 = 1 (ODD instruction)
P1P2 = bit16 t/m bit6 = 0...0b || bit5 t/m bit1 = short EF id
of
P1P2 = file identifier
Lc = de lengte van Data
Data = minimaal een “offset data object” met tag = 54h
Le = afhankelijk van de instructie
9.2. Uitlezen van een nog niet geselecteerde EF vanaf een offset < 256
Als voorbeeld van efficiënt coderen volgt hier de kleinste commandoreeks waarmee de
4e t/m 7e byte (willekeurig voorbeeld) van EF.BCT_Certificates kunnen worden uitgelezen:
INS
|
P1
|
P2
|
Lc
|
Data
|
Le
|
Betekenis
|
A4
|
04
|
0C
|
0F
|
E828BD080F
A000000167
455349474E
|
|
Selecteer de DF.CIA obv de AID
|
B0
|
94
|
03
|
|
|
04
|
Impliciete SELECT van SFID = 14h, gevolgd door uitlezen van 4 bytes vanaf offset 3
|
9.3. Uitlezen van de huidige EF vanaf een offset kleiner 32768
Als voorbeeld van efficiënt coderen volgt hier het kleinste commando waarmee de 4000e t/m 4050e byte (willekeurig voorbeeld) van de momenteel geselecteerde EF kunnen worden uitgelezen:
INS
|
P1
|
P2
|
Lc
|
Data
|
Le
|
Betekenis
|
B0
|
1F
|
3F
|
|
|
33
|
Lees 51 (33h) bytes vanaf offset 7999 (1F3Fh) uit de momenteel geselecteerde EF.
|
9.4. In de huidige DF Uitlezen van een EF vanaf een offset groter dan 32767
Als voorbeeld van efficiënt coderen volgt hier de kleinste commandoreeks waarmee de
40000e t/m 40001e byte en dan de 40002e t/m 40003e byte (willekeurig voorbeeld) van de nog niet eerder geselecteerde EF.Driver_Activity_Data
kunnen worden uitgelezen (uitgangspunt is dat de DF.CIA wel al geselecteerd is):
INS
|
P1
|
P2
|
Lc
|
Data
|
Le
|
Betekenis
|
B1
|
00
|
13
|
04
|
54 02 9C3F
|
02
|
Selecteer de EF met short file identifier (SFI) 13h en lees 2 (02h) bytes vanaf offset
39999 (9C3Fh) uit die EF.
|
B1
|
00
|
00
|
04
|
54 02 9C41
|
02
|
Lees de volgende 2 bytes uit diezelfde EF.
|
9.5. Opvragen van de FCP’s o.a. voor de grootte van EF.Driver_Activity_Data
Omdat EF.Driver_Activity_Data per chauffeurskaart een eigen grootte heeft, is het
noodzakelijk om minimaal één keer per kaartsessie te achterhalen wat die grootte exact
is. Hiervoor biedt de chip (conform referentie [7]) en diens personalisatie de mogelijkheid
om van EF’s de file control parameters (FCP) op te vragen. Er van uitgaande dat de
DF.CAI reeds is geselecteerd, is het betreffende commando voor de EF.Driver_Activity_Data
als volgt:
INS
|
P1
|
P2
|
Lc
|
Data
|
Le
|
Betekenis
|
A4
|
02
|
04
|
02
|
4401
|
00
|
A4 = SELECT
02 = selecteer een EF
04 = vraag ook om FCP
02 = lengte van Data
4401 = EF file identifier
00 = retourneer alle beschikbare bytes
|
De chips zijn zodanig geprogrammeerd dat dit resulteert in de volgende respons (voorbeeld):
62 1B 80 02 xx xx 82 01 01 83 02 44 01 88 01 98 A1 08 8C 02 01 00 9C 02 01 00 8A 01
05 90 00
De betekenis van deze respons is hieronder uitgewerkt:
Bytes
|
Betekenis
|
62 1B
|
Hier volgen 27 (1Bh) bytes met FCP informatie
|
|
80 02 xx xx
|
De lengte van de file is gecodeerd in 2 bytes en bedraagt xxxx
|
|
82 01 01
|
Het file descriptor byte is 01h; het betreft een transparante EF
|
|
83 02 44 01
|
De file identifier van deze file is 4401h
|
|
88 01 98
|
De short file identifier van deze file is 13h
(deze is gecodeerd in b8 t/m b4 van het derde byte, omdat b3 t/m b1 0 zijn):
10011000
|
|
A1 08
|
Hier volgen 8 bytes met proprietary security attributen (dit zijn voorbeelden. Voor
daadwerkelijke invulling zie Referentie [7])
|
|
8C 02 01 00
|
2 bytes met proprietary security attributen voor contactchip
|
|
9C 02 01 00
|
2 bytes met proprietary security attributen voor contactloze chip
|
|
8A 01 05
|
Het life cycle status byte van deze EF is 05h (operational state – activated)
|
90 00
|
SW1-SW2 geeft “Normal processing” aan
|
Voor een compleet overzicht van FCP wordt verwezen naar § 3.3.4.1 van Referentie [7].
Bijlage B. Referentie data
Hieronder volgt een aantal voorbeelden van functies met de uitgewerkte hexadecimale
codes. Dit geeft een beter inzicht in het toepassen van deze functies in de Boordcomputer
Taxi.
B.1. Het opzetten van Secure Messaging
Voor het opzetten van Secure Messaging, zoals beschreven staat in 4.6, worden de volgende
stappen uitgevoerd:
-
1. Lees de inhoud van EF.SN.ICC door middel van een read binary met SFI '1C'h en een
offset '00'h.
De laatste 8 bytes van de response data wordt gebruikt als SN.ICC.
-
2. Selecteer het te gebruiken algoritme voor de mutual authenticate en de symmetrische
sleutel referentie.
Dit wordt gedaan met het commando Manage Security Environment, met P1 de waarde 'C1'h
en P2 de waarde 'A4'h. De data bij dit commando is '80 01 8C 83 01 03'h ('8C'h om
“symmetric mutual authentication algorithm with SHA-256” aan te duiden en '03'h om
het Security Data Object (SDO) van PKI.KS.SM.ICC aan te duiden).
-
3. Vraag om een random waarde door middel van Get Challenge.
De response data is de RND.ICC.
-
4. Genereer een random waarde van 8 bytes voor RND.IFD, een random waarde van 32 bytes
voor K.IFD en bepaal een serienummer SN.IFD van 8 bytes.
-
5. Stel het bericht S samen:
S = RND.IFD || SN.IFD || RND.ICC || SN.ICC || K.IFD.
-
6. Bereken de encrypted waarde van S met CBC Triple DES encryptie, ICV '00'h en de encryptie
sleutel ENC.KEY (laatste 16 bytes van transportkey1):
ENC = CBCTDes('00', S, ENC.KEY).
-
7. Bereken de Retail MAC over de encrypted waarde van S met ICV '00'h en de MAC sleutel
MAC.KEY (eerste 16 bytes van transportkey1):
MAC = RMac('00', ENC || '80', MAC.KEY).
NB. Gebruik altijd padding met '80 ...' achter de data.
-
8. Voer een Mutual Authenticate commando uit met als data ENC || MAC.
-
9. Wanneer de status van de response '90 00'h is, is er ook response data beschikbaar.
-
a. Haal de encrypted data ENC_R en de MAC uit deze data.
-
b. Bereken de Retail MAC over ENC_R met ICV '00'h en de MAC sleutel MAC.KEY:
MAC_R = RMac('00', ENC_R || '80', MAC.KEY).
Ook hier moet weer de padding met '80 ...' gebruikt worden.
-
c. Bereken de decrypted waarde van ENC_R met Inverse CBC Triple DES encryptie, ICV '00'h
en de encryptie sleutel ENC.KEY:
DEC_S = InvCBCTDes('00', ENC_R, ENC.KEY).
-
10. Wanneer de berekende MAC_R gelijk is aan de MAC uit de response data van de Mutual
Authenticate, dan is DEC_S gelijk aan
RND.ICC || SN.ICC || RND.IFD || SN.IFD || K.ICC.
-
11. Hieruit kunnen de volgende waardes berekend worden:
-
• K_ICC_IFD = K.IFD xor K.ICC
-
• SK_ENC = 1e 16 bytes van SHA256(K_ICC_IFD || '00 00 00 01')
-
• SK_MAC = 1e 16 bytes van SHA256(K_ICC_IFD || '00 00 00 02')
-
• SSC = laatste 4 bytes RND.ICC || laatste 4 bytes RND.IFD
B.2. Het sturen van commando’s met Secure Messaging
Na het opzetten van de secure messaging verbinding, moeten alle volgende commando's
met secure messaging uitgevoerd worden. Dit staat beschreven in 4.1 t/m 4.5.
Hierbij worden de SK_ENC, SK_MAC en SSC gebruikt die na het opzetten van de secure
messaging verbinding te berekenen zijn (zie hierboven).
Om te komen van een normaal commando tot een commando onder secure messaging, moeten
de volgende stappen doorlopen worden:
-
1. Verhoog de SSC met 1.
-
2. De Cla byte 'xx' wordt 'xC' (Cla').
-
3. Als het commando data bevat (Lc > 0), dan moet deze data encrypt worden. Bereken de
encrypted waarde van de data met CBC Triple DES encryptie, ICV '00'h en de encryptie
sleutel SK_ENC:
ENC = CBCTDes('00', data || '80', SK_ENC).
Ook hier moet weer de padding met '80 ...' gebruikt worden.
-
4. De SecuredData waarover een Retail MAC berekend moet worden is afhankelijk van Lc
en Le:
-
•
Lc > 0, Le > 0
SSC || Cla || Ins || P1 || P2 || '80' || '87' || Length(ENC)+1 || '01' || ENC || '97'
|| Length(Le) || Le || '80'
-
•
Lc > 0, Le = 0
SSC || Cla || Ins || P1 || P2 || '80' || '87' || Length(ENC)+1 || '01' || ENC || '80'
-
•
Lc = 0, Le > 0
SSC || Cla || Ins || P1 || P2 || '80' || '97' || Length(Le) || Le || '80'
-
•
Lc = 0, Le = 0
SSC || Cla || Ins || P1 || P2 || '80'
Let op dat er padding met '80 ...' gebruikt moet worden na P2 en, indien Lc > 0 of
Le > 0, aan het eind van de data.
De te gebruiken ICV is '00'h en de te gebruiken sleutel is SK_MAC.
-
5. Het te versturen commando ziet er dan als volgt uit:
Cla' || Ins || P1 || P2 || Length(SecuredData) + 10 || SecuredData || '8E 08'|| MAC
|| '00'
-
6. Het formaat van de response onder secure messaging is afhankelijk van het terug krijgen
van data:
-
•
data terug (even Ins)
'87' || Length(EncryptedData) + 1 || '01'|| EncryptedData || '99 02' || SW || '8E
08' || MAC || SW
-
•
data terug (oneven Ins)
'85' || Length(EncryptedData) || EncryptedData || '99 02' || SW || '8E 08' || MAC
|| SW
-
•
geen data terug
'99 02' || SW || '8E 08' || MAC || SW
-
7. Verhoog de SSC met 1.
-
8. Bereken een Retail MAC over de volgende data, afhankelijk van het formaat van de response:
-
•
data terug (even Ins)
SSC || '87' || Length(EncryptedData) + 1 || '01'|| EncryptedData || '99 02' || SW
|| '80'
-
•
data terug (oneven Ins)
SSC || '85' || Length(EncryptedData) || EncryptedData || '99 02' || SW || '80'
-
•
geen data terug
SSC || '99 02' || SW || '80'
In alle gevallen wordt er op het eind padding met '80' gebruikt.
De te gebruiken ICV is '00'h en de te gebruiken sleutel is SK_MAC.
-
9. Vergelijk de berekende Retail MAC met de MAC uit de response. Deze moeten gelijk aan
elkaar zijn.
-
10. Zijn de ontvangen en berekende MAC gelijk aan elkaar, dan kan de EncryptedData, indien
aanwezig, decrypted worden.
Bereken de decrypted waarde van EncryptedData met Inverse CBC Triple DES encryptie,
ICV '00'h en de encryptie sleutel SK_ENC:
DecryptedData = InvCBCTDes('00', EncryptedData, SK_ENC).
Zie de tabel hieronder voor een voorbeeld van een commando, het commando met secure
messaging en het antwoord met secure messaging.
B.3. Het zetten van een handtekening met een boordcomputerkaart
B.3.1. SignDataLegally
Voor het zetten van een elektronische handtekening met een boordcomputerkaart, zoals
beschreven staat in 8.5, worden de volgende stappen uitgevoerd:
-
1. Allereerst moet het hash template met het te gebruiken algoritme geselecteerd worden.
Dit wordt gedaan met het commando Manage Security Environment, met P1 de waarde '41'h
en P2 de waarde 'AA'h. De data bij dit commando is '80 01 40'h ('40'h om de algoritme
identifier voor SHA-256 aan te geven).
-
2. Selecteer het te gebruiken algoritme en de private sleutel van de BCT Handtekening.
Dit wordt gedaan met het commando Manage Security Environment, met P1 de waarde '41'h
en P2 de waarde 'B6'h. De data bij dit commando is '80 01 42 84 01 86'h ('42'h om
“PKCS#1 v1.5 – SHA-256” aan te duiden en '86'h om het Security Data Object (SDO) van
PKI.CH.DS aan te duiden).
-
3. De private sleutel van de BCT Handtekening mag pas gebruikt worden nadat de PIN gevalideerd
is. Dit is nodig voor iedere keer dat deze sleutel gebruikt wordt. Dit wordt gedaan
met het commando Verify, waarbij P2 (de PIN reference) de waarde '01'h heeft. Voor
de PIN wordt PIN formaat 2 gebruikt.
-
4. Wanneer de input gegevens uit meer dan 64 bytes bestaan, moet er een intermediate
hash met SHA-256 berekend worden door de boordcomputerlogica. Hierbij wordt het laatste
gegevensblok niet gehashed, maar wordt de intermediate hash en het aantal gehashte
bits onthouden voor de volgende stap.
Wanneer het totaal aan input gegevens uit maximaal 64 bytes bestaat, wordt er geen
intermediate hash berekend en worden alle inputgegevens in de volgende stap gebruikt.
-
5. Het berekenen van de uiteindelijke hash met SHA-256 wordt door de boordcomputerkaart
gedaan. Hiervoor wordt het commando PSO Hash gebruikt. Hierbij worden de “intermediate
hash value”, het aantal gehashte bits en het laatste (of enige) blok inputdata van
minimaal 1 en maximaal 64 bytes opgenomen in het Dataveld van het commando. Bij een
succesvol uitgevoerde PSO HASH zal de uiteindelijke hash waarde in het chipgeheugen
van de boordcomputerkaart achterblijven ten behoeve van de volgende en laatste stap.
-
6. Met de gekozen private sleutel wordt de handtekening berekend over de in het chipgeheugen
aanwezige hashwaarde.
Dit wordt gedaan met het commando PSO Compute Digital Signature. Le, het verwachte
aantal bytes in de response, moet daarbij op '00'h staan.
-
7. Een elektronische handtekening kan gecontroleerd worden op de volgende manier:
-
a. Selecteer het certificaat EF.C.PKI.CH.DS op de boordcomputerkaart.
-
b. Lees het certificaat met behulp van (meerdere) Read Binary.
-
c. Haal de Public Exponent en de Modulus uit het certificaat.
-
d. Voer een RSA decryptie uit van de response data van Compute Digital Signature met
de Public Exponent en de Modulus.
-
e. De decrypted data moet overeenkomen met:
’00 01 FF .. FF 00’ || SHA_256_Digest || SHA256(input data),
waarbij SHA_256_Digest = '30 31 30 0D 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20'h.
B.3.2. SignDataForAuthenticity
Voor het zetten van een elektronische handtekening met de sleutel-certificaatcombinatie
PKI.CH.AUT van een boordcomputerkaart, zoals beschreven staat in 8.7, worden de volgende
stappen uitgevoerd:
-
1. Allereerst moet het hash template met het te gebruiken algoritme geselecteerd worden.
Dit wordt gedaan met het commando Manage Security Environment, met P1 de waarde '41'h
en P2 de waarde 'AA'h. De data bij dit commando is '80 01 40'h ('40'h om de algoritme
identifier voor SHA-256 aan te geven).
-
2. Selecteer het te gebruiken algoritme en de private sleutel van de BCT Authenticiteit.
Dit wordt gedaan met het commando Manage Security Environment, met P1 de waarde '41'h
en P2 de waarde 'B6'h. De data bij dit commando is '80 01 42 84 01 85'h ('42'h om
“PKCS#1 v1.5 – SHA-256” aan te duiden en '85'h om het Security Data Object (SDO) van
PKI.CH.AUT aan te duiden).
-
3. De private sleutel van de BCT Authenticiteit mag pas gebruikt worden nadat de PIN
gevalideerd is. Een eenmaal uitgevoerde PIN validatie mag – zo lang de kaart in de
boordcomputer aanwezig blijft – worden “herbruikt” bij elke volgende keer dat deze
sleutel gebruikt word. Dit wordt gedaan met het commando Verify, waarbij P2 (de PIN
reference) de waarde '01'h heeft. Voor de PIN wordt PIN formaat 2 gebruikt.
-
4. Wanneer de input gegevens uit meer dan 64 bytes bestaan, moet er een intermediate
hash met SHA-256 berekend worden door de boordcomputerlogica. Hierbij wordt het laatste
gegevensblok niet gehashed, maar wordt de intermediate hash en het aantal gehashte
bits onthouden voor de volgende stap.
Wanneer het totaal aan input gegevens uit maximaal 64 bytes bestaat, wordt er geen
intermediate hash berekend en worden alle inputgegevens in de volgende stap gebruikt.
-
5. Het berekenen van de uiteindelijke hash met SHA-256 wordt door de boordcomputerkaart
gedaan. Hiervoor wordt het commando PSO Hash gebruikt. Hierbij worden de “intermediate
hash value”, het aantal gehashte bits en het laatste (of enige) blok inputdata van
minimaal 1 en maximaal 64 bytes opgenomen in het Dataveld van het commando. Bij een
succesvol uitgevoerde PSO HASH zal de uiteindelijke hash waarde in het chipgeheugen
van de boordcomputerkaart achterblijven ten behoeve van de volgende en laatste stap.
-
6. Met de gekozen private sleutel wordt de handtekening berekend over de in het chipgeheugen
aanwezige hashwaarde.
Dit wordt gedaan met het commando PSO Compute Digital Signature. Le, het verwachte
aantal bytes in de response, moet daarbij op '00'h staan.
-
7. Een elektronische handtekening kan gecontroleerd worden op de volgende manier:
-
a. Selecteer het certificaat EF.C.PKI.CH.AUT op de boordcomputerkaart.
-
b. Lees het certificaat met behulp van (meerdere) Read Binary.
-
c. Haal de Public Exponent en de Modulus uit het certificaat.
-
d. Voer een RSA decryptie uit van de response data van Compute Digital Signature met
de Public Exponent en de Modulus.
-
e. De decrypted data moet overeenkomen met:
’00 01 FF .. FF 00’ || SHA_256_Digest || SHA256(input data),
waarbij SHA_256_Digest = '30 31 30 0D 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20'h.
B.4. Het zetten van een handtekening met een systeemkaart
NB. Deze functie moet uitgevoerd worden onder secure messaging, zoals beschreven is in
B.2. Voor het overzicht worden onderstaande commando’s en responses echter zonder
deze secure messaging weergegeven.
Voor het zetten van een elektronische handtekening met een systeemkaart, zoals beschreven
staat in 8.6, worden de volgende stappen uitgevoerd:
-
1. Allereerst moet het hash template met het te gebruiken algoritme geselecteerd worden.
Dit wordt gedaan met het commando Manage Security Environment, met P1 de waarde '41'h
en P2 de waarde 'AA'h. De data bij dit commando is '80 01 40'h ('40'h om de algoritme
identifier voor SHA-256 aan te geven).
-
2. Selecteer het te gebruiken algoritme en de private sleutel van de BCT Authenticiteit.
Dit wordt gedaan met het commando Manage Security Environment, met P1 de waarde '41'h
en P2 de waarde 'B6'h. De data bij dit commando is '80 01 42 84 01 85'h ('42'h om
“PKCS#1 v1.5 – SHA-256” aan te duiden en '85'h om het Security Data Object (SDO) van
PKI.CH.AUT aan te duiden).
-
3. Wanneer de input gegevens uit meer dan 64 bytes bestaan, moet er een intermediate
hash met SHA-256 berekend worden door de boordcomputerlogica. Hierbij wordt het laatste
gegevensblok niet gehashed, maar wordt de intermediate hash en het aantal gehashte
bits onthouden voor de volgende stap.
Wanneer het totaal aan input gegevens uit maximaal 64 bytes bestaat, wordt er geen
intermediate hash berekend en worden alle inputgegevens in de volgende stap gebruikt.
-
4. Het berekenen van de uiteindelijke hash met SHA-256 wordt door de systeemkaart gedaan.
Hiervoor wordt het commando PSO Hash gebruikt. Hierbij worden de “intermediate hash
value”, het aantal gehashte bits en het laatste (of enige) blok inputdata van minimaal
1 en maximaal 64 bytes opgenomen in het Dataveld van het commando. Bij een succesvol
uitgevoerde PSO HASH zal de uiteindelijke hash waarde in het chipgeheugen van de systeemkaart
achterblijven ten behoeve van de volgende en laatste stap.
-
5. Met de gekozen private sleutel wordt de handtekening berekend over de in het chipgeheugen
aanwezige hashwaarde.
Dit wordt gedaan met het commando PSO Compute Digital Signature. Le, het verwachte
aantal bytes in de response, moet daarbij op '00'h staan.
-
6. Een elektronische handtekening kan gecontroleerd worden op de volgende manier:
-
a. Selecteer het certificaat EF.C.PKI.CH.AUT op de systeemkaart.
-
b. Lees het certificaat met behulp van (meerdere) Read Binary.
-
c. Haal de Public Exponent en de Modulus uit het certificaat.
-
d. Voer een RSA decryptie uit van de response data van Compute Digital Signature met
de Public Exponent en de Modulus.
-
e. De decrypted data moet overeenkomen met:
’00 01 FF .. FF 00’ || SHA_256_Digest || SHA256(input data),
waarbij SHA_256_Digest = '30 31 30 0D 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20'h.