示例#1
0
 internal SecretKeyPacket(BcpgInputStream bcpgIn)
 {
     if (this is SecretSubkeyPacket)
     {
         pubKeyPacket = new PublicSubkeyPacket(bcpgIn);
     }
     else
     {
         pubKeyPacket = new PublicKeyPacket(bcpgIn);
     }
     s2kUsage = bcpgIn.ReadByte();
     if (s2kUsage == 255 || s2kUsage == 254)
     {
         encAlgorithm = (SymmetricKeyAlgorithmTag)bcpgIn.ReadByte();
         s2k          = new S2k(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();
 }
 internal ModDetectionCodePacket(BcpgInputStream bcpgIn)
 {
     if (bcpgIn == null)
     {
         throw new ArgumentNullException("bcpgIn");
     }
     digest = new byte[20];
     bcpgIn.ReadFully(digest);
 }
示例#3
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);
        val = new BigInteger(1, array);
    }
    protected static byte[] ReadBytesOfEncodedLength(BcpgInputStream bcpgIn)
    {
        int num = 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);
    }
示例#5
0
    public ECDHPublicBcpgKey(BcpgInputStream bcpgIn)
        : base(bcpgIn)
    {
        int num = 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();
    }
示例#6
0
 public MarkerPacket(BcpgInputStream bcpgIn)
 {
     bcpgIn.ReadFully(marker);
 }
示例#7
0
    internal SignaturePacket(BcpgInputStream bcpgIn)
    {
        version = bcpgIn.ReadByte();
        if (version == 3 || version == 2)
        {
            bcpgIn.ReadByte();
            signatureType = bcpgIn.ReadByte();
            creationTime  = (((long)bcpgIn.ReadByte() << 24) | ((long)bcpgIn.ReadByte() << 16) | ((long)bcpgIn.ReadByte() << 8) | (uint)bcpgIn.ReadByte()) * 1000;
            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)
            {
                throw new Exception("unsupported version: " + version);
            }
            signatureType = bcpgIn.ReadByte();
            keyAlgorithm  = (PublicKeyAlgorithmTag)bcpgIn.ReadByte();
            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, writable: false));
            IList list = Platform.CreateArrayList();
            SignatureSubpacket value;
            while ((value = signatureSubpacketsParser.ReadPacket()) != null)
            {
                list.Add(value);
            }
            hashedData = new SignatureSubpacket[list.Count];
            for (int i = 0; i != hashedData.Length; i++)
            {
                SignatureSubpacket signatureSubpacket = (SignatureSubpacket)list[i];
                if (signatureSubpacket is IssuerKeyId)
                {
                    keyId = ((IssuerKeyId)signatureSubpacket).KeyId;
                }
                else if (signatureSubpacket is SignatureCreationTime)
                {
                    creationTime = DateTimeUtilities.DateTimeToUnixMs(((SignatureCreationTime)signatureSubpacket).GetTime());
                }
                hashedData[i] = signatureSubpacket;
            }
            int    num2    = (bcpgIn.ReadByte() << 8) | bcpgIn.ReadByte();
            byte[] buffer2 = new byte[num2];
            bcpgIn.ReadFully(buffer2);
            signatureSubpacketsParser = new SignatureSubpacketsParser(new MemoryStream(buffer2, writable: false));
            list.Clear();
            while ((value = signatureSubpacketsParser.ReadPacket()) != null)
            {
                list.Add(value);
            }
            unhashedData = new SignatureSubpacket[list.Count];
            for (int j = 0; j != unhashedData.Length; j++)
            {
                SignatureSubpacket signatureSubpacket2 = (SignatureSubpacket)list[j];
                if (signatureSubpacket2 is IssuerKeyId)
                {
                    keyId = ((IssuerKeyId)signatureSubpacket2).KeyId;
                }
                unhashedData[j] = signatureSubpacket2;
            }
        }
        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 memoryStream = new MemoryStream();
            int          num3;
            while ((num3 = bcpgIn.ReadByte()) >= 0)
            {
                memoryStream.WriteByte((byte)num3);
            }
            signatureEncoding = memoryStream.ToArray();
            return;
        }
        throw new IOException("unknown signature key algorithm: " + keyAlgorithm);
    }