/// <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); } }