Ejemplo n.º 1
0
        /// <summary>
        /// Ładuje plik z pakietem na kartę.
        /// </summary>
        /// <param name="packageContents">Zawartość pliku.</param>
        /// <param name="packageAID">AID pakietu.</param>
        /// <param name="securityDomainAID">AID Security Domain, z którym ma być powiązany pakiet. Może być pustą tablicą, wtedy pakiet zostanie powiązny z CardManagerem.</param>
        public void LoadPackage(ByteArray packageContents, ByteArray packageAID, ByteArray securityDomainAID)
        {
            //install for load
            ByteArray installCommand = new ByteArray("80 e6 02 00");
            ByteArray data           = new ByteArray();

            //długość AID pakietu
            data += (byte)packageAID.Length;
            //AID pakietu
            data += packageAID;
            //długość AID security domain (może być CardManagera)
            data += (byte)securityDomainAID.Length;
            //AID security domain (może być CardManagera)
            data += securityDomainAID;

            data += new ByteArray("00 00 00");

            installCommand += (byte)data.Length;
            installCommand += data;
            installCommand += 0x00;

            SendSecuredCommand(installCommand);

            //load
            ByteArray loadCommand = new ByteArray("80 e8 00 00");

            //pierwszy blok, wrzucamy tylko rozmiar pakietu
            UInt16    size = (UInt16)packageContents.Length;
            ByteArray firstBlockLoadCommand = new ByteArray(loadCommand.StringData);

            firstBlockLoadCommand += 0x04;
            firstBlockLoadCommand += 0xC4;
            firstBlockLoadCommand += 0x82;
            firstBlockLoadCommand += new ByteArray(BitConverter.GetBytes(size)).Reversed;
            firstBlockLoadCommand += 0x00;

            SendSecuredCommand(firstBlockLoadCommand);

            //kolejne bloki, już z danymi
            ByteArray[] dataSlices = packageContents.Slice(230, false, 0x00);

            for (Byte blockNumber = 0x00; blockNumber < dataSlices.Length; blockNumber += 1)
            {
                ByteArray blockLoadCommand = new ByteArray(loadCommand.StringData);
                //czy ostatni blok
                if (blockNumber == dataSlices.Length - 1)
                {
                    blockLoadCommand[2] = 0x80;
                }
                //+1 bo pierwszy blok był bez danych
                blockLoadCommand[3] = (byte)(blockNumber + 1);

                blockLoadCommand += (byte)dataSlices[blockNumber].Length;
                blockLoadCommand += dataSlices[blockNumber];
                blockLoadCommand += 0x00;

                SendSecuredCommand(blockLoadCommand);
            }
        }