/// <inheritdoc />
        protected override byte[] GetDataToSign(int privateKeyLength)
        {
            var iccPublicKeyModulus  = IccPublicKey.Modulus.FromHexa();
            var iccPublicKeyExponent = IccPublicKey.Exponent.FromHexa();

            DataFormat = 0x04;

            PublicKeyLength         = (byte)iccPublicKeyModulus.Length;
            PublicKeyExponentLength = (byte)iccPublicKeyExponent.Length;

            PublicKeyorLeftmostDigitsofthePublicKey = new byte[privateKeyLength - 42];

            // ICC Public Key Remainder (0 or NI – NCA + 42) - Present only if NI > NCA – 42 and consists of the NI – NCA + 42 least significant bytes of the ICC Public Key
            byte[] iccPublicKeyRemainder;

            if (IccPublicKey.Modulus.Length <= privateKeyLength - 42)
            {
                Array.Copy(iccPublicKeyModulus, PublicKeyorLeftmostDigitsofthePublicKey, iccPublicKeyModulus.Length);
                // pad with 'BB'
                for (var i = iccPublicKeyModulus.Length; i < privateKeyLength - 42; i++)
                {
                    PublicKeyorLeftmostDigitsofthePublicKey[i] = 0xBB;
                }
                iccPublicKeyRemainder = new byte[0];
            }
            else
            {
                PublicKeyorLeftmostDigitsofthePublicKey = iccPublicKeyModulus.Take(privateKeyLength - 42).ToArray();
                iccPublicKeyRemainder = new byte[iccPublicKeyModulus.Length - privateKeyLength + 42];
                // TODO Set a correct value !!
            }

            var applicationPan = ApplicationPan
                                 .ToHexa('\0')
                                 .PadRight(20, 'F')
                                 .FromHexa();

            return(DataFormat.ToByteArray()
                   .Concat(applicationPan)
                   .Concat(CertificateExpirationDate)
                   .Concat(CertificateSerialNumber)
                   .Concat(HashAlgorithmIndicator.ToByteArray())
                   .Concat(PublicKeyAlgorithmIndicator.ToByteArray())
                   .Concat(PublicKeyLength.ToByteArray())
                   .Concat(PublicKeyExponentLength.ToByteArray())
                   .Concat(PublicKeyorLeftmostDigitsofthePublicKey)
                   .Concat(iccPublicKeyRemainder)
                   .Concat(iccPublicKeyExponent)
                   // TODO Add Static Data to be authenticated
                   .ToArray());
        }
        /// <inheritdoc />
        public override string ToString()
        {
            var s = new StringBuilder();

            s.AppendFormat("Header:[{0:X2}] ", DataHeader);
            s.AppendFormat("Format:[{0:X2}] ", DataFormat);
            s.AppendFormat("Issuer Identifier:[{0}] ", ApplicationPan.ToHexa('\0'));
            s.AppendFormat("Expiration:[{0}] ", CertificateExpirationDate.ToHexa('\0'));
            s.AppendFormat("Serial:[{0}] ", CertificateSerialNumber.ToHexa('\0'));
            s.AppendFormat("Hash Algorithm:[{0:X2}] ", HashAlgorithmIndicator);
            s.AppendFormat("PK Algorithm:[{0:X2}] ", PublicKeyAlgorithmIndicator);
            s.AppendFormat("PK Length:[{0:X2}] ", PublicKeyLength);
            s.AppendFormat("PKExp Length:[{0:X2}] ", PublicKeyExponentLength);
            s.AppendFormat("Leftmost IssuerPK:[{0}] ", PublicKeyorLeftmostDigitsofthePublicKey.ToHexa('\0'));
            s.AppendFormat("Hash:[{0}] ", HashResult.ToHexa('\0'));
            s.AppendFormat("Trailer:[{0:X2}] ", DataTrailer);

            return(s.ToString());
        }