Hi!

I've got a GPK-800 card and a gcr-410 reader and am experimenting with
reading and writing files to the card. I try creating a 1KB file, writing
data to it and reading it back, but I get corrupted data.

The first 300 bytes (exactly!) are OK, but then there are errors. I'm
enclosing the program (FileTest.java) and the input files (no extension) and
output files (.1 .2 and .xor files). The .xor files show the exclusive or of
the data before being written to the card and after being read back, i.e.
errors.

Actually, the corruption depends on what I send. If I write plain zeroes or
ones I get no corruption. If I write random data (taken from /dev/urandom) I
get corruption. I'm only including one set of in/out files for random data
and no one or zero data. You can imagine what it looks like :)

I've ordered a book,
  1 "Smart Card Handbook"
  Wolfgang Rankl, Wolfgang Effing;
which I hope explains generla smart-card things that you are basically
assumed to know about when readng the java documentation (what is a cyclic
file? what file ID's are legal?), but this is so weird that I thought I'd
ask straight away.

Logi
// Java Imports
import java.io.*;
import java.util.*;
import java.util.zip.*;

// Opencard Imports
import opencard.core.*;
import opencard.core.service.*;
import opencard.core.terminal.*;
import opencard.core.util.HexString;
import opencard.opt.security.*;
import opencard.opt.iso.fs.*;

// Gemplus imports
import com.gemplus.opencard.service.gpk.admin.*;
import com.gemplus.opencard.service.gpk.file.*;
import com.gemplus.opencard.service.gpk.security.*;
import com.gemplus.opencard.service.gpk.signature.*;

public class FileTest  {

   public static void main(String[] args) throws Exception {
      SmartCard.start();

      String fn;
      byte[] data1; // test data to write
	{
	   fn = args[0];
	   File df = new File(fn);
	   data1 = new byte[(int)df.length()];
	   InputStream in = new FileInputStream(df);
	   in.read(data1);
	   in.close();
	}
      
      SmartCard card; // smart card to use
        {
	   // wait for a smartcard with file access support
	   System.out.print("Waiting for card...");
	   System.out.flush();
	   CardRequest cr = new CardRequest(CardRequest.ANYCARD, null, null);
	   card = SmartCard.waitForCard(cr);
	   System.out.println(" OK");
	}
	 
      // needed card services
      FileSystemCardService    fss = (FileSystemCardService)    card.getCardService(FileSystemCardService.class,     true);
      GPKFileUtilityService    fus = (GPKFileUtilityService)    card.getCardService(GPKFileUtilityService.class,    true);
      FileAccessCardService    fas = (FileAccessCardService)    card.getCardService(FileAccessCardService.class,     true);

	{
	   System.out.println("Erasing Card...");
	   fus.eraseCard();
	}
      
	{
	   // Provide credentials for Administrative key :3F00:3F01
	   CredentialBag               bag = new CredentialBag();
	   GPKCredentialStore          store = new GPKCredentialStore();
	   GPKAdministrativeCredential credential = new GPKAdministrativeCredential();
	   
	   store.storeCredential(0, credential);
	   bag.addCredentialStore(store);
	   fss.provideCredentials(new CardFilePath(":3F00:3F01"), bag);
	}

      CardFilePath path;
	{
	   // Create file and write data
	   CardFile root = new CardFile(fas);
	   path = root.getPath().append(new CardFilePath(":c009"));
	   
	   System.out.println("Creating file "+path);
	   fus.createTransparentFile(path, data1.length, null);
	   CardFile cf = new CardFile(fas, path);
	   
	   System.out.println("Writing "+data1.length+" bytes to "+cf);
	   OutputStream out = new CardFileOutputStream(cf);
	   out.write(data1);
	   out.close();
	}

	{
	   // write file to disk (just to be sure it wasn't read wrong in
	   // the first place)
	   PrintWriter backOut = new PrintWriter(new OutputStreamWriter(new FileOutputStream(fn+".1")));
	   backOut.println(HexString.hexify(data1));
	   backOut.close();
	}

      byte[] data2;
	{ 
	   // read the data back in
	   CardFile cf = new CardFile(fas, path);
      
	   InputStream in = new CardFileInputStream(cf);
	   data2 = new byte[cf.getLength()];
	   int n=0;
	   while(n<data2.length) {
	      int l = in.read(data2,n,data2.length-n);
	      if(l<0)
		throw new IOException("File is too short, only "+n+" bytes");
	      n+=l;
	   }
	}
      
	{
	   // write the re-read data
	   PrintWriter backOut = new PrintWriter(new OutputStreamWriter(new FileOutputStream(fn+".2")));
	   backOut.println(HexString.hexify(data2));
	   backOut.close();
	}

	{
	   // write the xor of the data before it went to the card and after
	   byte[] datax = new byte[data1.length];
	   for(int i=0; i<datax.length; i++) 
	     datax[i] = (byte)(data1[i] ^ data2[i]);
	   PrintWriter backOut = new PrintWriter(new OutputStreamWriter(new FileOutputStream(fn+".xor")));
	   backOut.println(HexString.hexify(datax));
	   backOut.close();
	}
      
   }
   
}
AD BB 0E B5 CD EF 83 92 06 85 3C 6F C5 28 64 C8
DB C1 31 79 B2 30 26 3C 06 DE 03 6C C3 31 46 54
C9 8A 2A 45 5F 1E 44 D1 32 94 22 DC E2 3C 52 2A
89 37 C8 A8 6A 0C F3 D3 75 56 87 E4 1C 26 6F 09
DD 9A 7E 51 1A CC 98 90 A9 C9 FF 45 7F 9A E6 87
74 42 91 71 29 C9 A6 EF 1E 56 A5 66 40 21 2B 16
45 2A FF A6 27 70 04 94 F3 19 81 EE E2 CB F8 5C
B8 9A 83 6F 59 92 40 81 70 97 3A B1 EA 90 EC 91
81 26 7A CD ED FA B1 05 D7 34 E7 F6 C0 A7 CE 6A
2D CB BF 02 DE CA DA B0 EE 34 FF 49 E4 D7 20 91
B7 6D 0A C2 69 21 F5 73 69 B9 9A 30 46 A6 DC D1
7C E9 D6 83 51 78 66 AF 7D 88 6D F1 E4 24 3E 51
D3 C9 66 1C 6C 3B 1F 3B 65 A9 9C 79 29 EE DA 70
5E 47 B4 53 5A 48 0B 1D BC F3 89 96 4E 7C 0C B4
64 1C 32 D8 D1 3B 07 58 06 4D 1C 9D 31 12 55 C5
BF 02 34 F8 D4 6C 48 4E F5 94 37 C9 D3 81 C0 8E
02 85 5E A5 54 D5 0B 4E E0 A6 BF 80 4C E5 3F 1F
A5 52 EC AC BF BD 6D 4E 9B 07 26 E3 6A 73 C5 71
5D 41 E3 7A 34 4E 04 34 08 D3 0F 1F 1C 5C D3 21
10 0D B4 B7 5F 0E AE B8 F2 2B A8 5D 0C EC 01 E0
C2 FD 12 23 69 05 F5 58 7C 77 55 2F 39 F2 F1 36
C3 49 31 5E 54 67 9C 7D 0B B9 D3 95 94 B4 4A 92
16 65 38 79 18 EB 98 08 F0 68 3E 59 5A E1 76 B0
F3 25 DC C6 98 89 18 CF A7 EA 42 EA 52 A0 28 8C
39 EC 75 27 4A AE 86 56 FC 74 46 5B 53 A7 E5 3B
26 FD 34 F5 72 83 2A AB 79 16 E4 4B E4 5B B1 D7
27 43 87 BB 11 E9 F7 7E B5 A0 4E 82 46 67 9F 81
7A 25 DE 47 69 59 B5 F6 C9 17 36 6A 23 67 5E 7B
C0 FE E2 26 BA 77 17 A4 03 D3 92 85 2A 91 52 50
73 60 46 10 C2 C4 9A 3E 0A 7E DF 58 44 74 0F 9F
90 01 5C BB DB 0F 86 3C 62 9B 98 DD 4D EA 8C 45
A8 8E 67 48 79 CD 1B EC 80 85 FB 7B E3 74 22 7F
EC 6B C4 86 2C 5F 3C 2F 01 3F F7 3A 5C 6B 31 2E
8B 0A 44 AE 04 98 6A 63 19 79 9A 25 11 7A F8 24
32 A7 DD FB A0 E8 C3 EA 52 B3 1D 88 CC BE CE 92
B5 DC 75 27 0E 0E 55 3B 3E 29 6C 35 F5 BD 0A ED
42 D5 6C DB 38 63 4F 56 02 F3 36 D8 F2 91 91 BB
C5 37 32 93 04 4B 32 D1 7E DF 12 FF 9D F0 D2 D3
BE 8D 34 A5 BB EA 41 9B 4D 1F 0E 0A 09 E9 F1 41
C0 6E C4 7A D7 94 F7 D0 66 7A DF 7B 25 D1 43 34
61 CD 2A 3B CB 22 62 E9 A7 AD E6 F0 D6 4E BD 28
7C 88 72 DD 50 68 F5 54 BA 51 4E 19 3F 37 25 4B
22 B3 62 F6 14 7B 5B AE EC CC 36 56 C0 C2 19 27
00 17 02 EE 38 52 E9 B7 43 0E 99 4C 7F 14 9D 6B
41 26 3A 99 62 70 B9 0F 39 08 37 E6 4B 10 3D E8
A8 8D 30 A1 CE 9C 17 1F DE 84 19 8E 5A 89 83 74
AA EF 38 7D 8A 39 B6 19 97 1A 8C 56 58 CA B6 6F
E3 AE 49 23 50 83 78 96 84 0F 19 7B B4 21 E5 1C
C9 12 49 E9 A1 6D 9B 7A B5 28 C2 4F 0C A0 D7 34
E6 96 93 12 77 1E 7E FA 9A 25 CC A8 F4 F4 09 E0
00 76 D3 2E BC AE D6 D0 92 A6 06 4D D7 2A 09 83
E5 C4 3F BC 64 80 93 98 E4 99 9E 32 7F 9F DE 85
49 50 5C 7C D0 07 61 27 AC AF 1F C1 AF 44 6E 36
4A 27 42 EB B0 02 29 1E 50 0B 5C 59 43 AF C4 0B
D8 A1 5A 27 23 3F 84 25 CA A5 3C DA 2E CC 32 37
9C CC 33 7B 59 C6 69 C2 4A 2F 9E 1B E6 2C E2 4E
AE 22 4F DC BA 15 9C 43 90 CD DC D6 5C 7A 23 BF
EF 02 FB 68 15 9A 71 D0 C1 2E A2 2E 5D 93 EF BA
18 67 6B 7C F1 8A 87 BB 2B 59 DA F5 70 98 EE AF
E5 CE F7 A7 2B B3 25 70 C9 BB 58 C8 E3 B6 0D 17
95 55 D3 04 61 A4 95 EB B8 3F 7B BD 7E D6 89 79
6C AA E8 5A 58 28 83 5D D1 DC E0 3B 73 F2 90 F1
3E 49 AF 26 DF 10 25 71 77 FF CE 67 00 AA A1 29
BB 21 16 22 49 30 0B 0D F1 5B 14 89 18 5C 0B D1

AD BB 0E B5 CD EF 83 92 06 85 3C 6F C5 28 64 C8
DB C1 31 79 B2 30 26 3C 06 DE 03 6C C3 31 46 54
C9 8A 2A 45 5F 1E 44 D1 32 94 22 DC E2 3C 52 2A
89 37 C8 A8 6A 0C F3 D3 75 56 87 E4 1C 26 6F 09
DD 9A 7E 51 1A CC 98 90 A9 C9 FF 45 7F 9A E6 87
74 42 91 71 29 C9 A6 EF 1E 56 A5 66 40 21 2B 16
45 2A FF A6 27 70 04 94 F3 19 81 EE E2 CB F8 5C
B8 9A 83 6F 59 92 40 81 70 97 3A B1 EA 90 EC 91
81 26 7A CD ED FA B1 05 D7 34 E7 F6 C0 A7 CE 6A
2D CB BF 02 DE CA DA B0 EE 34 FF 49 E4 D7 20 91
B7 6D 0A C2 69 21 F5 73 69 B9 9A 30 46 A6 DC D1
7C E9 D6 83 51 78 66 AF 7D 88 6D F1 E4 24 3E 51
D3 C9 66 1C 6C 3B 1F 3B 65 A9 9C 79 29 EE DA 70
5E 47 B4 53 5A 48 0B 1D BC F3 89 96 4E 7C 0C B4
64 1C 32 D8 D1 3B 07 58 06 4D 1C 9D 31 12 55 C5
BF 02 34 F8 D4 6C 48 4E F5 94 37 C9 D3 81 C0 8E
02 85 5E A5 54 D5 0B 4E E0 A6 BF 80 4C E5 3F 1F
A5 52 EC AC BF BD 6D 4E 9B 07 26 E3 6A 73 C5 71
5D 41 E3 7A 34 4E 04 34 08 D3 0F 1F FE 7C D3 2B
99 3F FC BF 7F 0E FF FB F7 7F AF FD 1C EE 6F E9
DF FF 7E 73 7B CD FD D8 FD FF FF 6F 7F FA F7 B7
F7 4B B1 7F 7D EF BE FF 1F FF F7 F7 D4 B5 6B 96
57 6F FF FF 3F FB 9C 9C F3 79 BF FF FA EB FE FC
FB BF DF EF D9 9B 58 CF F7 FF 7A FB FA B0 EC 9D
B9 EE 7F EF EF FE B7 57 FF 74 E7 FF D3 A7 EF 7B
2F FF BF F7 FE CB FA BB FF 36 FF 4B E4 DF B1 D7
B7 6F 8F FB 79 E9 F7 7F FD B9 DE B2 46 E7 DF D1
7E ED DE C7 79 79 F7 FF FD 9F 7F FB E7 67 7E 7B
D3 FF E6 3E FE 7F 1F BF 67 FB 9E FD 2B FF DA 70
7F 67 F6 53 DA CC 9B 3F BE FF DF DE 4E 7C 0F BF
F4 1D 7E FB DB 3F 87 7C 66 DF 9C DD 7D FA DD C5
BF 8E 77 F8 FD ED 5B EE F5 95 FF FB F3 F5 E2 FF
EE EF DE A7 7C DF 3F 6F E1 BF FF BA 5C EF 3F 3F
AF 5A EC AE BF BD 6F 6F 9B 7F BE E7 D3 7B FE 74
FB AF FF FF FF FE C7 FB 72 B7 3F DC EE BE DE BA
BD FF FD AF 6E 0E F7 FB 7F 7F EF F5 FD BF 6F ED
DF DF 7E DB 3A EF DF D6 AB FB FF DD FF 9B F7 BF
F5 77 B3 F3 2D CB B6 FF 7E DF B7 FF DD F1 FB D7
FF AF FF A7 BF FA 45 9F FF 1F 8F EE EB EB F9 5D
F8 FE C7 7F DF 96 F7 D1 76 FF FF FB EF D1 EF B5
E1 EF 7A FF EF FA F3 ED F7 BD E7 F6 D6 EF FF 6A
7D CB FF DF DE EA FF F4 FE 75 FF 59 FF F7 25 DB
B7 FF 6A F6 7D 7B FF FF ED FD BE 76 C6 E6 DD F7
7C FF D6 EF 79 7A EF BF 7F 8E FD FD FF 34 BF 7B
D3 EF 7E 9D 6E 7B BF 3F 7D A9 BF FF 6B FE FF F8
FE CF B4 F3 DE DC 1F 1F FE F7 99 9E 5E FD 8F F4
EE FF 3A FD DB 3B B7 59 97 5F 9C DF 79 DA F7 EF
FF AE 7D FB D4 EF 78 DE F5 9F 3F FB F7 A1 E5 9E
CB 97 5F ED F5 FD 9B 7E F5 AE FF CF CD A8 F7 FC
FF D7 B3 7B F7 3E 7E FE 9E FF CF EC F7 F5 4F F4
C9 FE FB 6F FF BE D6 D1 B2 B6 26 DD F7 3E 5B AB
ED F7 FF BC 6E 8C F3 DB F5 DF 9F F6 7F BF FF 8D
DD DA 7E 7D DA CF F9 B7 AD EF FF C5 FF DE EE B7
7E 67 D3 FB B9 CB AF FF 5E 5F FD 7F 43 AF EF 1F
DD AB FF A7 27 7F 84 B5 FB BD BD FE EE CF FA 7F
BC DE B3 7F 59 D6 69 C3 7A BF BE BB EE BC EE DF
AF 26 7F DD FF FF BD 47 D7 FD FF F6 DC FF EF FF
EF CB FF 6A DF DA FB F0 EF 3E FF 6F FD D7 EF BB
BF 6F 6B FE F9 AB F7 FB 6B F9 DA F5 76 BE FE FF
FD EF F7 A7 7B FB 67 FF FD BB 7D F9 E7 B6 3F 57
D7 DD F7 1C 6D BF 9F FB FD BF FF FD 7F FE DB 79
7E EF FC 5B 5A 68 8B 5D FD FF E9 BF 7F FE 9C F5
7E 5D BF FE DF 3B 27 79 77 FF DE FF 31 BA F5 ED
BF 23 36 FA DD 7C 4B 4F F5 DF 37 C9 DB DD CB DF

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 E2 20 00 0A
89 32 48 08 20 00 51 43 05 54 07 A0 10 02 6E 09
1D 02 6C 50 12 C8 08 80 81 88 AA 40 46 08 06 81
34 02 80 21 29 88 22 82 14 46 24 62 40 01 21 04
41 0A C7 86 27 10 04 94 03 11 81 A6 A0 0A 88 4C
08 9A 03 29 41 12 40 00 50 15 38 11 A8 10 C4 11
80 02 0A C8 A5 50 31 01 03 00 A1 A4 80 00 0A 40
09 02 8B 02 8C 48 D0 10 86 20 1B 00 00 84 00 00
90 2C 08 40 68 00 00 01 48 19 90 30 00 80 40 50
04 C8 00 80 10 20 42 09 34 88 49 91 C4 00 20 00
13 01 04 18 44 08 08 1B 64 28 0C 78 01 6E 88 20
0C 07 B0 43 18 08 01 01 B4 81 00 86 0A 08 00 20
64 1C 22 40 00 30 01 40 04 44 04 00 30 10 51 80
17 00 10 B0 84 20 40 02 75 10 04 80 10 81 C0 80
02 84 1A 21 50 80 03 40 E0 80 08 80 00 84 0E 11
24 50 A8 00 BB 25 05 0C 82 06 24 C2 C2 01 06 50
C9 08 22 04 5F 16 04 11 20 04 22 54 22 00 10 28
08 23 88 88 60 00 A2 C0 41 56 83 C0 08 02 65 00
9D 0A 12 00 02 8C 90 80 A9 08 C9 05 0D 0A 66 04
30 40 81 60 29 80 84 2E 00 00 A5 00 40 01 29 04
41 22 CB 02 04 10 04 04 B2 00 81 E4 E2 02 08 1C
38 90 03 05 08 02 00 01 10 85 20 80 CA 00 AC 81
80 22 50 C4 24 D8 91 04 50 10 01 06 00 A1 42 42
01 43 8D 02 8E 82 0A A0 44 24 B1 40 C0 C0 00 90
95 4C 08 00 69 00 A4 51 01 31 88 20 06 24 C4 D0
7C E8 D4 01 41 28 06 08 3C 80 64 B1 80 20 22 10
92 C9 44 04 0C 0B 06 30 44 A1 88 19 20 EE C2 10
56 42 84 52 10 40 08 00 20 73 80 10 04 74 0C 80
44 10 02 80 51 02 01 40 00 45 10 89 21 10 41 80
1C 00 34 D8 84 6C 00 48 71 90 26 80 43 80 00 82
02 85 16 04 54 90 00 04 40 86 3D 80 C1 08 20 C8
19 41 20 69 80 20 00 04 04 DA 03 44 03 01 46 14
C9 88 28 41 43 10 00 01 20 10 20 90 20 14 52 28
08 33 C0 00 0A 0C 60 43 11 46 01 C4 00 20 21 08
94 8A 22 01 0A C8 98 90 01 40 E0 04 50 9A 80 81
34 40 91 10 09 C9 86 E1 0E 54 A1 26 00 00 2B 14
05 0A A5 80 04 40 00 90 31 18 81 24 C0 03 C8 48
20 12 80 04 00 10 00 01 30 90 20 A0 08 90 0C 91
01 04 30 01 45 EA 21 04 47 30 23 20 80 85 CC 40
00 C9 04 02 CA 40 8A 20 2E 10 5D 41 A0 44 00 01
A7 08 00 82 08 21 70 40 40 A0 00 00 06 26 10 50
18 21 00 00 50 48 42 8F 34 00 25 31 04 00 32 40
42 88 24 18 0C 1B 0A 10 45 80 84 40 01 28 52 00
12 45 14 01 02 40 08 00 2C 23 09 84 0C 0C 0C 04
40 14 10 D8 00 2B 02 08 00 00 10 98 31 10 54 C4
04 02 20 D8 94 4C 40 42 04 84 23 40 C3 81 C0 0E

Reply via email to