static void reader_OnCardRemoved(object sender, CardEventArgs e) { if (string.Equals(e.Reader, SamReader, StringComparison.CurrentCultureIgnoreCase)) { mySAM = null; Console.WriteLine("PCSC> Token removed from reader '{0}' (SAM Reader)", e.Reader.ToString()); } else if (string.Equals(e.Reader, TargetReader, StringComparison.CurrentCultureIgnoreCase)) { myTarget = null; Console.WriteLine("PCSC> Token removed from reader '{0}' (Target Reader)", e.Reader.ToString()); } else { Console.WriteLine("PCSC> Token removed from reader '{0}' (ignored)", e.Reader.ToString()); } }
static void reader_OnCardInserted(object sender, CardEventArgs e) { lock (insertedLock) { if (string.Equals(e.Reader, SamReader, StringComparison.CurrentCultureIgnoreCase)) { mySAM = e.Card as PCSCCard; Console.WriteLine("PCSC> Token inserted in reader '{0}' (SAM Reader)", e.Reader.ToString()); mySAM.Connect(); } else if (string.Equals(e.Reader, TargetReader, StringComparison.CurrentCultureIgnoreCase)) { myTarget = e.Card as PCSCCard; Console.WriteLine("PCSC> Token inserted in reader '{0}' (Target Reader)", e.Reader.ToString()); myTarget.Connect(); } else { Console.WriteLine("PCSC> Card inserted in reader '{0}' (ignored)", e.Reader.ToString()); } // Check if we have both a SAM and a Target token if (mySAM == null || myTarget == null) { return; } } // // Personalise the SAM instance (if it has not been already personalised) // PACSAMApplication sam = null; try { var keyFile = PACSAMKeyFile.Load(@"PLAID_KEYS.xml", false); sam = new PACSAMApplication(); sam.SetCard(mySAM); sam.SelectApplication(); var status = sam.GetStatus(); if (status.AppletState == PACSAMAppletState.Selectable) { Console.WriteLine("SAM: Personalising ..."); sam.Personalise(0x11223344, "123456", keyFile); Console.WriteLine("SAM: Personalisation complete ..."); } else { Console.WriteLine("SAM: Already personalised"); } // Authenticate and list the keys (this also loads the key list internally) sam.VerifyPIN("123456"); List <PACSAMKey> keys = sam.ReadAllKeys(); } catch (Exception ex) { Console.WriteLine("SAM: Error connecting, aborting ...", ex); return; } // // Personalise PLAID on the target card // try { // Set the '$DYNAMIC$' parameter var parameters = new Dictionary <string, byte[]>(); parameters.Add("$DYNAMIC$", "33333333333333333333333333333333".HexToArray()); var template = PlaidTemplate.Load(@"PLAID_TEMPLATE.xml"); var target = new PlaidApplication(); target.SetCard(myTarget); target.OnMessage += (o, msg) => { Console.WriteLine(@"PLAID: " + msg); }; target.SelectApplication(); target.Personalise(sam, template, parameters); Console.WriteLine("PLAID: Personalisation complete"); byte[] op1 = target.Authenticate(sam, 0x0000, 0x6000, 0); Console.WriteLine("PLAID: Admin authenticated with OpMode 1: " + op1.ToHexString()); byte[] op2 = target.Authenticate(sam, 0x0000, 0x6000, 1); Console.WriteLine("PLAID: Admin authenticated with OpMode 2: " + op2.ToHexString()); byte[] op3 = target.Authenticate(sam, 0x0000, 0x6000, 2); Console.WriteLine("PLAID: Admin authenticated with OpMode 3: " + op3.ToHexString()); Console.WriteLine("Personalisation complete (remove card)"); } catch (Exception ex) { Console.WriteLine("PLAID: Error during personalisation, aborting ...", ex); return; } }