示例#1
0
        public int deserialize(KernelDatabaseBase database, byte[] iccDynamicData, int pos)
        {
            ICCDynamicNumberLength = iccDynamicData[pos];
            pos++;
            ICCDynamicNumber = new byte[ICCDynamicNumberLength];
            Array.Copy(iccDynamicData, pos, ICCDynamicNumber, 0, ICCDynamicNumber.Length);
            pos = pos + ICCDynamicNumber.Length;

            if (IccDynamicDataType != ICCDynamicDataType.DYNAMIC_NUMBER_ONLY)
            {
                CryptogramInformationData = iccDynamicData[pos];
                pos++;
                ApplicationCryptogram = new byte[8];
                Array.Copy(iccDynamicData, pos, ApplicationCryptogram, 0, ApplicationCryptogram.Length);
                pos = pos + ApplicationCryptogram.Length;
                TransactionDataHashCode = new byte[20];
                Array.Copy(iccDynamicData, pos, TransactionDataHashCode, 0, TransactionDataHashCode.Length);
                pos = pos + TransactionDataHashCode.Length;
            }

            APPLICATION_CAPABILITIES_INFORMATION_9F5D_KRN2 aci;

            switch (IccDynamicDataType)
            {
            case ICCDynamicDataType.NO_IDS_OR_RRP:
                break;

            case ICCDynamicDataType.IDS_AND_RRP:
                aci = new APPLICATION_CAPABILITIES_INFORMATION_9F5D_KRN2(database);
                pos = deserializeIDS(aci, iccDynamicData, pos);
                pos = deserializeRRP(iccDynamicData, pos);
                break;

            case ICCDynamicDataType.IDS:
                aci = new APPLICATION_CAPABILITIES_INFORMATION_9F5D_KRN2(database);
                pos = deserializeIDS(aci, iccDynamicData, pos);
                break;

            case ICCDynamicDataType.RRP:
                pos = deserializeRRP(iccDynamicData, pos);
                break;
            }

            return(pos);
        }
示例#2
0
        private int deserializeIDS(APPLICATION_CAPABILITIES_INFORMATION_9F5D_KRN2 aci, byte[] iccDynamicData, int pos)
        {
            int summaryLength;

            switch (aci.Value.DataStorageVersionNumberEnum)
            {
            case DataStorageVersionNumberEnum.VERSION_1:
                summaryLength = 8;
                break;

            case DataStorageVersionNumberEnum.VERSION_2:
                summaryLength = 16;
                break;

            default:
                throw new EMVProtocolException("Invalid DataStorageVersionNumberEnum in ICCDynamicData");
            }

            if (pos + summaryLength <= iccDynamicData.Length)
            {
                DSSummary2 = new byte[summaryLength];
                Array.Copy(iccDynamicData, pos, DSSummary2, 0, DSSummary2.Length);
                pos = pos + DSSummary2.Length;
            }
            else
            {
                DSSummary2 = null;
            }

            if (pos + summaryLength <= iccDynamicData.Length)
            {
                DSSummary3 = new byte[summaryLength];
                Array.Copy(iccDynamicData, pos, DSSummary3, 0, DSSummary3.Length);
                pos = pos + DSSummary3.Length;
            }
            else
            {
                DSSummary3 = null;
            }

            return(pos);
        }