guthypeter

Untitled

Mar 27th, 2015
304
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.73 KB | None | 0 0
  1.     /**
  2.          * @param pbRecvBuffer response from PICC after 0xAA00, including 0xAF
  3.          */
  4.         private bool check_authentication_aes(byte[] pbRecvBuffer)
  5.         {
  6.             // From: http://stackoverflow.com/questions/21257442/mifare-desfire-ev1-authentication-using-aes
  7.             int keylength = pbRecvBuffer.Length - 1;
  8.             byte[] rndb_enc = new byte[keylength];
  9.             // 3 Receive Encrypted(RndB) from PICC
  10.             System.Buffer.BlockCopy(pbRecvBuffer, 1, rndb_enc, 0, keylength);
  11.             logger.Debug("rndb_enc: " + HexFormatting.DumpHex(rndb_enc));
  12.  
  13.             // 5 Decrypt Using AES with IV = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (16byte all 0s)
  14.             byte[] rndb_dec = this.decipherAES(rndb_enc, new byte[16]);
  15.             logger.Debug("rndb_dec: " + HexFormatting.DumpHex(rndb_dec));
  16.            
  17.             // 6 Rotate Left (Left Shift) RndB producing RndB’
  18.             byte[] rndb_dec_rot = new byte[keylength];
  19.             System.Buffer.BlockCopy(rndb_dec, 0, rndb_dec_rot, 0, keylength);
  20.             Rotate<byte>(rndb_dec_rot);
  21.             logger.Debug("rndb_dec_rot: " + HexFormatting.DumpHex(rndb_dec_rot));
  22.  
  23.             // 7 Generate RndA
  24.             byte[] rnda = new byte[keylength];
  25.             new Random().NextBytes(rnda);
  26.             logger.Debug("rnda: " + HexFormatting.DumpHex(rnda));
  27.  
  28.             // 8 Encrypted RndA using IV = #step3 (Encrypted RndB received from PICC)
  29.             byte[] rnda_enc = this.decipherAES(rnda, rndb_enc);
  30.             logger.Debug("rnda_enc: " + HexFormatting.DumpHex(rnda_enc));
  31.  
  32.             // 9 Encrypt RndB’ using IV = #step8 (Encrypted RndA)
  33.             byte[] rndb_dec_rot_enc = this.decipherAES(rndb_dec_rot, rnda_enc);
  34.             logger.Debug("rndb_rot_enc: " + HexFormatting.DumpHex(rndb_dec_rot_enc));
  35.  
  36.             // 10 Send APDU (Data = RndA+RndB’)
  37.             String to_send_str = "AF " + HexFormatting.DumpHex(rnda_enc) + " " + HexFormatting.DumpHex(rndb_dec_rot_enc);
  38.             logger.Debug("to_send_str: " + to_send_str);
  39.             return reader.Transmit(HexEncoding.GetBytes(to_send_str), 0x9000);
  40.         }
  41.  
  42.     static void Rotate<T>(T[] source)
  43.         {
  44.             T temp = source[0];
  45.             Array.Copy(source, 1, source, 0, source.Length - 1);
  46.             source[source.Length - 1] = temp;
  47.         }
  48.  
  49.         private byte[] decipherAES(byte[] bytes, byte[] iv)
  50.         {
  51.             byte[] key = new byte[16];
  52.             KeyParameter aesKeyParam = ParameterUtilities.CreateKeyParameter("AES", key);
  53.             IBufferedCipher c = CipherUtilities.GetCipher("AES/CBC/NoPadding");
  54.             c.Init(false, new ParametersWithIV(aesKeyParam, iv));
  55.             return c.DoFinal(bytes);
  56.         }
Advertisement
Add Comment
Please, Sign In to add comment