\documentclass[a4paper,oneside]{article}

\title{Schlumberger Multiflex 3K/8K and (limited) Cryptoflex}

\begin{document}

\maketitle

\tableofcontents

\section{Preface}

I wrote this document, because there is (Update: was) nearly no detailed
technical documentation available about chipcards.

The sources for this documentation are the Smartcard Developer Kit
(Can't say, that it is worth it's money. ''Handbuch der Chipkarten''
(or in English probably ''Handbook of Chipcards'') from Rankl and
Effing is a much better and at least in Germany much cheaper book.),
the data files of EZFormatter, the ''technical highlights'' from
Schlumberger (This is the ''manual'' which you can order there for
US\$5. Not that interesting, that it would justify that much money.),
usenet newsgroups and from experimenting with the card.

You can order Schlumberger cards (Multiflex 3K, Multiflex 8K, Cryptoflex
(if in the USA or Canada), Cyberflex (Java card), Payflex, etc.) in
quantities of 5 at their eshop at https://www.cyberflex.slb.com/.

\section{Commands}

%-------------------------------------------------------------------

\subsection{Change PIN}

\subsubsection*{Description}

Replaces the 8-byte PIN in the currently selected PIN file with
a new 8-byte value.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
F0 & 24 & 00 & 01 & 10 \\ \hline
\end{tabular}

\begin{description}
\item[Data1:] Current PIN (8 Byte filled up with FF)
\item[Data2:] New PIN (8 Byte filled up with FF)
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Check ROM}

\subsubsection*{Description}

Tests integrity of ROM code.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
?? & CC & ?? & ?? & ?? \\ \hline
\end{tabular}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|c|} \hline
?? & SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Create File}

\subsubsection*{Description}

Creates a new file in the current directory. The new file becomes
the current file.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
F0 & E0 & P1 & P2 & Lc \\ \hline
\end{tabular}

\begin{description}
\item[P1:] Initialization flag (00: Initialize, FF: Do not initialize)
\item[P2:] Number of records for (fixed-length?) record files
\item[Data1:] File description
\item[Data2:] First 6 bytes of cryptogram when required by access conditions.
\end{description}

\begin{table}[h!]
\caption{File description for creation of file}
\begin{center}
\begin{tabular}{|c|c|l|} \hline
Byte & Value & Meaning  \\ \hline \hline
1-2  &  FFFF  &  Unused  \\ \hline
3-4  &  -  &  Size (also for DF)  \\ \hline
5-6  &  -  &  FID  \\ \hline
7    &     &  File type  \\ \cline{2-3}
     &  01 &  Transparent file \\ \cline{2-3}
     &  02 &  Record file with fixed-length records \\ \cline{2-3}
     &  04 &  Record file with variable-length records \\ \cline{2-3}
     &  06 &  Cyclic file \\ \cline{2-3}
     &  38 &  Directory file  \\ \hline
8    &  -  &  Update access conditions (see below) \\ \hline
9-11 &     &  Access conditions (see below) \\ \hline
9 High &   &  DF: Directory (Only Multiflex 8K and Cryptoflex)\\
     &     &  EF: Read, Seek \\ \hline
9 Low &    &  DF: - \\
     &     &  EF: Update, Decrease, Decrease Stamped \\ \hline
10 High &  &  DF: Delete File \\
     &     &  EF: Increase, Increase Stamped \\\hline
10 Low &   &  DF: Create File \\
     &     &  EF: Create Record \\ \hline
11 High &  &  DF/EF: Rehabilitate \\ \hline
11 Low &   &  DF/EF: Invalitate \\ \hline
12   &     &  Status \\ \cline{2-3}
     &  00 &  blocked \\ \cline{2-3}
     &  01 &  unblocked \\ \hline
13   &  -  &  Number of following bytes \\ \hline
n - n+2 &- &  Access keys for access conditions \\
     &     &  (Nibble is cryptographic key number) \\ \hline
m    &  -  &  Record length (only for record files) \\ \hline
\end{tabular}
\end{center}
\end{table}

\begin{table}[h!]
\caption{Elementary file update access conditions}
\begin{center}
\begin{tabular}{|c|c|l|l|} \hline
Bit 8 & Bit 7 & Allowed Operations & Disallowed Operations \\ \hline \hline
0 & 0 & Update & Increase, Decrease \\ \hline
0 & 1 & Update, Increase & Decrease \\ \hline
1 & 0 & Update, Decrease & Increase \\ \hline
1 & 1 & Decrease, Increase & Update \\ \hline
\end{tabular}
\end{center}
\end{table}

\begin{table}[h!]
\caption{Identities or authentications for access conditions}
\begin{center}
\begin{tabular}{|l|c|} \hline
Key knowledge needed & Value of access condition nibble \\ \hline \hline
Always possible & 0 \\ \hline
PIN & 1 \\ \hline
Protected & 3 \\ \hline
Authenticated & 4 \\ \hline
PIN and protected & 6 \\ \hline
PIN and authenticated & 8 \\ \hline
Never possible & F \\ \hline
\end{tabular}
\end{center}
\end{table}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Create Record}

\subsubsection*{Description}

Creates a new record at the end of the current record file and
optionally write data to it. The filesize can still not be more
than allocated at creation time.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
C0 & E2 & 00 & 00 & Lc \\ \hline
\end{tabular}

\begin{description}
\item[Data1:] Data to be written to new record.
\item[Data2:] First 6 bytes of cryptogram when required by access conditions.
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Decrease}

\subsubsection*{Description}

The oldest (that is, previous) record in a cyclic file is overwritten
with the newest (that is, current) record, minus the amount given
in the command. This new record then becomes the current record.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
F0 & 30 & 00 & 00 & Lc \\ \hline
\end{tabular}

\begin{description}
\item[Data1:] 3 Byte value to be subtracted
\item[Data2:] First 6 bytes of cryptogram when required by access conditions.
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

Data may be available.

%-------------------------------------------------------------------

\subsection{Decrease Stamped (Only Multiflex 8K)}

\subsubsection*{Description}

The oldest (that is, previous) record in a cyclic file is overwritten
with the newest (that is, current) record, minus the amount given
in the command. This new record then becomes the current record.
Give Challenge must preceede this command.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
F0 & 34 & 00 & 00 & Lc \\ \hline
\end{tabular}

\begin{description}
\item[Data1:] 3 Byte value to be subtracted
\item[Data2:] First 6 bytes of cryptogram when required by access conditions.
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

Stamped data may be available.

\begin{table}[h!]
\caption{Stamped data}
\begin{center}
\begin{tabular}{|c|l|} \hline
Byte & Description \\ \hline \hline
1 - 3 & New value \\ \hline
4 - 6 & Ammount subtracted \\ \hline
7 - 12 (14?) & Cryptogram \\ \hline
\end{tabular}
\end{center}
\end{table}

%-------------------------------------------------------------------

\subsection{Delete File}

\subsubsection*{Description}

Deletes the named file.

It appears, that files in a DF can only be deleted in same order
as creation. Luckily whole DFs can be deleted.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
F0 & E4 & 00 & 00 & Lc \\ \hline
\end{tabular}

\begin{description}
\item[Data1:] 2 Byte file identifier
\item[Data2:] First 6 bytes of cryptogram when required by access conditions.
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Directory (Only Multiflex 8K and Cryptoflex)}

\subsubsection*{Description}

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Le \\ \hline \hline
F0 & A8 & 00 & 00 & 00 \\ \hline
\end{tabular}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

Directory data my be available.

\begin{table}[h!]
\caption{Directory data for each file}
\begin{center}
\begin{tabular}{|c|c|l|} \hline
Byte & Value & Meaning  \\ \hline \hline
1-2  &  -  &  DF: Free bytes available (?) \\
     &     &  EF: Size \\ \hline
3-4  &  -  &  FID  \\ \hline
5    &  -  &  File type \\ \hline
6    &  -  &  Status \\ \hline
7    &  -  &  Record length \\ \hline
8    &  -  &  Number of records \\ \hline
\end{tabular}
\end{center}
\end{table}

%-------------------------------------------------------------------

\subsection{External Authentication}

\subsubsection*{Description}

The terminal wishes to gain external authentication access to the
card without sending a key to it using Verify Key. It got a
challenge from the card using Get Challenge and is now going to
return its encryption of this challenge to prove it knows the key.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
C0 & 82 & 00 & 00 & 07 \\ \hline
\end{tabular}

\begin{description}
\item[Data1:] Key number (00-0F)
\item[Data2:] First 6 bytes of DES encrypted challenge
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Get Challenge}

\subsubsection*{Description}

The card is requested to send back an 8-byte challenge.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Le \\ \hline \hline
C0 & 84 & 00 & 00 & 08 \\ \hline
\end{tabular}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|c|} \hline
Challenge & SW1 & SW2 \\ \hline
\end{tabular}

\begin{description}
\item[Challenge:] 8 Byte random challenge to be used with External
     Authentication
\end{description}

%-------------------------------------------------------------------

\subsection{Get Response}

\subsubsection*{Description}

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Le \\ \hline \hline
C0 & C0 & 00 & 00 & Le \\ \hline
\end{tabular}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|c|} \hline
Data & SW1 & SW2 \\ \hline
\end{tabular}

\begin{description}
\item[Data:] Le Bytes of available data
\end{description}

%-------------------------------------------------------------------

\subsection{Give Challenge (Only Multiflex 8K)}

\subsubsection*{Description}

Sends a 8-byte challenge to the card.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
F0 & 86 & 00 & 00 & 08 \\ \hline
\end{tabular}

\begin{description}
\item[Data:] 8 Byte random challenge
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Increase}

\subsubsection*{Description}

The oldest (i.e., previous) record in a cyclic file is overwritten
with the newest (i.e., current) record, plus the amount given in the
command. This new record then becomes the current record.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
F0 & 32 & 00 & 00 & Lc \\ \hline
\end{tabular}

\begin{description}
\item[Data1:] 3 Byte numeric value to be added
\item[Data2:] First 6 bytes of cryptogram when required by access conditions.
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

Data may be available.

%-------------------------------------------------------------------

\subsection{Increase Stamped (Only Multiflex 8K)}

\subsubsection*{Description}

The oldest (i.e., previous) record in a cyclic file is overwritten
with the newest (i.e., current) record, plus the amount given in the
command. This new record then becomes the current record.
Give Challenge must preceede this command.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
F0 & 36 & 00 & 00 & Lc \\ \hline
\end{tabular}

\begin{description}
\item[Data1:] 3 Byte numeric value to be added
\item[Data2:] First 6 bytes of cryptogram when required by access conditions.
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

Stamped data may be available.

\begin{table}[h!]
\caption{Stamped data}
\begin{center}
\begin{tabular}{|c|l|} \hline
Byte & Description \\ \hline \hline
1 - 3 & New value \\ \hline
4 - 6 & Ammount subtracted \\ \hline
7 - 12 (14?) & Cryptogram \\ \hline
\end{tabular}
\end{center}
\end{table}

%-------------------------------------------------------------------

\subsection{Internal Authentication}

\subsubsection*{Description}

The terminal wishes to authenticate the card to ensure it is a
valid card, so it sends the card a challenge that the card must
encrypt using a specified key in the internal authorization
file (0001) for the current directory. A following Get Response
command returns the first 6 bytes of the DES encryption of
the challenge using the indicated key.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
C0 & 88 & 00 & P2 & 08 \\ \hline
\end{tabular}

\begin{description}
\item[P2:] Key number (00-0F)
\item[Data:] 8 Byte challenge
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

Data may be available.

%-------------------------------------------------------------------

\subsection{Internal RSA Authentication (Only Cryptoflex)}

\subsubsection*{Description}

''Signs a message given by the external world using RSA.''

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
94 & 42 & 00 & KeyNum & 80 \\ \hline
\end{tabular}

\begin{description}
\item[KeyNum:] RSA key number
\item[Data:] Data
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Invalidate}

\subsubsection*{Description}

The currently selected elementary file is invalidated and will
subsequently only respond successfully to the Selected File and
Rehabilitate commands.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
F0 & 04 & 00 & 00 & Lc \\ \hline
\end{tabular}

\begin{description}
\item[Data:] First 6 bytes of cryptogram when required by access conditions.
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Key Generation (Only Cryptoflex)}

\subsubsection*{Description}

Generates 1024bit RSA key.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
F0 & 14 & 00 & KeyNum & 00 \\ \hline
\end{tabular}

\begin{description}
\item[KeyNum:] RSA key number
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Load Certificate (Only Cryptoflex)}

\subsubsection*{Description}

''Loads a certificate signed by a certificate authority and extracts
the application's RSA public key from it.''

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
F0 & 84 & 00 & KeyNum & 80 \\ \hline
\end{tabular}

\begin{description}
\item[KeyNum:] RSA key number
\item[Data:] RSA public key
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Load EXE}

\subsubsection*{Description}

Loads executable code into EEPROM to add new functions.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
F0 & F4 & ?? & ?? & ?? \\ \hline
\end{tabular}

Arguments: FID, Data

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|c|} \hline
?? & SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Read Binary}

\subsubsection*{Description}

Reads a sequence of bytes from the currently selected transparent file.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Le \\ \hline \hline
C0 & B0 & P1 & P2 & Le \\ \hline
\end{tabular}

\begin{description}
\item[P1:] High byte of the 2-byte offset
\item[P2:] Low byte of the 2-byte offset
\item[Le:] Number of bytes to read starting at the offset byte
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|c|} \hline
Data & SW1 & SW2 \\ \hline
\end{tabular}

\begin{description}
\item[Data:] Le Bytes of data from file
\end{description}

%-------------------------------------------------------------------

\subsection{Read Header (Only Multiflex 8K and Cryptoflex)}

\subsubsection*{Description}

Retrives detailed information on current file descriptor.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
?? & ?? & ?? & ?? & ?? \\ \hline
\end{tabular}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|c|} \hline
?? & SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Read EEPROM}

\subsubsection*{Description}

Reads EEPROM test zone.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Le \\ \hline \hline
?? & BA & ?? & ?? & ?? \\ \hline
\end{tabular}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|c|} \hline
?? & SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Read Record}

\subsubsection*{Description}

Reads one record from the currently selected record file.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Le \\ \hline \hline
C0 & B2 & P1 & P2 & Le \\ \hline
\end{tabular}

\begin{description}
\item[P1:] Index of record to be read (00: current record)
\item[P2:] Selection of the record to be read (00: first record,
     01: last record, 02: next record, 03: previous record,
     04: current record if index is 00, else index record)
\item[Le:] Bytes to read (Must be equal record length)
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|c|} \hline
Data & SW1 & SW2 \\ \hline
\end{tabular}

\begin{description}
\item[Data:] Le Bytes of data from record
\end{description}

%-------------------------------------------------------------------

\subsection{Read Status (Only Multiflex 8K and Cryptoflex)}

\subsubsection*{Description}

Lists status and context variables.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
?? & ?? & ?? & ?? & ?? \\ \hline
\end{tabular}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|c|} \hline
?? & SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Rehabilitate}

\subsubsection*{Description}

The currently selected elementary file is rehabilitated (that is,
removed from invalidated status).

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
F0 & 44 & 00 & 00 & Lc \\ \hline
\end{tabular}

\begin{description}
\item[Data:] First 6 bytes of cryptogram when required by access conditions.
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Seek}

\subsubsection*{Description}

Locate a record in a linear record file by matching a pattern of
characters to the characters in each record starting at a given
offset from the beginning of the record

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
F0 & A2 & P1 & P2 & Lc \\ \hline
\end{tabular}

\begin{description}
\item[P1:] Offset
\item[P2:] Search mode (00: from first record, 02: from next record)
\item[Data:] Character string to be matched
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Select File}

\subsubsection*{Description}

The file whose file ID is given in the data field of the command becomes
the currently selected file. It must be a file in the currently selected
directory. If the named file is a directory, then it becomes the currently
selected directory. If the file identifier is 0x3F00 it is always the
master files selected. If the file identifier is the directory file
directly above the current file it becomes the current file.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
C0 & A4 & 00 & 00 & 02 \\ \hline
\end{tabular}

\begin{description}
\item[Data:] 2-Byte file identifier
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

File description data my be available.

\begin{table}[h!]
\caption{File description for selection of file}
\begin{center}
\begin{tabular}{|c|c|l|} \hline
Byte & Value & Meaning  \\ \hline \hline
1-2  &  -  &  Unused  \\ \hline
3-4  &  -  &  DF: Free bytes available  \\
     &     &  EF: Size \\ \hline
5-6  &  -  &  FID  \\ \hline
7    &     &  File type  \\ \cline{2-3}
     &  01 &  Transparent file \\ \cline{2-3}
     &  02 &  Record file with fixed-length records \\ \cline{2-3}
     &  04 &  Record file with variable-length records \\ \cline{2-3}
     &  06 &  Cyclic file \\ \cline{2-3}
     &  38 &  Directory file  \\ \hline
8    &  -  &  Update access conditions (see Create File) \\
     &     &  Unused of directory files \\ \hline
9-11 &     &  Access conditions (see Create File) \\ \hline
9 High &   &  DF: Directory \\
     &     &  EF: Read, Seek \\ \hline
9 Low &    &  DF: - \\
     &     &  EF: Update, Decrease, Decrease Stamped \\ \hline
10 High &  &  DF: Delete File \\
     &     &  EF: Increase, Increase Stamped \\\hline
10 Low &   &  DF: Create File \\
     &     &  EF: Create Record \\ \hline
11 High &  &  DF/EF: Rehabilitate \\ \hline
11 Low &   &  DF/EF: Invalitate \\ \hline
12   &     &  Status \\ \cline{2-3}
     &  00 &  blocked \\ \cline{2-3}
     &  01 &  unblocked \\ \hline
     &     &  \\ \hline
     &     &  Directory files: \\ \hline
13   &  05 &  Number of following bytes \\ \hline
14   &  -  &  Unused \\ \hline
15   &  -  &  Number of subdirectories in this directory \\ \hline
16   &  -  &  Number of elementary files in this directory \\ \hline
17   &  -  &  Number of secret codes in this directory \\ \hline
18   &  -  &  Unused \\ \hline
19   &  -  &  Status of the PIN for this directory \\ \hline
20   &  -  &  Status of the PIN unblocking key \\ \hline
     &     &  \\ \hline
     &     &  Elementary files: \\ \hline
13   &  01 &  Number of following bytes \\ \hline
14   &  -  &  Unused \\ \hline
15   &  -  &  Length of record in fixed-length record files \\
     &     &  (00 for non-record files) \\ \hline
\end{tabular}
\end{center}
\end{table}

%-------------------------------------------------------------------

\subsection{Unblock PIN}

\subsubsection*{Description}

The selected PIN file has become blocked because the number of
presentations of an incorrect PIN has exceeded the number of
allowed tries. This command will unblock the PIN file and
reset the PIN to a new value.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
F0 & 2C & 00 & 01 & 10 \\ \hline
\end{tabular}

\begin{description}
\item[Data1:] 8-Byte unblocking PIN for current PIN file
\item[Data2:] 8-Byte new PIN
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Update Binary}

\subsubsection*{Description}

A sequence of bytes is written into thee currently selcted transparent
elementary file.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
C0 & D6 & P1 & P2 & Lc \\ \hline
\end{tabular}

\begin{description}
\item[P1:] High byte of the 2-byte offset
\item[P2:] Low byte of the 2-byte offset
\item[Lc:] Number of bytes to be written into the file starting at
     the offset byte; +6 if cryptogram is provided
\item[Data1:] Data to be written starting at he offset byte
\item[Data2:] First 6 bytes of cryptogram when required by access conditions.
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Update Key Enciphered (Only Cryptoflex)}

\subsubsection*{Description}

''Receives enciphered data by means of the DES algorithm.''

(Is this Update Binary with cryptogram?)

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Le \\ \hline \hline
C0 & DE & P1 & P2 & Le \\ \hline
\end{tabular}

\begin{description}
\item[P1:] High offset
\item[P2:] Low offset
\item[Data:] Data
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Update Record}

\subsubsection*{Description}

One record in the currently slected record file is overwritten
with new data.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
C0 & DC & P1 & P2 & Lc \\ \hline
\end{tabular}

\begin{description}
\item[P1:] Index of record to be overwritten (00: current record)
\item[P2:] Selection of the record to be overwritten (00: first record,
     01: last record, 02: next record, 03: previous record,
     04: current record if index is 00, else index record)
\item[Le:] Bytes to be written (Must be equal record length);
     +6 if cryptogram is provided
\item[Data1:] Data to be written
\item[Data2:] First 6 bytes of cryptogram when required by access conditions.
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Verify Data (Only Cryptoflex)}

\subsubsection*{Description}

''Authenticates data signed and sent by the application. The length
of the applied RSA is 1024 bits.''

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
F0 & 82 & 00 & KeyNum(?) & 80 \\ \hline
\end{tabular}

\begin{description}
\item[KeyNum:] RSA key number
\item[Data:] Data
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Verify Key}

\subsubsection*{Description}

Match a byte sequence with a key in the external authorization file
(0011) for the current directory. If the match is exact, external
authorization access priviledges are granted.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
F0 & 2A & 00 & P2 & Lc \\ \hline
\end{tabular}

\begin{description}
\item[P2:] Key number (00-0F)
\item[Data:] Key
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Verify PIN}

\subsubsection*{Description}

Attempt to match the 8 bytes in the command with the 8-byte PIN
in the PIN file for the current directory. If the match is exact
the PIN access priviledges are granted.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
C0 & 20 & 00 & 01 & 08 \\ \hline
\end{tabular}

\begin{description}
\item[Data:] 8-Byte PIN
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Verify Pub Key (Only Cryptoflex)}

\subsubsection*{Description}

''Receives the public key of the application Kp\_App in plain text
and in full length for verification with a previously extracted
public key (see Load Certificate).''

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
F0 & 86 & 00 & KeyNum(?) & 80 \\ \hline
\end{tabular}

\begin{description}
\item[KeyNum:] RSA key number
\item[Data:] Data
\end{description}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|} \hline
SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\subsection{Write EEPROM}

\subsubsection*{Description}

Writes to EEPROM test zone.

\subsubsection*{C-APDU}

\begin{tabular}{|c|c|c|c|c|} \hline
CLA & INS & P1 & P2 & Lc \\ \hline \hline
?? & B8 & ?? & ?? & ?? \\ \hline
\end{tabular}

\subsubsection*{R-APDU}

\begin{tabular}{|c|c|c|} \hline
?? & SW1 & SW2 \\ \hline
\end{tabular}

%-------------------------------------------------------------------

\section{File Structures}

\subsection{Important files}

\begin{center}
\begin{tabular}{|c|l|l|c|} \hline
FID   & File Name & Contents & Max. Num. \\ \hline
      &           &          & of Keys     \\ \hline \hline
0000 & PIN file & PIN code & 1 \\ \hline
0001 & Internal authentication file & Internal cryptographic keys & 16 \\ \hline
0002 & Serial number file & Serial number, customer ID, etc. & \\ \hline
0011 & External authentication file & External cryptographic keys & 16 \\ \hline
3F00 & Master File & & \\ \hline
\end{tabular}
\end{center}

\subsection{Record file sizes}

\begin{center}
\begin{tabular}{|l|c|c|} \hline
File type & Maximum & Maximum \\
 & Record Size & Number of Records \\ \hline \hline
Record file with fixed-length records & 255 Bytes & 255 \\ \hline
Record file with variable-length records & 255 Bytes & 255 \\ \hline
Cyclic file & 255 Bytes & 255 \\ \hline
\end{tabular}
\end{center}

\subsection{Serial number file}

\begin{center}
\begin{tabular}{|c|l|} \hline
Bytes & Description \\ \hline \hline
1 - 4 & Series number \\ \hline
5     & Customer identification code \\ \hline
6 - 7 & Schlumberger manufacturing site \\ \hline
8     & Usage \\ \hline
\end{tabular}
\end{center}

\subsection{PIN file}

\begin{center}
\begin{tabular}{|c|l|} \hline
Bytes & Description \\ \hline \hline
1     & Activation byte (00: PIN blocked, FF: unblocked) \\ \hline
2 - 3 & RFU \\ \hline
4 - 11 & PIN code (FF: Byte is ignored) \\ \hline
12    & Attempts allowed \\ \hline
13    & Attempts remaining \\ \hline
14 - 21 & Unblocking PIN code (FF: Byte is ignored) \\ \hline
22    & Unblocking attempts allowed \\ \hline
23    & Unblocking attempts remaining \\ \hline
\end{tabular}
\end{center}

\subsection{Authentication key files}

\begin{center}
\begin{tabular}{|c|l|} \hline
Bytes & Description \\ \hline \hline
1     & Unused \\ \hline
2     & Length of key 0 (Normally 8, because of DES) \\ \hline
3     & Algorithm for key 0 (0: DES) \\ \hline
4 - 11 & Key 0 (when 8 bytes long) \\ \hline
12    & Maximum attempts for key 0 \\ \hline
13    & Remaining attempts for key 0 \\ \hline
14 -  & For next keys repeate bytes 2 - 13 \\ \hline
\end{tabular}
\end{center}

Default external authentication key file in MF contains keys 0, 1 and 2.
Key 1 is set to 47h 46h 58h 49h 32h 56h 78h 40h. You have three tries
to present the correct key. This is valid for the cards which come with
the SCDK and the cards ordered at the web site mentioned in the preface.

\section{Misc}

\subsection{Validity of PINs and cryptographics keys}

PINs and cryptographics keys are valid in the directory of the key
files and all subdirectories where no appropriate key file is.

The cryptogram ist the first 6 bytes of a DES-encrypted challenge.
(SCDK varies between 6 and 8 bytes, but most of the time it is 6 bytes.)

\subsection{Cryptogram}

The normal command excluding the CLA byte is filled up with 0xFF
up to a multiple of 8 bytes. The maximum data size is 24 bytes.
This data is encrypted with DES-CBC with a previously fetched
challenge as an initial vector. The first 6 bytes of the last
encrypted block is the cryptogram.

To use this cryptogram send everything of the above data starting
at the length byte including the filling bytes up to the cryptogram
as the data of the instruction and adjust the Lc byte of the real
header accordingly.

\subsection{ATR}

\begin{center}
\begin{tabular}{|l|l|} \hline
Card & ATR \\ \hline \hline
Multiflex 3K - G1 & 3B 02 14 50 \\ \hline
Multiflex 3K - G1 & 3B 32 15 00 06 80 \\ \hline
Multiflex 8K & 3B 32 15 00 06 80 \\ \hline
Cryptoflex & 3B 63 00 00 36 41 80 \\ \hline
\end{tabular}
\end{center}

\subsection{Status words}

\begin{center}
\begin{tabular}{|c|l|} \hline
Status word & Description \\ \hline \hline
61 XX & Command executed successfully; XX bytes available \\ \hline
62 81 & Data my be corrupted \\ \hline
62 83 & Current directory/file is invalidated \\ \hline
63 00 & Invalid PIN/cryptogram \\ \hline
65 00 & Too much data for protected-mode \\ \hline
65 81 & Memory problem \\ \hline
65 81 & Update impossible \\ \hline
67 XX & Incorrect P3; expected XX \\ \hline
69 81 & No PIN or key defined \\ \hline
69 82 & Access condition not fulfilled \\ \hline
69 83 & (Unblocking) PIN/Key currently blocked \\ \hline
69 85 & No Get Challenge immediately preceding command \\ \hline
69 86 & Currently selected file is not a cyclic file \\ \hline
69 86 & No file selected \\ \hline
6A 80 & Pattern not found \\ \hline
6A 80 & File ID already in use in this directory \\ \hline
6A 80 & Record length value is too large \\ \hline
6A 80 & Type of current file is inconsistent with command \\ \hline
6A 82 & File ID not found \\ \hline
6A 83 & Record index out of range \\ \hline
6A 84 & Insufficient memory space available \\ \hline
6B 00 & Incorrect P1 or P2 \\ \hline
6B 00 & Offset out of range \\ \hline
6D 00 & Unknown INS \\ \hline
6E 00 & Unknown CLA \\ \hline
6F 00 & Internal problem \\ \hline
90 00 & Command executed successfully \\ \hline
98 50 & Decrease cannot be performed; \\
      & new value would be less than minimum \\ \hline
\end{tabular}
\end{center}

\end{document}


