this page was last updated on Thu Jun 24 09:07:13 CEST 1999

this protocol was decoded by W.J.Hengeveld

hier staat de (oudere) text versie van dit document.

hier is een korte beschrijving van het viditel protocol


na het inlog scherm: (pagina 900001a) dan komt het welkom scherm (pagina 1005a)
regel inhoud omschrijving
1datum (dd-mm-yyyy) server datum
2tijd (hh.mm.ss) server tijd
3"0603" server versie nummer
4nr1 challenge
5"0 017 0" onbekend, volgNrTAN, onbekend
6 -optioneel-
7naam account holder
8lastdate (dd-mm-yyyy) last logon date
9lasttime (hh.mm.ss) last logon time
10 -optioneel-
11 -optioneel-
12 -optioneel-
13 -optioneel-
14 -
15 -
16000 000 000 000 000 000 000 Volgnrs: Mut, Beleg, Saldi, Spaar, Perc, EffInfo, EffSaldi
170000000000000000 checksum
18 -
19 -
20 -
21 -
22 -optioneel-
23 -optioneel-
de checksum is de som van de volgende getallen: then transmitted:
7 x 3 digit decimal volgnrs Mut, Beleg, Saldi, Spaar, Perc, EffInfo, EffSaldi
7 digits gironr1
yyyymmdd girodatum1
16 digits header checksum
7 digits gironr2
yyyymmdd girodatum2
"N" "J" = new user ? (bij gtwin "1"
"N" "J" = change GIN?
"N" bij gtwin "3"
6 hex digits authentication (see below)
050 of 839
7 digits gironr3
yyyymmdd girodatum3
7 digits gironr4
yyyymmdd girodatum4
7 digits gironr5
yyyymmdd girodatum5
0603 client protocol versie
"_" (viewdata enter)

The headerchecksum is the decimal sum of the following values:

The order of the volgnrs is not quite sure yet.

The authentication value is calculated as follows: (zie ook deze source code)
ik definieer hiervoor de volgende functies:

ciphertext = desenc(key, plaintext)
deze functie vercijfert de plaintext met de key, het resultaat komt in ciphertext, dit is de standaard DES encryptie
encoded = encode(text)
deze functie spreidt de bits van ascii karakters van spatie - tilde wat meer uit over de 8 bits ruimte die daar beschikbaar voor is. (zie verder)
  1. key = encode(challenge)
  2. plain = encode(GIN + substr(girotelcode, 1, 2))
    This is the 6 digits of the GIN followed by the first 2 of the girotel codenr
  3. auth = desenc(key, plain) ^ plain
    this is the plaintext xored with the result of the DES encryption
  4. the authentication code is the first 6 hex digits of this 'auth' value

the 'encode function':
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
10: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
20: 0x40 0x5A 0x7F 0x5B 0x4A 0x6C 0x50 0x7D 0x4D 0x5D 0x5C 0x4E 0x6B 0x60 0x4B 0x61
30: 0xF0 0xF1 0xF2 0xF3 0xF4 0xF5 0xF6 0xF7 0xF8 0xF9 0x7A 0x5E 0x4C 0x7E 0x6E 0x6F
40: 0x7C 0xC1 0xC2 0xC3 0xC4 0xC5 0xC6 0xC7 0xC8 0xC9 0xD1 0xD2 0xD3 0xD4 0xD5 0xD6
50: 0xD7 0xD8 0xD9 0xE2 0xE3 0xE4 0xE5 0xE6 0xE7 0xE8 0xE9 0xAD 0xE0 0xBD 0x5F 0x7B
60: 0x6D 0x81 0x82 0x83 0x84 0x85 0x86 0x87 0x88 0x89 0x91 0x92 0x93 0x94 0x95 0x96
70: 0x97 0x98 0x99 0xA2 0xA3 0xA4 0xA5 0xA6 0xA7 0xA8 0xA9 0xC0 0x6A 0xD0 0xA1 0x00
80: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

then the server echos all this data, a POSTBANK string is sent.


Then these records are transmitted to the client: Followed by 'A00001065003020' the packet header
followed by '99|'
followed by '__'
Followed by 'A00001065003020' the packet header
followed by '99|'

followed by 'B..........0020' the packet header
followed by more type 20 transaction records
followed by 'B00000000000020' the packet header
followed by 'C..........6020' the packet header
the letter keeps increasing with every batch of updates
followed by a type 32 record
transactions(type 01 and 02) are sent after a 'A..........1180' message. after transactions are submitted a summary (type 12 records) is sent back to the client, after that the transaction is authorised by sending some cryptogrpahic hash (type 96 record)

the packet header

the checksum is the sum of the encoded packet contents, each multiplied by its position.
	for(i=0 ; i<packet.length ; i++)
		sum += (i+1) * encode(packet.byte[i]);

the the packet follows. the packet consists of transaction records of the following format:


transaction types:
rekening typen:
beleggings fondsen:
transaction records are delimited by "|"
transaction records look like this: bedragen worden genoteerd als volgt: record type 01 : plaats reservering met een type 12 packet wordt de naam van de rekening houder geretourneerd.

record type 02 : plaats reservering

record type 09 : intrekken reservering record type 12 : server bevestiging van reservering record type 13 : server: error in type 01 pakket record type 14 : commit, or end of transmission ? record type 20 : mutatie record record type 21 : nog niet uitgevoerde transactie(reservering) record type 22 : bericht record type 23 : saldo girorekening record type 24 : saldo spaar rekeningen record type 27 : koersen beleggings fondsen record type 28 : rente spaarrekeningen record type 32 : record type 33 : euro conversie factor record type 80 : file transfer record type 81 : change GIN record type 96 : authorize with TAN record type 97 : end of session(?) record type 98 : authorization result record type 99 : end of data exchange(?) - signals client should send possible TAN.
looking at appl.exe:
*14090520_ ?? special page