Example #1
0
 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());
     }
 }
Example #2
0
        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;
            }
        }