ReadFully() public méthode

public ReadFully ( byte buffer ) : void
buffer byte
Résultat void
        internal SecretKeyPacket(
            BcpgInputStream bcpgIn)
        {
            pubKeyPacket = new PublicKeyPacket(bcpgIn);

            s2kUsage = bcpgIn.ReadByte();

            if (s2kUsage == UsageChecksum || s2kUsage == UsageSha1)
            {
                encAlgorithm = (SymmetricKeyAlgorithmTag)bcpgIn.ReadByte();
                s2k          = new S2k(bcpgIn);
            }
            else
            {
                encAlgorithm = (SymmetricKeyAlgorithmTag)s2kUsage;
            }

            if (!(s2k != null && s2k.Type == S2k.GnuDummyS2K && s2k.ProtectionMode == 0x01))
            {
                if (s2kUsage != 0)
                {
                    if (((int)encAlgorithm) < 7)
                    {
                        iv = new byte[8];
                    }
                    else
                    {
                        iv = new byte[16];
                    }
                    bcpgIn.ReadFully(iv);
                }
            }

            secKeyData = bcpgIn.ReadAll();
        }
 internal SecretKeyPacket(BcpgInputStream bcpgIn)
 {
     if (this is SecretSubkeyPacket)
     {
         this.pubKeyPacket = new PublicSubkeyPacket(bcpgIn);
     }
     else
     {
         this.pubKeyPacket = new PublicKeyPacket(bcpgIn);
     }
     this.s2kUsage = bcpgIn.ReadByte();
     if (this.s2kUsage == 255 || this.s2kUsage == 254)
     {
         this.encAlgorithm = (SymmetricKeyAlgorithmTag)bcpgIn.ReadByte();
         this.s2k          = new S2k(bcpgIn);
     }
     else
     {
         this.encAlgorithm = (SymmetricKeyAlgorithmTag)this.s2kUsage;
     }
     if ((this.s2k == null || this.s2k.Type != 101 || this.s2k.ProtectionMode != 1) && this.s2kUsage != 0)
     {
         if (this.encAlgorithm < SymmetricKeyAlgorithmTag.Aes128)
         {
             this.iv = new byte[8];
         }
         else
         {
             this.iv = new byte[16];
         }
         bcpgIn.ReadFully(this.iv);
     }
     this.secKeyData = bcpgIn.ReadAll();
 }
Exemple #3
0
 internal SecretKeyPacket(BcpgInputStream bcpgIn)
 {
     if (this is SecretSubkeyPacket)
     {
         pubKeyPacket = new PublicSubkeyPacket(bcpgIn);
     }
     else
     {
         pubKeyPacket = new PublicKeyPacket(bcpgIn);
     }
     s2kUsage = ((Stream)bcpgIn).ReadByte();
     if (s2kUsage == 255 || s2kUsage == 254)
     {
         encAlgorithm = (SymmetricKeyAlgorithmTag)((Stream)bcpgIn).ReadByte();
         s2k          = new S2k((Stream)(object)bcpgIn);
     }
     else
     {
         encAlgorithm = (SymmetricKeyAlgorithmTag)s2kUsage;
     }
     if ((s2k == null || s2k.Type != 101 || s2k.ProtectionMode != 1) && s2kUsage != 0)
     {
         if (encAlgorithm < SymmetricKeyAlgorithmTag.Aes128)
         {
             iv = new byte[8];
         }
         else
         {
             iv = new byte[16];
         }
         bcpgIn.ReadFully(iv);
     }
     secKeyData = bcpgIn.ReadAll();
 }
Exemple #4
0
        protected static byte[] ReadBytesOfEncodedLength(
            BcpgInputStream bcpgIn)
        {
            int length = bcpgIn.ReadByte();

            if (length < 0)
            {
                throw new EndOfStreamException();
            }
            if (length == 0 || length == 0xFF)
            {
                throw new IOException("future extensions not yet implemented");
            }
            if (length > 127)
            {
                throw new IOException("unsupported OID");
            }

            byte[] buffer = new byte[length + 2];
            bcpgIn.ReadFully(buffer, 2, buffer.Length - 2);
            buffer[0] = (byte)0x06;
            buffer[1] = (byte)length;

            return(buffer);
        }
Exemple #5
0
        /// <summary>
        /// Initializes a new instance of the <see cref="SecretKeyPacket"/> class.
        /// </summary>
        /// <param name="bcpgIn">The BCPG in.</param>
        internal SecretKeyPacket(BcpgInputStream bcpgIn)
        {
            if (this is SecretSubkeyPacket)
            {
                this.PublicKeyPacket = new PublicSubkeyPacket(bcpgIn);
            }
            else
            {
                this.PublicKeyPacket = new PublicKeyPacket(bcpgIn);
            }

            this.S2KUsage = bcpgIn.ReadByte();

            if (this.S2KUsage == UsageChecksum || this.S2KUsage == UsageSha1)
            {
                this.EncAlgorithm = (SymmetricKeyAlgorithmTag)bcpgIn.ReadByte();
                this.S2K          = new S2k(bcpgIn);
            }
            else
            {
                this.EncAlgorithm = (SymmetricKeyAlgorithmTag)this.S2KUsage;
            }

            if (!(this.S2K != null && this.S2K.Type == S2k.GnuDummyS2K && this.S2K.ProtectionMode == 0x01))
            {
                if (this.S2KUsage != 0)
                {
                    _iv = ((int)EncAlgorithm) < 7 ? new byte[8] : new byte[16];
                    bcpgIn.ReadFully(_iv);
                }
            }

            _secKeyData = bcpgIn.ReadAll();
        }
Exemple #6
0
 public MarkerPacket(BcpgInputStream bcpgIn)
 {
     byte[] array = new byte[3];
     RuntimeHelpers.InitializeArray((global::System.Array)array, (RuntimeFieldHandle) /*OpCode not supported: LdMemberToken*/);
     marker = array;
     base..ctor();
     bcpgIn.ReadFully(marker);
 }
Exemple #7
0
 internal ModDetectionCodePacket(BcpgInputStream bcpgIn)
 {
     if (bcpgIn == null)
     {
         throw new ArgumentNullException("bcpgIn");
     }
     this.digest = new byte[20];
     bcpgIn.ReadFully(this.digest);
 }
		internal ModDetectionCodePacket(
            BcpgInputStream bcpgIn)
        {
			if (bcpgIn == null)
				throw new ArgumentNullException("bcpgIn");

			this.digest = new byte[20];
            bcpgIn.ReadFully(this.digest);
        }
Exemple #9
0
 internal ModDetectionCodePacket(BcpgInputStream bcpgIn)
 {
     //IL_000e: Unknown result type (might be due to invalid IL or missing references)
     if (bcpgIn == null)
     {
         throw new ArgumentNullException("bcpgIn");
     }
     digest = new byte[20];
     bcpgIn.ReadFully(digest);
 }
Exemple #10
0
        public MPInteger(BcpgInputStream bcpgIn)
        {
            if (bcpgIn == null)
            {
                throw new ArgumentNullException("bcpgIn");
            }
            int num = bcpgIn.ReadByte() << 8 | bcpgIn.ReadByte();

            byte[] array = new byte[(num + 7) / 8];
            bcpgIn.ReadFully(array);
            this.val = new BigInteger(1, array);
        }
        public MPInteger(BcpgInputStream bcpgIn)
        {
            if (bcpgIn == null)
                throw new ArgumentNullException("bcpgIn");

            var length = (bcpgIn.ReadByte() << 8) | bcpgIn.ReadByte();
            var bytes = new byte[(length + 7) / 8];

            bcpgIn.ReadFully(bytes);

            _val = new BigInteger(1, bytes);
        }
Exemple #12
0
        public MPInteger(BcpgInputStream bcpgIn)
        {
            //IL_000e: Unknown result type (might be due to invalid IL or missing references)
            if (bcpgIn == null)
            {
                throw new ArgumentNullException("bcpgIn");
            }
            int num = (((Stream)bcpgIn).ReadByte() << 8) | ((Stream)bcpgIn).ReadByte();

            byte[] array = new byte[(num + 7) / 8];
            bcpgIn.ReadFully(array);
            val = new BigInteger(1, array);
        }
        /// <summary>
        /// Reads the numver of bytes encoded.
        /// </summary>
        /// <param name="bcpgIn">The BCPG in.</param>
        /// <returns></returns>
        /// <exception cref="System.NotSupportedException">future extensions not yet implemented.</exception>
        protected byte[] ReadBytesOfEncodedLength(BcpgInputStream bcpgIn)
        {
            var length = bcpgIn.ReadByte();

            if (length == 0 || length == 0xFF)
            {
                throw new PgpException("future extensions not yet implemented.");
            }

            var buffer = new byte[length];

            bcpgIn.ReadFully(buffer);
            return(buffer);
        }
        public MPInteger(BcpgInputStream bcpgIn)
        {
            if (bcpgIn == null)
            {
                throw new ArgumentNullException("bcpgIn");
            }

            var length = (bcpgIn.ReadByte() << 8) | bcpgIn.ReadByte();
            var bytes  = new byte[(length + 7) / 8];

            bcpgIn.ReadFully(bytes);

            _val = new BigInteger(1, bytes);
        }
        protected static byte[] ReadBytesOfEncodedLength(BcpgInputStream bcpgIn)
        {
            //IL_0017: Unknown result type (might be due to invalid IL or missing references)
            int num = ((Stream)bcpgIn).ReadByte();

            if (num == 0 || num == 255)
            {
                throw new IOException("future extensions not yet implemented.");
            }
            byte[] array = new byte[num + 2];
            bcpgIn.ReadFully(array, 2, array.Length - 2);
            array[0] = 6;
            array[1] = (byte)num;
            return(array);
        }
        internal PublicKeyEncSessionPacket(BcpgInputStream bcpgIn)
        {
            _version = bcpgIn.ReadByte();

            _keyId |= (long)bcpgIn.ReadByte() << 56;
            _keyId |= (long)bcpgIn.ReadByte() << 48;
            _keyId |= (long)bcpgIn.ReadByte() << 40;
            _keyId |= (long)bcpgIn.ReadByte() << 32;
            _keyId |= (long)bcpgIn.ReadByte() << 24;
            _keyId |= (long)bcpgIn.ReadByte() << 16;
            _keyId |= (long)bcpgIn.ReadByte() << 8;
            _keyId |= (uint)bcpgIn.ReadByte();

            _algorithm = (PublicKeyAlgorithmTag)bcpgIn.ReadByte();

            switch (_algorithm)
            {
            case PublicKeyAlgorithmTag.RsaEncrypt:
            case PublicKeyAlgorithmTag.RsaGeneral:
                _data = new[] { new MPInteger(bcpgIn).Value };
                break;

            case PublicKeyAlgorithmTag.ElGamalEncrypt:
            case PublicKeyAlgorithmTag.ElGamalGeneral:
                _data = new[]
                {
                    new MPInteger(bcpgIn).Value,
                    new MPInteger(bcpgIn).Value
                };
                break;

            case PublicKeyAlgorithmTag.Ecdh:
                _data = new[] { new MPInteger(bcpgIn).Value };
                var length = bcpgIn.ReadByte();
                if (length > 0xFF)
                {
                    throw new IOException("EC DH symmetric key data is too long.");
                }
                _extraData = new byte[length];
                bcpgIn.ReadFully(_extraData, 0, length);
                break;

            default:
                throw new IOException("unknown PGP public key algorithm encountered");
            }
        }
        public ECDHPublicBcpgKey(BcpgInputStream bcpgIn)
            : base(bcpgIn)
        {
            //IL_0020: Unknown result type (might be due to invalid IL or missing references)
            int num = ((Stream)bcpgIn).ReadByte();

            byte[] array = new byte[num];
            if (array.Length != 3)
            {
                throw new InvalidOperationException("kdf parameters size of 3 expected.");
            }
            bcpgIn.ReadFully(array);
            reserved       = array[0];
            hashFunctionId = (HashAlgorithmTag)array[1];
            symAlgorithmId = (SymmetricKeyAlgorithmTag)array[2];
            VerifyHashAlgorithm();
            VerifySymmetricKeyAlgorithm();
        }
        /// <param name="bcpgIn">The stream to read the packet from.</param>
        public ECDHPublicBcpgKey(
            BcpgInputStream bcpgIn)
            : base(bcpgIn)
        {
            int length = bcpgIn.ReadByte();
            byte[] kdfParameters =  new byte[length];
            if (kdfParameters.Length != 3)
                throw new InvalidOperationException("kdf parameters size of 3 expected.");

            bcpgIn.ReadFully(kdfParameters);

            reserved = kdfParameters[0];
            hashFunctionId = kdfParameters[1];
            symAlgorithmId = kdfParameters[2];

            VerifyHashAlgorithm();
            VerifySymmetricKeyAlgorithm();
        }
        internal PublicKeyEncSessionPacket(BcpgInputStream bcpgIn)
        {
            _version = bcpgIn.ReadByte();

            _keyId |= (long)bcpgIn.ReadByte() << 56;
            _keyId |= (long)bcpgIn.ReadByte() << 48;
            _keyId |= (long)bcpgIn.ReadByte() << 40;
            _keyId |= (long)bcpgIn.ReadByte() << 32;
            _keyId |= (long)bcpgIn.ReadByte() << 24;
            _keyId |= (long)bcpgIn.ReadByte() << 16;
            _keyId |= (long)bcpgIn.ReadByte() << 8;
            _keyId |= (uint)bcpgIn.ReadByte();

            _algorithm = (PublicKeyAlgorithmTag)bcpgIn.ReadByte();

            switch (_algorithm)
            {
                case PublicKeyAlgorithmTag.RsaEncrypt:
                case PublicKeyAlgorithmTag.RsaGeneral:
                    _data = new[] { new MPInteger(bcpgIn).Value };
                    break;
                case PublicKeyAlgorithmTag.ElGamalEncrypt:
                case PublicKeyAlgorithmTag.ElGamalGeneral:
                    _data = new[]
                    {
                        new MPInteger(bcpgIn).Value,
                        new MPInteger(bcpgIn).Value
                    };
                    break;

                case PublicKeyAlgorithmTag.Ecdh:
                    _data = new[] { new MPInteger(bcpgIn).Value };
                    var length = bcpgIn.ReadByte();
                    if (length > 0xFF)
                        throw new IOException("EC DH symmetric key data is too long.");
                    _extraData = new byte[length];
                    bcpgIn.ReadFully(_extraData, 0, length);
                    break;
                default:
                    throw new IOException("unknown PGP public key algorithm encountered");
            }
        }
		internal SecretKeyPacket(
            BcpgInputStream bcpgIn)
        {
			if (this is SecretSubkeyPacket)
			{
				pubKeyPacket = new PublicSubkeyPacket(bcpgIn);
			}
			else
			{
				pubKeyPacket = new PublicKeyPacket(bcpgIn);
			}

			s2kUsage = bcpgIn.ReadByte();

			if (s2kUsage == UsageChecksum || s2kUsage == UsageSha1)
            {
                encAlgorithm = (SymmetricKeyAlgorithmTag) bcpgIn.ReadByte();
                s2k = new S2k(bcpgIn);
            }
            else
            {
                encAlgorithm = (SymmetricKeyAlgorithmTag) s2kUsage;
			}

			if (!(s2k != null && s2k.Type == S2k.GnuDummyS2K && s2k.ProtectionMode == 0x01))
            {
				if (s2kUsage != 0)
				{
                    if (((int) encAlgorithm) < 7)
                    {
                        iv = new byte[8];
                    }
                    else
                    {
                        iv = new byte[16];
                    }
                    bcpgIn.ReadFully(iv);
                }
            }

			secKeyData = bcpgIn.ReadAll();
        }
        /// <param name="bcpgIn">The stream to read the packet from.</param>
        public ECDHPublicBcpgKey(
            BcpgInputStream bcpgIn)
            : base(bcpgIn)
        {
            int length = bcpgIn.ReadByte();

            byte[] kdfParameters = new byte[length];
            if (kdfParameters.Length != 3)
            {
                throw new InvalidOperationException("kdf parameters size of 3 expected.");
            }

            bcpgIn.ReadFully(kdfParameters);

            reserved       = kdfParameters[0];
            hashFunctionId = kdfParameters[1];
            symAlgorithmId = kdfParameters[2];

            VerifyHashAlgorithm();
            VerifySymmetricKeyAlgorithm();
        }
Exemple #22
0
        internal SignaturePacket(
            BcpgInputStream bcpgIn)
        {
            version = bcpgIn.ReadByte();

            if (version == 3 || version == 2)
            {
//                int l =
                bcpgIn.ReadByte();

                signatureType = bcpgIn.ReadByte();
                creationTime  = (((long)bcpgIn.ReadByte() << 24) | ((long)bcpgIn.ReadByte() << 16)
                                 | ((long)bcpgIn.ReadByte() << 8) | (uint)bcpgIn.ReadByte()) * 1000L;

                keyId |= (long)bcpgIn.ReadByte() << 56;
                keyId |= (long)bcpgIn.ReadByte() << 48;
                keyId |= (long)bcpgIn.ReadByte() << 40;
                keyId |= (long)bcpgIn.ReadByte() << 32;
                keyId |= (long)bcpgIn.ReadByte() << 24;
                keyId |= (long)bcpgIn.ReadByte() << 16;
                keyId |= (long)bcpgIn.ReadByte() << 8;
                keyId |= (uint)bcpgIn.ReadByte();

                keyAlgorithm  = (PublicKeyAlgorithmTag)bcpgIn.ReadByte();
                hashAlgorithm = (HashAlgorithmTag)bcpgIn.ReadByte();
            }
            else if (version == 4)
            {
                signatureType = bcpgIn.ReadByte();
                keyAlgorithm  = (PublicKeyAlgorithmTag)bcpgIn.ReadByte();
                hashAlgorithm = (HashAlgorithmTag)bcpgIn.ReadByte();

                int    hashedLength = (bcpgIn.ReadByte() << 8) | bcpgIn.ReadByte();
                byte[] hashed       = new byte[hashedLength];

                bcpgIn.ReadFully(hashed);

                //
                // read the signature sub packet data.
                //
                SignatureSubpacketsParser sIn = new SignatureSubpacketsParser(
                    new MemoryStream(hashed, false));

                ArrayList          v = new ArrayList();
                SignatureSubpacket sub;
                while ((sub = sIn.ReadPacket()) != null)
                {
                    v.Add(sub);
                }

                hashedData = new SignatureSubpacket[v.Count];

                for (int i = 0; i != hashedData.Length; i++)
                {
                    SignatureSubpacket p = (SignatureSubpacket)v[i];
                    if (p is IssuerKeyId)
                    {
                        keyId = ((IssuerKeyId)p).KeyId;
                    }
                    else if (p is SignatureCreationTime)
                    {
                        creationTime = DateTimeUtilities.DateTimeToUnixMs(
                            ((SignatureCreationTime)p).GetTime());
                    }

                    hashedData[i] = p;
                }

                int    unhashedLength = (bcpgIn.ReadByte() << 8) | bcpgIn.ReadByte();
                byte[] unhashed       = new byte[unhashedLength];

                bcpgIn.ReadFully(unhashed);

                sIn = new SignatureSubpacketsParser(new MemoryStream(unhashed, false));

                v.Clear();

                while ((sub = sIn.ReadPacket()) != null)
                {
                    v.Add(sub);
                }

                unhashedData = new SignatureSubpacket[v.Count];

                for (int i = 0; i != unhashedData.Length; i++)
                {
                    SignatureSubpacket p = (SignatureSubpacket)v[i];
                    if (p is IssuerKeyId)
                    {
                        keyId = ((IssuerKeyId)p).KeyId;
                    }
                    else if (p is SignatureCreationTime)
                    {
                        creationTime = DateTimeUtilities.DateTimeToUnixMs(
                            ((SignatureCreationTime)p).GetTime());
                    }

                    unhashedData[i] = (SignatureSubpacket)p;
                }
            }
            else
            {
                throw new Exception("unsupported version: " + version);
            }

            fingerprint = new byte[2];
            bcpgIn.ReadFully(fingerprint);

            switch (keyAlgorithm)
            {
            case PublicKeyAlgorithmTag.RsaGeneral:
            case PublicKeyAlgorithmTag.RsaSign:
                MPInteger v = new MPInteger(bcpgIn);
                signature = new MPInteger[] { v };
                break;

            case PublicKeyAlgorithmTag.Dsa:
                MPInteger r = new MPInteger(bcpgIn);
                MPInteger s = new MPInteger(bcpgIn);
                signature = new MPInteger[] { r, s };
                break;

            case PublicKeyAlgorithmTag.ElGamalEncrypt:     // yep, this really does happen sometimes.
            case PublicKeyAlgorithmTag.ElGamalGeneral:
                MPInteger p = new MPInteger(bcpgIn);
                MPInteger g = new MPInteger(bcpgIn);
                MPInteger y = new MPInteger(bcpgIn);
                signature = new MPInteger[] { p, g, y };
                break;

            default:
                throw new IOException("unknown signature key algorithm: " + keyAlgorithm);
            }
        }
Exemple #23
0
        internal SignaturePacket(BcpgInputStream bcpgIn)
        {
            //IL_018f: Unknown result type (might be due to invalid IL or missing references)
            //IL_0199: Expected O, but got Unknown
            //IL_025a: Unknown result type (might be due to invalid IL or missing references)
            //IL_0264: Expected O, but got Unknown
            //IL_0422: Unknown result type (might be due to invalid IL or missing references)
            //IL_0429: Expected O, but got Unknown
            //IL_0464: Unknown result type (might be due to invalid IL or missing references)
            version = ((Stream)bcpgIn).ReadByte();
            if (version == 3 || version == 2)
            {
                ((Stream)bcpgIn).ReadByte();
                signatureType = ((Stream)bcpgIn).ReadByte();
                creationTime  = (((long)((Stream)bcpgIn).ReadByte() << 24) | ((long)((Stream)bcpgIn).ReadByte() << 16) | ((long)((Stream)bcpgIn).ReadByte() << 8) | (uint)((Stream)bcpgIn).ReadByte()) * 1000;
                keyId        |= (long)((Stream)bcpgIn).ReadByte() << 56;
                keyId        |= (long)((Stream)bcpgIn).ReadByte() << 48;
                keyId        |= (long)((Stream)bcpgIn).ReadByte() << 40;
                keyId        |= (long)((Stream)bcpgIn).ReadByte() << 32;
                keyId        |= (long)((Stream)bcpgIn).ReadByte() << 24;
                keyId        |= (long)((Stream)bcpgIn).ReadByte() << 16;
                keyId        |= (long)((Stream)bcpgIn).ReadByte() << 8;
                keyId        |= (uint)((Stream)bcpgIn).ReadByte();
                keyAlgorithm  = (PublicKeyAlgorithmTag)((Stream)bcpgIn).ReadByte();
                hashAlgorithm = (HashAlgorithmTag)((Stream)bcpgIn).ReadByte();
            }
            else
            {
                if (version != 4)
                {
                    throw new global::System.Exception(string.Concat((object)"unsupported version: ", (object)version));
                }
                signatureType = ((Stream)bcpgIn).ReadByte();
                keyAlgorithm  = (PublicKeyAlgorithmTag)((Stream)bcpgIn).ReadByte();
                hashAlgorithm = (HashAlgorithmTag)((Stream)bcpgIn).ReadByte();
                int    num   = (((Stream)bcpgIn).ReadByte() << 8) | ((Stream)bcpgIn).ReadByte();
                byte[] array = new byte[num];
                bcpgIn.ReadFully(array);
                SignatureSubpacketsParser        signatureSubpacketsParser = new SignatureSubpacketsParser((Stream) new MemoryStream(array, false));
                global::System.Collections.IList list = Platform.CreateArrayList();
                SignatureSubpacket signatureSubpacket;
                while ((signatureSubpacket = signatureSubpacketsParser.ReadPacket()) != null)
                {
                    list.Add((object)signatureSubpacket);
                }
                hashedData = new SignatureSubpacket[((global::System.Collections.ICollection)list).get_Count()];
                for (int i = 0; i != hashedData.Length; i++)
                {
                    SignatureSubpacket signatureSubpacket2 = (SignatureSubpacket)list.get_Item(i);
                    if (signatureSubpacket2 is IssuerKeyId)
                    {
                        keyId = ((IssuerKeyId)signatureSubpacket2).KeyId;
                    }
                    else if (signatureSubpacket2 is SignatureCreationTime)
                    {
                        creationTime = DateTimeUtilities.DateTimeToUnixMs(((SignatureCreationTime)signatureSubpacket2).GetTime());
                    }
                    hashedData[i] = signatureSubpacket2;
                }
                int    num2   = (((Stream)bcpgIn).ReadByte() << 8) | ((Stream)bcpgIn).ReadByte();
                byte[] array2 = new byte[num2];
                bcpgIn.ReadFully(array2);
                signatureSubpacketsParser = new SignatureSubpacketsParser((Stream) new MemoryStream(array2, false));
                list.Clear();
                while ((signatureSubpacket = signatureSubpacketsParser.ReadPacket()) != null)
                {
                    list.Add((object)signatureSubpacket);
                }
                unhashedData = new SignatureSubpacket[((global::System.Collections.ICollection)list).get_Count()];
                for (int j = 0; j != unhashedData.Length; j++)
                {
                    SignatureSubpacket signatureSubpacket3 = (SignatureSubpacket)list.get_Item(j);
                    if (signatureSubpacket3 is IssuerKeyId)
                    {
                        keyId = ((IssuerKeyId)signatureSubpacket3).KeyId;
                    }
                    unhashedData[j] = signatureSubpacket3;
                }
            }
            fingerprint = new byte[2];
            bcpgIn.ReadFully(fingerprint);
            switch (keyAlgorithm)
            {
            case PublicKeyAlgorithmTag.RsaGeneral:
            case PublicKeyAlgorithmTag.RsaSign:
            {
                MPInteger mPInteger8 = new MPInteger(bcpgIn);
                signature = new MPInteger[1] {
                    mPInteger8
                };
                return;
            }

            case PublicKeyAlgorithmTag.Dsa:
            {
                MPInteger mPInteger6 = new MPInteger(bcpgIn);
                MPInteger mPInteger7 = new MPInteger(bcpgIn);
                signature = new MPInteger[2] {
                    mPInteger6, mPInteger7
                };
                return;
            }

            case PublicKeyAlgorithmTag.ElGamalEncrypt:
            case PublicKeyAlgorithmTag.ElGamalGeneral:
            {
                MPInteger mPInteger3 = new MPInteger(bcpgIn);
                MPInteger mPInteger4 = new MPInteger(bcpgIn);
                MPInteger mPInteger5 = new MPInteger(bcpgIn);
                signature = new MPInteger[3] {
                    mPInteger3, mPInteger4, mPInteger5
                };
                return;
            }

            case PublicKeyAlgorithmTag.ECDsa:
            {
                MPInteger mPInteger  = new MPInteger(bcpgIn);
                MPInteger mPInteger2 = new MPInteger(bcpgIn);
                signature = new MPInteger[2] {
                    mPInteger, mPInteger2
                };
                return;
            }
            }
            if (keyAlgorithm >= PublicKeyAlgorithmTag.Experimental_1 && keyAlgorithm <= PublicKeyAlgorithmTag.Experimental_11)
            {
                signature = null;
                MemoryStream val = new MemoryStream();
                int          num3;
                while ((num3 = ((Stream)bcpgIn).ReadByte()) >= 0)
                {
                    ((Stream)val).WriteByte((byte)num3);
                }
                signatureEncoding = val.ToArray();
                return;
            }
            throw new IOException(string.Concat((object)"unknown signature key algorithm: ", (object)keyAlgorithm));
        }
        internal SignaturePacket(BcpgInputStream bcpgIn)
        {
            this.version = bcpgIn.ReadByte();
            if (this.version == 3 || this.version == 2)
            {
                bcpgIn.ReadByte();
                this.signatureType = bcpgIn.ReadByte();
                this.creationTime  = ((long)bcpgIn.ReadByte() << 24 | (long)bcpgIn.ReadByte() << 16 | (long)bcpgIn.ReadByte() << 8 | (long)((ulong)bcpgIn.ReadByte())) * 1000L;
                this.keyId        |= (long)bcpgIn.ReadByte() << 56;
                this.keyId        |= (long)bcpgIn.ReadByte() << 48;
                this.keyId        |= (long)bcpgIn.ReadByte() << 40;
                this.keyId        |= (long)bcpgIn.ReadByte() << 32;
                this.keyId        |= (long)bcpgIn.ReadByte() << 24;
                this.keyId        |= (long)bcpgIn.ReadByte() << 16;
                this.keyId        |= (long)bcpgIn.ReadByte() << 8;
                this.keyId        |= (long)((ulong)bcpgIn.ReadByte());
                this.keyAlgorithm  = (PublicKeyAlgorithmTag)bcpgIn.ReadByte();
                this.hashAlgorithm = (HashAlgorithmTag)bcpgIn.ReadByte();
            }
            else
            {
                if (this.version != 4)
                {
                    throw new Exception("unsupported version: " + this.version);
                }
                this.signatureType = bcpgIn.ReadByte();
                this.keyAlgorithm  = (PublicKeyAlgorithmTag)bcpgIn.ReadByte();
                this.hashAlgorithm = (HashAlgorithmTag)bcpgIn.ReadByte();
                int    num    = bcpgIn.ReadByte() << 8 | bcpgIn.ReadByte();
                byte[] buffer = new byte[num];
                bcpgIn.ReadFully(buffer);
                SignatureSubpacketsParser signatureSubpacketsParser = new SignatureSubpacketsParser(new MemoryStream(buffer, false));
                IList list = Platform.CreateArrayList();
                SignatureSubpacket value;
                while ((value = signatureSubpacketsParser.ReadPacket()) != null)
                {
                    list.Add(value);
                }
                this.hashedData = new SignatureSubpacket[list.Count];
                for (int num2 = 0; num2 != this.hashedData.Length; num2++)
                {
                    SignatureSubpacket signatureSubpacket = (SignatureSubpacket)list[num2];
                    if (signatureSubpacket is IssuerKeyId)
                    {
                        this.keyId = ((IssuerKeyId)signatureSubpacket).KeyId;
                    }
                    else if (signatureSubpacket is SignatureCreationTime)
                    {
                        this.creationTime = DateTimeUtilities.DateTimeToUnixMs(((SignatureCreationTime)signatureSubpacket).GetTime());
                    }
                    this.hashedData[num2] = signatureSubpacket;
                }
                int    num3    = bcpgIn.ReadByte() << 8 | bcpgIn.ReadByte();
                byte[] buffer2 = new byte[num3];
                bcpgIn.ReadFully(buffer2);
                signatureSubpacketsParser = new SignatureSubpacketsParser(new MemoryStream(buffer2, false));
                list.Clear();
                while ((value = signatureSubpacketsParser.ReadPacket()) != null)
                {
                    list.Add(value);
                }
                this.unhashedData = new SignatureSubpacket[list.Count];
                for (int num4 = 0; num4 != this.unhashedData.Length; num4++)
                {
                    SignatureSubpacket signatureSubpacket2 = (SignatureSubpacket)list[num4];
                    if (signatureSubpacket2 is IssuerKeyId)
                    {
                        this.keyId = ((IssuerKeyId)signatureSubpacket2).KeyId;
                    }
                    this.unhashedData[num4] = signatureSubpacket2;
                }
            }
            this.fingerprint = new byte[2];
            bcpgIn.ReadFully(this.fingerprint);
            PublicKeyAlgorithmTag publicKeyAlgorithmTag = this.keyAlgorithm;

            switch (publicKeyAlgorithmTag)
            {
            case PublicKeyAlgorithmTag.RsaGeneral:
            case PublicKeyAlgorithmTag.RsaSign:
            {
                MPInteger mPInteger = new MPInteger(bcpgIn);
                this.signature = new MPInteger[]
                {
                    mPInteger
                };
                return;
            }

            case PublicKeyAlgorithmTag.RsaEncrypt:
                break;

            default:
                switch (publicKeyAlgorithmTag)
                {
                case PublicKeyAlgorithmTag.ElGamalEncrypt:
                case PublicKeyAlgorithmTag.ElGamalGeneral:
                {
                    MPInteger mPInteger2 = new MPInteger(bcpgIn);
                    MPInteger mPInteger3 = new MPInteger(bcpgIn);
                    MPInteger mPInteger4 = new MPInteger(bcpgIn);
                    this.signature = new MPInteger[]
                    {
                        mPInteger2,
                        mPInteger3,
                        mPInteger4
                    };
                    return;
                }

                case PublicKeyAlgorithmTag.Dsa:
                {
                    MPInteger mPInteger5 = new MPInteger(bcpgIn);
                    MPInteger mPInteger6 = new MPInteger(bcpgIn);
                    this.signature = new MPInteger[]
                    {
                        mPInteger5,
                        mPInteger6
                    };
                    return;
                }
                }
                break;
            }
            if (this.keyAlgorithm >= PublicKeyAlgorithmTag.Experimental_1 && this.keyAlgorithm <= PublicKeyAlgorithmTag.Experimental_11)
            {
                this.signature = null;
                MemoryStream memoryStream = new MemoryStream();
                int          num5;
                while ((num5 = bcpgIn.ReadByte()) >= 0)
                {
                    memoryStream.WriteByte((byte)num5);
                }
                this.signatureEncoding = memoryStream.ToArray();
                return;
            }
            throw new IOException("unknown signature key algorithm: " + this.keyAlgorithm);
        }
Exemple #25
0
 public MarkerPacket(
     BcpgInputStream bcpgIn)
 {
     bcpgIn.ReadFully(marker);
 }
        internal SignaturePacket(BcpgInputStream bcpgIn)
        {
            _version = bcpgIn.ReadByte();

            //TODO: refactor
            switch (_version)
            {
                case 2:
                case 3:
                    bcpgIn.ReadByte();
                    _signatureType = bcpgIn.ReadByte();
                    CreationTime = (((long)bcpgIn.ReadByte() << 24) | ((long)bcpgIn.ReadByte() << 16)
                                     | ((long)bcpgIn.ReadByte() << 8) | (uint)bcpgIn.ReadByte()) * 1000L;
                    _keyId |= (long)bcpgIn.ReadByte() << 56;
                    _keyId |= (long)bcpgIn.ReadByte() << 48;
                    _keyId |= (long)bcpgIn.ReadByte() << 40;
                    _keyId |= (long)bcpgIn.ReadByte() << 32;
                    _keyId |= (long)bcpgIn.ReadByte() << 24;
                    _keyId |= (long)bcpgIn.ReadByte() << 16;
                    _keyId |= (long)bcpgIn.ReadByte() << 8;
                    _keyId |= (uint)bcpgIn.ReadByte();
                    _keyAlgorithm = (PublicKeyAlgorithmTag)bcpgIn.ReadByte();
                    _hashAlgorithm = (HashAlgorithmTag)bcpgIn.ReadByte();
                    break;
                case 4:
                    {
                        _signatureType = bcpgIn.ReadByte();
                        _keyAlgorithm = (PublicKeyAlgorithmTag)bcpgIn.ReadByte();
                        _hashAlgorithm = (HashAlgorithmTag)bcpgIn.ReadByte();

                        var hashedLength = (bcpgIn.ReadByte() << 8) | bcpgIn.ReadByte();
                        var hashed = new byte[hashedLength];

                        bcpgIn.ReadFully(hashed);

                        //
                        // read the signature sub packet data.
                        //
                        using (var hashedStream = new MemoryStream(hashed, false))
                        {
                            var sIn = new SignatureSubpacketsParser(hashedStream);
                            var v = Platform.CreateArrayList<ISignatureSubpacket>();

                            SignatureSubpacket sub;
                            while ((sub = sIn.ReadPacket()) != null)
                            {
                                v.Add(sub);

                                var issuerKeyId = sub as IssuerKeyId;
                                if (issuerKeyId != null)
                                {
                                    _keyId = issuerKeyId.KeyId;
                                }
                                else
                                {
                                    var signatureCreationTime = sub as SignatureCreationTime;
                                    if (signatureCreationTime != null)
                                    {
                                        CreationTime = DateTimeUtilities.DateTimeToUnixMs(signatureCreationTime.GetTime());
                                    }
                                }
                            }
                            _hashedData = v.ToArray();

                            var unhashedLength = (bcpgIn.ReadByte() << 8) | bcpgIn.ReadByte();
                            var unhashed = new byte[unhashedLength];
                            bcpgIn.ReadFully(unhashed);

                            v.Clear();
                            using (var unhashedStream = new MemoryStream(unhashed, false))
                            {
                                sIn = new SignatureSubpacketsParser(unhashedStream);

                                while ((sub = sIn.ReadPacket()) != null)
                                {
                                    v.Add(sub);

                                    var issuerKeyId = sub as IssuerKeyId;
                                    if (issuerKeyId != null)
                                    {
                                        _keyId = issuerKeyId.KeyId;
                                    }
                                }
                            }
                            _unhashedData = v.ToArray();
                        }
                    }
                    break;
                default:
                    throw new Exception("unsupported version: " + _version);
            }

            _fingerprint = new byte[2];
            bcpgIn.ReadFully(_fingerprint);

            switch (_keyAlgorithm)
            {
                case PublicKeyAlgorithmTag.RsaGeneral:
                case PublicKeyAlgorithmTag.RsaSign:
                    var v = new MPInteger(bcpgIn);
                    _signature = new[] { v };
                    break;
                case PublicKeyAlgorithmTag.Dsa:
                case PublicKeyAlgorithmTag.Ecdsa:
                case PublicKeyAlgorithmTag.Ecdh:
                    var r = new MPInteger(bcpgIn);
                    var s = new MPInteger(bcpgIn);
                    _signature = new[] { r, s };
                    break;
                case PublicKeyAlgorithmTag.ElGamalEncrypt: // yep, this really does happen sometimes.
                case PublicKeyAlgorithmTag.ElGamalGeneral:
                    var p = new MPInteger(bcpgIn);
                    var g = new MPInteger(bcpgIn);
                    var y = new MPInteger(bcpgIn);
                    _signature = new[] { p, g, y };
                    break;
                default:
                    if (_keyAlgorithm >= PublicKeyAlgorithmTag.Experimental_1 && _keyAlgorithm <= PublicKeyAlgorithmTag.Experimental_11)
                    {
                        _signature = null;
                        using (var bOut = new MemoryStream())
                        {
                            int ch;
                            while ((ch = bcpgIn.ReadByte()) >= 0)
                            {
                                bOut.WriteByte((byte)ch);
                            }
                            _signatureEncoding = bOut.ToArray();
                        }
                    }
                    else
                    {
                        throw new IOException("unknown signature key algorithm: " + _keyAlgorithm);
                    }
                    break;
            }
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="SecretKeyPacket"/> class.
        /// </summary>
        /// <param name="bcpgIn">The BCPG in.</param>
        internal SecretKeyPacket(BcpgInputStream bcpgIn)
        {
            if (this is SecretSubkeyPacket)
            {
                this.PublicKeyPacket = new PublicSubkeyPacket(bcpgIn);
            }
            else
            {
                this.PublicKeyPacket = new PublicKeyPacket(bcpgIn);
            }

            this.S2KUsage = bcpgIn.ReadByte();

            if (this.S2KUsage == UsageChecksum || this.S2KUsage == UsageSha1)
            {
                this.EncAlgorithm = (SymmetricKeyAlgorithmTag)bcpgIn.ReadByte();
                this.S2K = new S2k(bcpgIn);
            }
            else
            {
                this.EncAlgorithm = (SymmetricKeyAlgorithmTag)this.S2KUsage;
            }

            if (!(this.S2K != null && this.S2K.Type == S2k.GnuDummyS2K && this.S2K.ProtectionMode == 0x01))
            {
                if (this.S2KUsage != 0)
                {
                    _iv = ((int)EncAlgorithm) < 7 ? new byte[8] : new byte[16];
                    bcpgIn.ReadFully(_iv);
                }
            }

            _secKeyData = bcpgIn.ReadAll();
        }
 public MarkerPacket(
     BcpgInputStream bcpgIn)
 {
     bcpgIn.ReadFully(marker);
 }
        internal SignaturePacket(BcpgInputStream bcpgIn)
        {
            _version = bcpgIn.ReadByte();


            //TODO: refactor
            switch (_version)
            {
            case 2:
            case 3:
                bcpgIn.ReadByte();
                _signatureType = bcpgIn.ReadByte();
                CreationTime   = (((long)bcpgIn.ReadByte() << 24) | ((long)bcpgIn.ReadByte() << 16)
                                  | ((long)bcpgIn.ReadByte() << 8) | (uint)bcpgIn.ReadByte()) * 1000L;
                _keyId        |= (long)bcpgIn.ReadByte() << 56;
                _keyId        |= (long)bcpgIn.ReadByte() << 48;
                _keyId        |= (long)bcpgIn.ReadByte() << 40;
                _keyId        |= (long)bcpgIn.ReadByte() << 32;
                _keyId        |= (long)bcpgIn.ReadByte() << 24;
                _keyId        |= (long)bcpgIn.ReadByte() << 16;
                _keyId        |= (long)bcpgIn.ReadByte() << 8;
                _keyId        |= (uint)bcpgIn.ReadByte();
                _keyAlgorithm  = (PublicKeyAlgorithmTag)bcpgIn.ReadByte();
                _hashAlgorithm = (HashAlgorithmTag)bcpgIn.ReadByte();
                break;

            case 4:
            {
                _signatureType = bcpgIn.ReadByte();
                _keyAlgorithm  = (PublicKeyAlgorithmTag)bcpgIn.ReadByte();
                _hashAlgorithm = (HashAlgorithmTag)bcpgIn.ReadByte();

                var hashedLength = (bcpgIn.ReadByte() << 8) | bcpgIn.ReadByte();
                var hashed       = new byte[hashedLength];

                bcpgIn.ReadFully(hashed);

                //
                // read the signature sub packet data.
                //
                using (var hashedStream = new MemoryStream(hashed, false))
                {
                    var sIn = new SignatureSubpacketsParser(hashedStream);
                    var v   = Platform.CreateArrayList <ISignatureSubpacket>();

                    SignatureSubpacket sub;
                    while ((sub = sIn.ReadPacket()) != null)
                    {
                        v.Add(sub);

                        var issuerKeyId = sub as IssuerKeyId;
                        if (issuerKeyId != null)
                        {
                            _keyId = issuerKeyId.KeyId;
                        }
                        else
                        {
                            var signatureCreationTime = sub as SignatureCreationTime;
                            if (signatureCreationTime != null)
                            {
                                CreationTime = DateTimeUtilities.DateTimeToUnixMs(signatureCreationTime.GetTime());
                            }
                        }
                    }
                    _hashedData = v.ToArray();

                    var unhashedLength = (bcpgIn.ReadByte() << 8) | bcpgIn.ReadByte();
                    var unhashed       = new byte[unhashedLength];
                    bcpgIn.ReadFully(unhashed);

                    v.Clear();
                    using (var unhashedStream = new MemoryStream(unhashed, false))
                    {
                        sIn = new SignatureSubpacketsParser(unhashedStream);

                        while ((sub = sIn.ReadPacket()) != null)
                        {
                            v.Add(sub);

                            var issuerKeyId = sub as IssuerKeyId;
                            if (issuerKeyId != null)
                            {
                                _keyId = issuerKeyId.KeyId;
                            }
                        }
                    }
                    _unhashedData = v.ToArray();
                }
            }
            break;

            default:
                throw new Exception("unsupported version: " + _version);
            }

            _fingerprint = new byte[2];
            bcpgIn.ReadFully(_fingerprint);

            switch (_keyAlgorithm)
            {
            case PublicKeyAlgorithmTag.RsaGeneral:
            case PublicKeyAlgorithmTag.RsaSign:
                var v = new MPInteger(bcpgIn);
                _signature = new[] { v };
                break;

            case PublicKeyAlgorithmTag.Dsa:
            case PublicKeyAlgorithmTag.Ecdsa:
            case PublicKeyAlgorithmTag.Ecdh:
                var r = new MPInteger(bcpgIn);
                var s = new MPInteger(bcpgIn);
                _signature = new[] { r, s };
                break;

            case PublicKeyAlgorithmTag.ElGamalEncrypt:     // yep, this really does happen sometimes.
            case PublicKeyAlgorithmTag.ElGamalGeneral:
                var p = new MPInteger(bcpgIn);
                var g = new MPInteger(bcpgIn);
                var y = new MPInteger(bcpgIn);
                _signature = new[] { p, g, y };
                break;

            default:
                if (_keyAlgorithm >= PublicKeyAlgorithmTag.Experimental_1 && _keyAlgorithm <= PublicKeyAlgorithmTag.Experimental_11)
                {
                    _signature = null;
                    using (var bOut = new MemoryStream())
                    {
                        int ch;
                        while ((ch = bcpgIn.ReadByte()) >= 0)
                        {
                            bOut.WriteByte((byte)ch);
                        }
                        _signatureEncoding = bOut.ToArray();
                    }
                }
                else
                {
                    throw new IOException("unknown signature key algorithm: " + _keyAlgorithm);
                }
                break;
            }
        }
		internal SignaturePacket(
            BcpgInputStream bcpgIn)
        {
            version = bcpgIn.ReadByte();

			if (version == 3 || version == 2)
            {
//                int l =
                bcpgIn.ReadByte();

				signatureType = bcpgIn.ReadByte();
                creationTime = (((long)bcpgIn.ReadByte() << 24) | ((long)bcpgIn.ReadByte() << 16)
                    | ((long)bcpgIn.ReadByte() << 8) | (uint)bcpgIn.ReadByte()) * 1000L;

				keyId |= (long)bcpgIn.ReadByte() << 56;
                keyId |= (long)bcpgIn.ReadByte() << 48;
                keyId |= (long)bcpgIn.ReadByte() << 40;
                keyId |= (long)bcpgIn.ReadByte() << 32;
                keyId |= (long)bcpgIn.ReadByte() << 24;
                keyId |= (long)bcpgIn.ReadByte() << 16;
                keyId |= (long)bcpgIn.ReadByte() << 8;
                keyId |= (uint)bcpgIn.ReadByte();

				keyAlgorithm = (PublicKeyAlgorithmTag) bcpgIn.ReadByte();
                hashAlgorithm = (HashAlgorithmTag) bcpgIn.ReadByte();
            }
            else if (version == 4)
            {
                signatureType = bcpgIn.ReadByte();
                keyAlgorithm = (PublicKeyAlgorithmTag) bcpgIn.ReadByte();
                hashAlgorithm = (HashAlgorithmTag) bcpgIn.ReadByte();

				int hashedLength = (bcpgIn.ReadByte() << 8) | bcpgIn.ReadByte();
                byte[] hashed = new byte[hashedLength];

				bcpgIn.ReadFully(hashed);

				//
                // read the signature sub packet data.
                //
                SignatureSubpacketsParser sIn = new SignatureSubpacketsParser(
                    new MemoryStream(hashed, false));

				ArrayList v = new ArrayList();
				SignatureSubpacket sub;
				while ((sub = sIn.ReadPacket()) != null)
                {
                    v.Add(sub);
                }

				hashedData = new SignatureSubpacket[v.Count];

				for (int i = 0; i != hashedData.Length; i++)
                {
                    SignatureSubpacket p = (SignatureSubpacket)v[i];
                    if (p is IssuerKeyId)
                    {
                        keyId = ((IssuerKeyId)p).KeyId;
                    }
                    else if (p is SignatureCreationTime)
                    {
                        creationTime = DateTimeUtilities.DateTimeToUnixMs(
							((SignatureCreationTime)p).GetTime());
                    }

					hashedData[i] = p;
                }

				int unhashedLength = (bcpgIn.ReadByte() << 8) | bcpgIn.ReadByte();
                byte[] unhashed = new byte[unhashedLength];

				bcpgIn.ReadFully(unhashed);

				sIn = new SignatureSubpacketsParser(new MemoryStream(unhashed, false));

				v.Clear();

				while ((sub = sIn.ReadPacket()) != null)
                {
                    v.Add(sub);
                }

				unhashedData = new SignatureSubpacket[v.Count];

				for (int i = 0; i != unhashedData.Length; i++)
                {
                    SignatureSubpacket p = (SignatureSubpacket)v[i];
                    if (p is IssuerKeyId)
                    {
                        keyId = ((IssuerKeyId)p).KeyId;
                    }

					unhashedData[i] = p;
                }
            }
            else
            {
                throw new Exception("unsupported version: " + version);
            }

			fingerprint = new byte[2];
            bcpgIn.ReadFully(fingerprint);

			switch (keyAlgorithm)
            {
                case PublicKeyAlgorithmTag.RsaGeneral:
                case PublicKeyAlgorithmTag.RsaSign:
                    MPInteger v = new MPInteger(bcpgIn);
					signature = new MPInteger[]{ v };
                    break;
				case PublicKeyAlgorithmTag.Dsa:
                    MPInteger r = new MPInteger(bcpgIn);
                    MPInteger s = new MPInteger(bcpgIn);
					signature = new MPInteger[]{ r, s };
                    break;
                case PublicKeyAlgorithmTag.ElGamalEncrypt: // yep, this really does happen sometimes.
                case PublicKeyAlgorithmTag.ElGamalGeneral:
                    MPInteger p = new MPInteger(bcpgIn);
                    MPInteger g = new MPInteger(bcpgIn);
                    MPInteger y = new MPInteger(bcpgIn);
					signature = new MPInteger[]{ p, g, y };
                    break;
                default:
					if (keyAlgorithm >= PublicKeyAlgorithmTag.Experimental_1 && keyAlgorithm <= PublicKeyAlgorithmTag.Experimental_11)
					{
						signature = null;
						MemoryStream bOut = new MemoryStream();
						int ch;
						while ((ch = bcpgIn.ReadByte()) >= 0)
						{
							bOut.WriteByte((byte) ch);
						}
						signatureEncoding = bOut.ToArray();
					}
					else
					{
						throw new IOException("unknown signature key algorithm: " + keyAlgorithm);
					}
					break;
            }
        }
        protected static byte[] ReadBytesOfEncodedLength(
            BcpgInputStream bcpgIn)
        {
            int length = bcpgIn.ReadByte();
            if (length == 0 || length == 0xFF)
            {
                throw new IOException("future extensions not yet implemented.");
            }

            byte[] buffer = new byte[length + 2];
            bcpgIn.ReadFully(buffer, 2, buffer.Length - 2);
            buffer[0] = (byte)0x06;
            buffer[1] = (byte)length;

            return buffer;
        }
        /// <summary>
        /// Reads the numver of bytes encoded.
        /// </summary>
        /// <param name="bcpgIn">The BCPG in.</param>
        /// <returns></returns>
        /// <exception cref="System.NotSupportedException">future extensions not yet implemented.</exception>
        protected byte[] ReadBytesOfEncodedLength(BcpgInputStream bcpgIn)
        {
            var length = bcpgIn.ReadByte();
            if (length == 0 || length == 0xFF)
                throw new PgpException("future extensions not yet implemented.");

            var buffer = new byte[length];
            bcpgIn.ReadFully(buffer);
            return buffer;
        }