[Home/Nieuws]  [Magazines]  [Meetings]  [Downloads]  [Redaktie]  [Geschiedenis]


Everything about chipcards 2

Paranoia in de portemonnee
De afgelopen tijd zijn de gezamelijke banken (natuurlijk weer zonder de Postbank) druk bezig geweest een nieuw betaalmiddel aan de man dan wel vrouw te brengen: de ChipKnip. Deze chip op je bankpas wordt voorgesteld als het elektronisch equivalent van contant geld. Als creatieve technologiegebruiker kun je deze bewering natuurlijk niet laten passeren. Een onderzoek naar alternatief ChipKnip gebruik, ofwel: Grote Broer heeft er stel kleine broertjes bij gekregen.

Een smartcard zoals de ChipKnip is welbeschouwd een computer op chipformaat: het bevat geheugen, een microprocessor en een file system om gegevens op te slaan. In een ROM geheugen staat een mini operating system dat commando's uitvoert die de buitenwereld naar de kaart zendt. De enige communicate met die buitenwereld vindt plaats via de acht contacten die op de chipkaart zitten. Met behulp van een smartcard interface zoals beschreven in Klaphek 2 is het mogelijk je
computer met de kaart te laten praten. In de ISO7816 standaarden zijn hier normen voor opgesteld: deel 1 en 2 bevatten fysieke en elektrische normen, deel 3 en amendement deel 3 beschrijven twee gestandaardiseerde datalink protocollen T0 en T1 en in deel 4 staat een standaard instructie set voor applicaties. De meeste smart cards (ook de ChipKnip) voldoen aan deel 1 t/m 3 en implementeren een gedeelte van de instructie set uit deel 4. ISO7816 bevat nog meer delen, waarin onder andere de coderingen van gegevens op de kaart worden gespecificeerd, maar die worden in de praktijk weinig gebruikt.

De ChipKnip is een smartcard van het type CC 60, gemaakt door Bull CP8 Transac. Deze kaart komt oorspronkelijk uit België waar hij de deel uit maakt van het Proton project van Banksys. Versie 1 van de CC 60 is daar bekend onder de naam Bancontact/MisterCash, in Nederland wordt versie 2 gebruikt. Voor het einde van het jaar wordt alweer overgegaan op een nieuwere kaart, de CC 1000, waar ook de Albert Heijn spaarzegeltjes en dergelijke op gezet kunnen worden. Welke kaart je hebt kun je zien aan de data die een smartcard zendt nadat hij gereset wordt, de zogeheten Answer To Reset (ATR). In tabel 1 staan de ATRs voor een aantal kaarten. Als de ATR begint met 0x03 dan betekent dat, dat de kaart de inverse conventie gebruikt voor het coderen van z'n bits en bytes. Oftewel alle bits staan in omgekeerde volgorde in een byte en alle enen worden geschreven als nullen en omgekeerd. 0x03 is in die inverse conventie gelijk aan 0x3f, dus je kunt zien de CC 60 'm gebruikt en de CC 1000 en de Zeelandkaart niet. Voor meer informatie over wat de bytes in de ATR precies betekenen wordt verwezen naar ISO7816-3, voor de verdere communicatie met de kaart zijn ze niet belangrijk meer.

CC 60 V1     3f 67 25 00 2a 20 00 40 68 90 00
CC 60 V2     3f 67 25 00 2a 20 00 41 68 90 00
CC 1000      3b 67 25 00 2a 20 00 41 68 90 00
Zeelandkaart 3b 8b 81 31 40 34 53 4d 41 52 54 53 43 4f 50 45 31 6d

Tabel 1: Answer To Reset voor diverse kaarten

Nu we weten met wat voor kaart we van doen hebben willen we er natuurlijk ook commando's naar toe sturen. Een commando ziet er als volgt uit:

CLA INS P1 P2 LEN OPTIONAL DATA

De eerste byte is de instruction class. De instruction class geeft aan voor wie het commando bedoelt is: als er meerdere (incompatibele) applicaties op de kaart staan zijn ze te onderscheiden door ze ieder een eigen class te geven. De meeste kaarten bevatten maar 1 of 2 instruction classes.
De tweede byte bevat de eigenlijke instructie. De daaropvolgende bytes P1 en P2 zijn parameters bij de instructie. LEN tenslotte geeft ofwel aan hoeveel bytes optional data volgen ofwel (wanneer er geen optional data is) het aantal data bytes dat wordt terugverwacht. Bij het datalink protocol dat de ChipKnip gebruikt, word het commando in twee stappen verstuurd: Eerst zendt het de header, bestaande uit de eerste vijf bytes. De kaart antwoordt hierop met het herhalen van de instructie byte. Nu kan de rest van de data worden verzonden. De kaart voert vervolgens de instructie uit en zendt tot slot het resultaat terug, dat altijd wordt afgesloten met twee status bytes. Een voorbeeld:

> BC A4 00 00 02
< A4
> 29 01
< 90 00

In de bovenstaande conversatie wordt de file 2901 op een ChipKnip geselecteerd: BC is de instruction class voor instructies die niet specifiek met Proton functies te maken hebben. (E1 is de class voor de Proton commandos). A4 is de ISO 7816-4 code voor het selecteren van een file. P1 en P2 zijn worden niet gebruikt en zijn dus nul. De optionele data bestaat uit het nummer van de file: 2901, ofwel de 'purse file'. De kaart antwoordt met '90 00', wat de status code voor 'alles OK' is.

90 00   OK
67 XX   Wrong length
6B XX   Wrong parameters
6D XX   Instruction not supported
6E XX   Instruction class not supported

Tabel 2: Processing status words

Een andere interessante instructie is 'B0', oftewel het lezen van een file. Door nu 'BC B0 00 00 FF' naar de kaart te zenden krijgen we de eerste 255 bytes van de purse file terug. Hier blijken een aantal interessante dingen in te staan, onder andere je bankrekening nummer. Betalen met de ChipKnip is dus net zo anoniem als betalen met contant geld, op iedere gulden staat tenslotte ook je rekening nummer. Zo bevat de ChipKnip wel meer features: van iedere transactie, opladen of betalen wordt een log gemaakt. Met de read trace instructie kunnen deze logs worden opgevraagd:

> e1 b6 0 1 24
< b6 04 80 00 02 0c f2 00
  00 50 00 56 02 05 67 51
  00 00 00 73 8d 00 10 f0
< 17 00 c4 4b 3d 33 45 00
  00 00 00 00 00 90 00

De teruggestuurde informatie bevat het log record van de laatst gedane transactie. Door het commando te herhalen met P2 = 3 i.p.v 1 kunnen ook de voorgaande logs worden verkregen, 10 in het totaal. In figuur 1 staat de indeling van een log record afgebeeld.

TRANSACT_TYPE TRANSACT_ERROR BALANCE
BALANCE CHECKSUM TRANS_AMOUNT
TRANS_AMOUNT CURRENCY SAM_ID
SAM_ID SAM_STAN
SAM_STAN CHECKSUM
PURSE_STAN CHECKSUM GEN. CHEKSUM


TRANSACT_LOG

Figuur 1: Data layout van een transaction log record

TRANSACT_TYPE geeft aan om wat voor een transactie het gaat. Zie tabel 3 voor geldige waarden.
TRANSACT_ERROR bevat de eventuele foutcode mocht de transactie mislukt zijn.
BALANCE is het tegoed op de kaart uitgedrukt in centen.
TRANS_AMOUNT is het bedrag dat betaald of opgeladen is.
CURRENCY geeft aan in welke geldeenheid de transactie is uitgevoerd. De waarden zijn 0x0528 voor guldens en 0x0056 voor Belgische franken.
SAM_ID is het identificatienummer van de betaal- dan wel oplaadautomaat. SAM staat voor Secure Application Module, de smartcard in de betaalautomaat die voor de beveiliging zorgt.
SAM_STAN is het volgnummer dat de SAM aan de transactie geeft.
PURSE_STAN is het volgnummer dat de ChipKnip aan de transactie geeft.

0x1F   Virgin Trace: ongebruikt record
0x04   Single Debit: enkelvoudige betaling
0x02   First Debit: eerste 'slice' van een sliced debit
0x00   Middle Debit: alle daaropvolgende slices
0x06   Last Debit: de laatste slice
0x14   Credit: opladen van de Knip
0x08   Parameter Update
0x0A   Key Update

Tabel 3: Transactie types

Een creatieve winkelier kan zo op een wel heel makkelijke interessante informatie verzamelen over z'n klanten: hoeveel geven ze uit en in welke winkels? Gebruiken ze hun ChipKnip vaak en wat is hun rekeningnummer? Waar had iemand het ook al weer over privacy?
Maar er is meer.. de TRANSACT_LOG bevat ook nog een paar interessante dingen, namelijk een 'Cash Register General Total' van 4 bytes gevolgd door het tijdstip van de transactie, gecodeerd in 4 bits voor de maand, 5 bits voor de dag en 7 bits voor het tijdstip (in eenheden van 675 seconden). De Cash Register General Total is het totaal aan geld dat ooit in de kas gestort is. Om dit zomaar voor iedereen leesbaar op de knippen van alle klanten te zetten was zelfs de banken te
gortig, daarom is deze waarde 'versleuteld'. Het hiervoor gebruikte versleutelingsalgoritme heet optellen (ja, hetzelfde optellen dat idereen op de lagere school leert). Iedere kaart bevat namelijk een geheime waarde die bij het totaal wordt opgeteld voordat het op de kaart gezet wordt. Nu wordt deze methode ook gebruikt bij de veiligste encryptie methode die er bestaat, het one time pad. Dan moet echter wel voor iedere keer dat de general total versleuteld wordt en andere geheime offset gebruikt worden! Nu is deze offset vaak makkelijk te schatten (als er pas 5 transacties zijn geweest met de SAM, zal die geheime waarde wel aardig in de buurt liggen van het general total op de kaart). Bovendienblijft het berekenen van de omzet van een bepaalde automaat net zo makkelijk. Een nieuwsgierige concurrent hoeft alleen maar een keer per week te 'Knippen' bij een winkelier om diens weekomzet te bepalen. Ook is het natuurlijk wel aardig om eens te kijken hoevaak er op dit moment al geKnipt wordt.

Al met al is de ChipKnip een hele verbetering: waar met pinnen slechts de banken konden bijhouden wat de consument voor hoeveel bij wie kocht, maakt de ChipKnip zelfs het wederzijds bespionneren van klant en winkelier mogelijk. "Alles kan tegenwoordig"

Meer informatie
Meer informatie is te vinden in onderstaande documenten en www sites. Ook in de volgende Klaphek wordt er weer aandacht besteed. Dan komen de Chipper en z'n broetjes en zusjes aanbod.

ISO7816 deel 1 t/m 4. De eerste drie delen zijn op http://cuba.xs4all.nl/~tim/sc-hp/iso7816.txt te vinden. Ammendement deel 3 en deel 4 zijn helaas niet online verkrijgbaar. Deze zul je in een universiteitbibliotheek moeten zoeken of aanschaffen bij het Nederlands Normalisatie Instituut (is vrij prijzig).
"ChipKnip Terminal Specifications", Interpay BeaNet B.V., 1996, beschrijft het ChipKnip project. Het bevat veel gedetaileerde informatie, maar niet de gebruikte cryptografische methoden en niet het oplaadprotocol. Het kan voor ongeveer 165 gulden aangevraagd worden bij:

Interpay BeaNet B.V.
ChipKnip department
Eendrachtslaan 315
Postbus 8608
3503 RP Utrecht

http://www.cp8.bull.net, de site van Bull CP8 Transac, waar de CC 60 en CC 1000 gemaakt worden.
http://www.mastercard.com/emv, de specificaties van de smartcardstandaard van EuroPay, MasterCard en VISA, bevatten interessante informatie. Hier staan ook grote delen uit de ISO 7816 specs in.
http://www.smartcardsys.com is de home page van de PC/SC werkgroep, die een standaard smartcard API voor de PC ontwikkelt.

De informatie in 't Klaphek dient slechts een educatief doel. Gebruik van deze informatie zou strafbaar kunnen zijn. De redaktie wijst iedere verantwoordelijkheid voor gebruik door lezers van de in 't Klaphek opgenomen informatie af. De mening van een auteur weerspiegelt niet noodzakelijkerwijs de mening van de redaktie of uitgever.