2013-07-24 3 views
1

J'ai une carte à puce et un lecteur (Gemalto). Je veux lire le numéro de série de la carte en utilisant C#. Je lis des documents/bibliothèques sur le site de support de Gemalto mais il n'y a pas d'informations utiles pour moi.Comment lire le numéro de série d'une carte à puce Gemalto?

J'espère que quelqu'un a exp à propos de Gemalto m'aider quelques exemples!

Merci beaucoup!

Répondre

2

Si vous voulez dire serialnumber sur la carte que vous pouvez faire ce qui suit:

Vous devez faire référence à la dll de carte Off dans Gemalto SDK. SmartCard.Runtime.dll SmartCard_Stub.dll

SmartCard.Transport.PCSC.SelectDialog dialog = new SmartCard.Transport.PCSC.SelectDialog(); 
CardAccessor ca = new CardAccessor(dialog.SelectedReader); 
if(ca.Logon()) 
{ 
ca.GetSerialNumber(); 
} 

Si vous voulez dire le numéro de série sur un certificat; une approche totalement différente.

+0

Comment tester que notre apdu sur la carte .net gemalto fonctionne bien? nous l'avons testé en utilisant l'application serveur client, mais comment vérifier qu'il fonctionnera pour le système existant? – sms247

1

Voir this post. Les choses peuvent différer légèrement sur votre carte (octet CLA en particulier).

Fondamentalement, vous devez sélectionner la racine du système de fichiers de la carte (MF, a.k.a. 3F00), puis sélectionnez EFiccid (2FE2) de la carte et lisez le contenu. Assez simple en théorie.

Pour chaque étape, il existe une commande APDU dédiée. Si la bibliothèque Gemalto vous permet d'envoyer des APDU, vous devriez être prêt à partir.

4

Vous devez envoyer une unité APDU à une carte à puce pour demander des données sur le cycle de vie du produit de la carte, par exemple (données CPLC).
Certains types de cartes ont des données CPLC (Card Production Life Cycle). Par exemple, les cartes JCOP ont ceci à GET DATA ou GETCPLCDATA à l'étiquette 0x9F7F ou l'étiquette 0x0101. Je crois que c'est un tag spécifique à la plate-forme mondiale. Trouvez quelles spécifications votre carte prend en charge. Pour la carte Gemalto, j'espère que ça marchera. données ce que j'ai reçu de ma carte gemalto en interrogeant les données CPLC est:

Pour 0x9F7F:

IC Fabricator :2 Bytes 
IC Type : 2 Bytes 
Operating System ID : 2 Bytes 
Operating System release date : 2 Bytes 
Operating System release level : 2 Bytes 
IC Fabrication Date : 2 Bytes (Y DDD) date in that year 
IC Serial Number : 4 Bytes 
IC Batch Identifier : 2 Bytes 
IC Module Fabricator : 2 Bytes 
IC Module Packaging Date : 2 Bytes 
ICC Manufacturer : 2 Bytes 
IC Embedding Date :2 Bytes 
IC Pre-Personalizer : 2 Bytes 
IC Pre-Perso. Equipment Date : 2 Bytes 
IC Pre-Perso. Equipment ID : 4 Bytes 
IC Personalizer : 4 Bytes 
IC Personalization Date : 2 Bytes 
IC Perso. Equipment ID : 4 Bytes 

Pour 0x0101:

Card serial number: 8 bytes 
Reserved bytes: 3 bytes 0 
Flow identification: 1 byte 
Reserved bytes: 4 bytes 

Désolé je ne peux pas fournir octets exacts et il peut varier en ton cas. il suffit de vérifier pour quelle étiquette votre support de carte. et Mieux se référer à la documentation de la Global Platform et à la norme ISO 7816 (http://www.ttfn.net/techno/smartcards/iso7816_4.html). J'espère que c'est ce que vous cherchez.

1

Voici comment obtenir via PowerShell:

Utilisation de Gemalto IDPrime SDK .NET

Add-Type -Path "C:\Program Files (x86)\Gemalto\NET Smartcard Framework SDK\v2.2.180\Libraries\On Card\Framework Libraries\v2.1.213.9175\SmartCard.dll" 
Add-Type -Path "C:\Program Files (x86)\Gemalto\NET Smartcard Framework SDK\v2.2.180\bin\SmartCard.Runtime.dll" 
$Reader = New-Object SmartCard.Transport.PCSC.SelectDialog 
$Reader.ShowDialog() | Out-Null 

$SmartCard = New-Object SmartCard.Accessor.CardAccessor($Reader.SelectedReader) 

$SmartCardSN = [System.BitConverter]::ToString($SmartCard.GetSerialNumber()) 

Write-Host "Smartcard Serial Number: $SmartCardSN" 

$SmartCard.Dispose() 
$Reader.Dispose() 

utilisant Gemalto IDPrime .NET PKCS # 11 Pilotes

Si vous souhaitez utiliser la bibliothèque PKCS11 , cela peut être fait comme suit. Toutefois, cette route est livré avec un AVERTISSEMENT car il retourne un hachage du numéro de série et non le numéro de série réel. Par Gemalto Documentation:

Le .NET bibliothèque PKCS # 11 effectue un hachage MD5 de la CSN fournie par le minidriver donnant un résultat de 16 octets.Comme la chaîne C_GetTokenInfo n'a que 16 octets, elle peut afficher 16 caractères du résultat du hachage uniquement au format ASCII. Ces 16 caractères sont les 8 MSB (octets les plus à gauche) du résultat du hachage.

Exemple:

  1. PKCS .NET # 11 demandes de bibliothèque de la carte 12 octets numéro de série (CSN) de le fichier d'identification de la carte: 0x57 0x01 0x13 0x51 0x26 0xC7 0xD6 0x10 0x29 0x27 0xFF 0xFF
  2. PKCS # .NET 11 effectue un hachage MD5 sur la CSN qui donne un résultat de 16 octets: 0x05 0x00 0xCB 0x3D 0x76 0xD3 0xE9 0x4F 0x74 0x13 0x74 0x38 0xD8 0x8C 0xBF 0xB4
  3. le PKCS # 11 .NET transforme le hachage en un strine ASCII g.
  4. Enfin, il remplit le champ serialNumber de la structure TokenInfo (sur 16 octets) avec les 16 premiers caractères de la chaîne ASCII: "05CB003D76D3E94F" correspondant à la 8 MSB du hachage.
# www.pkcs11interop.net 
Add-Type -Path "C:\SomeFolder\Pkcs11Interop.4.0.0\lib\net45\Pkcs11Interop.dll" 

# Load Gemalto driver 
# 1 = AppType.SingleThreaded 
$pkcs11 = New-Object Net.Pkcs11Interop.HighLevelAPI.Pkcs11("C:\Program Files (x86)\Gemalto\DotNet PKCS11\gtop11dotnet64.dll",1) 

# 0 = SlotsType.WithTokenPresent 
$Slots = $pkcs11.GetSlotList(0) 

$CardReader = $Slots[0] # Usually first slot 

$CardReader.GetTokenInfo().SerialNumber 

$CardReader.CloseAllSessions() 
$pkcs11.Dispose() 
Questions connexes