Ejemplo n.º 1
0
 protected PgpPacketBase(PgpPacketBase FromPacket)
 {
     _eStatus       = FromPacket.eStatus;
     _iHeaderLength = FromPacket.iHeaderLength;
     _iDataLength   = FromPacket.iDataLength;
     _abRawBytes    = FromPacket.abRawBytes;
 }
Ejemplo n.º 2
0
        /// <summary>Constructor for OpenPGP keyring files.</summary>
        public PgpToken(byte[] abKeyBytes, List <PgpToken> ltTokens, EncryptionServices Cryptography) : this(Cryptography)
        {
            bool      isPublicKey = true;
            int       iPgpPacketPointer = 0;
            PgpPacket DecodedPgpPacket, RawPgpPacket;

            if (abKeyBytes != null)
            {
                _eStatus = nStatus.OK;

                while ((_eStatus == nStatus.OK) && (iPgpPacketPointer < abKeyBytes.Length - 2))
                {
                    RawPgpPacket = new PgpPacket(abKeyBytes, iPgpPacketPointer);
                    if (RawPgpPacket.eStatus == PgpPacketBase.nStatus.OK)
                    {
                        switch (RawPgpPacket.ePacketTag)
                        {
                        case PgpPacket.nPacketTag.PrivateKey:
                        case PgpPacket.nPacketTag.PrivateSubkey: DecodedPgpPacket = ParsePrivateKeyPacket(RawPgpPacket); break;

                        case PgpPacket.nPacketTag.PublicKey:
                        case PgpPacket.nPacketTag.PublicSubkey: DecodedPgpPacket = ParsePublicKeyPacket(RawPgpPacket); break;

                        case PgpPacket.nPacketTag.Signature: DecodedPgpPacket = ParseSignaturePacket(RawPgpPacket, ltTokens); break;

                        case PgpPacket.nPacketTag.UserId: DecodedPgpPacket = ParseUserIdPacket(RawPgpPacket); break;

                        default: DecodedPgpPacket = null; Console.WriteLine("not implemented: ePacketTag=" + RawPgpPacket.ePacketTag.ToString()); break;
                        }
                        if ((DecodedPgpPacket == null) || (DecodedPgpPacket.eStatus != PgpPacketBase.nStatus.OK))
                        {
                            _eStatus = nStatus.ParseErrorSub;
                        }
                        // else
                        //     Console.WriteLine("   Found ePacketTag=" + RawPgpPacket.ePacketTag.ToString() + " iHeaderLength=" + RawPgpPacket.iHeaderLength.ToString() + ", iDataLength=" + RawPgpPacket.iDataLength.ToString());

                        iPgpPacketPointer += (RawPgpPacket.iHeaderLength + RawPgpPacket.iPartialHeaders + RawPgpPacket.iDataLength);
                    }
                    else
                    {
                        _eStatus = nStatus.ParseErrorRaw;
                    }
                }

                if (((_eStatus == nStatus.OK) && (iPgpPacketPointer != abKeyBytes.Length)) || (_ltSubkeys == null) || (_ltSubkeys.Count == 0))
                {
                    _eStatus = nStatus.ParseErrorRaw;
                }
                else
                {
                    foreach (PgpSignature Subkey in _ltSubkeys)
                    {
                        isPublicKey = isPublicKey && (Subkey.PrivateKeyPacket == null);   // one private key packet flags the whole token as private
                    }
                    _eType = isPublicKey ? nType.Public : nType.Private;
                }
            }
        }
Ejemplo n.º 3
0
 /// <summary>Base constructor for initialisation.</summary>
 private PgpToken(EncryptionServices Cryptography)
 {
     _eStatus      = nStatus.Undefined;
     _eType        = nType.Undefined;
     _sSlotName    = string.Empty;
     _TokenInfo    = null;
     _UserIdPacket = null;
     _Cryptography = Cryptography;
     _KeyPacket    = null;
     _ltSubkeys    = new List <PgpSignature>();
 }
Ejemplo n.º 4
0
        protected int CountUsedBits(byte[] abLongInteger)
        {
            int  i, j, iReturn;
            byte b;

            if ((abLongInteger == null) || (abLongInteger.Length == 0))
            {
                _eStatus = nStatus.ParseError;
                iReturn  = 0;
            }
            else
            {
                iReturn = abLongInteger.Length << 3;
                i       = 0;
                do
                {
                    b = abLongInteger[i++];
                    if (b == 0)
                    {
                        iReturn -= 8;
                    }
                    else
                    {
                        j = 0;
                        do
                        {
                            if ((b & 0x80) == 0)
                            {
                                iReturn--;
                                b <<= 1;
                                j++;
                            }
                            else
                            {
                                j = 8;    // end the loop
                            }
                        } while (j < 8);
                        i = abLongInteger.Length;    // end the loop
                    }
                } while (i < abLongInteger.Length);
            }
            return(iReturn);
        }
Ejemplo n.º 5
0
        public PgpMessage(byte[] abMessageBytes, EncryptionServices Cryptography) : this(Cryptography)
        {
            int       iPgpPacketPointer = 0;
            PgpPacket DecodedPgpPacket, RawPgpPacket;

            if (abMessageBytes != null)
            {
                _eStatus = nStatus.OK;

                while ((_eStatus == nStatus.OK) && (iPgpPacketPointer < abMessageBytes.Length - 2))
                {
                    RawPgpPacket = new PgpPacket(abMessageBytes, iPgpPacketPointer);
                    if (RawPgpPacket.eStatus == PgpPacketBase.nStatus.OK)
                    {
                        switch (RawPgpPacket.ePacketTag)
                        {
                        case PgpPacket.nPacketTag.PublicKeyEncryptedKey: DecodedPgpPacket = ParsePublicKeyEncryptedKeyPacket(RawPgpPacket); break;

                        case PgpPacket.nPacketTag.SymmetricallyEncryptedProtected: DecodedPgpPacket = new PgpSymmetricallyEncryptedDataPacket(RawPgpPacket); break;

                        default: DecodedPgpPacket = null; Console.WriteLine("not implemented: ePacketTag=" + RawPgpPacket.ePacketTag.ToString()); break;
                        }
                        if ((DecodedPgpPacket == null) || (DecodedPgpPacket.eStatus != PgpPacketBase.nStatus.OK))
                        {
                            _eStatus = nStatus.ParseErrorSub;
                        }

                        iPgpPacketPointer += (RawPgpPacket.iHeaderLength + RawPgpPacket.iPartialHeaders + RawPgpPacket.iDataLength);
                    }
                    else
                    {
                        _eStatus = nStatus.ParseErrorRaw;
                    }
                }
            }

            if (((_eStatus == nStatus.OK) && (iPgpPacketPointer != abMessageBytes.Length)))
            {
                _eStatus = nStatus.ParseErrorRaw;
            }
        }
Ejemplo n.º 6
0
 private PgpMessage(EncryptionServices Cryptography)
 {
     _eStatus                  = nStatus.Undefined;
     _Cryptography             = Cryptography;
     _ltPublicKeyEncryptedKeys = new List <PgpPublicKeyEncryptedKey>();
 }
Ejemplo n.º 7
0
        /// <summary></summary>
        /// <param name=""></param>
        /// <param name=""></param>
        public byte[] Parse(string sArmor, bool isKey)
        {
            byte[] abCrc24, abReturn = null;
            int    i, iCrc24Value;
            Crc24  Crc24Computed;
            BytesAndTextUtility StringConverter;
            nArmorParserState   eArmorParserState = nArmorParserState.Start;
            string sArmoredData, sChecksum, sHeader;

            string[] asLines;

            if (string.IsNullOrEmpty(sArmor))
            {
                _eStatus = nStatus.ParseError;
            }
            else
            {
                asLines      = sArmor.Split(asDelimiters, StringSplitOptions.None);
                sArmoredData = sChecksum = sHeader = string.Empty;

                for (i = 0; i < asLines.Length; i++)
                {
                    switch (eArmorParserState)
                    {
                    case nArmorParserState.Start:
                        eArmorParserState = isKey ? ParseCheckForKeyHeader(asLines[i]) : ParseCheckForMessageHeader(asLines[i]);
                        if (eArmorParserState == nArmorParserState.Header)
                        {
                            sHeader = asLines[i];
                        }
                        break;

                    case nArmorParserState.Header:
                    case nArmorParserState.KeyValue: eArmorParserState = ParseCheckForBlankLine(asLines[i]); break;

                    case nArmorParserState.BlankLine:
                    case nArmorParserState.ArmoredData:
                        eArmorParserState = ParseCheckForData(asLines[i], sHeader);
                        if (eArmorParserState == nArmorParserState.ArmoredData)
                        {
                            sArmoredData += asLines[i];
                        }
                        else if (eArmorParserState == nArmorParserState.Checksum)
                        {
                            sChecksum = asLines[i];
                        }
                        break;

                    case nArmorParserState.Checksum: eArmorParserState = ParseCheckForFooter(asLines[i], sHeader); break;
                    }
                }

                if (eArmorParserState == nArmorParserState.Success)
                {
                    StringConverter = new BytesAndTextUtility(sArmoredData);
                    abReturn        = StringConverter.abBase64StringBytes;

                    if (abReturn == null)
                    {
                        _eStatus = nStatus.ParseError;
                    }
                    else
                    {
                        _eStatus = nStatus.OK;

                        if (!string.IsNullOrEmpty(sChecksum))
                        {
                            StringConverter = new BytesAndTextUtility(sChecksum.Substring(1));
                            abCrc24         = StringConverter.abBase64StringBytes;

                            if ((abCrc24 == null) || (abCrc24.Length != Crc24.ciCrc24Length))
                            {
                                _eStatus = nStatus.ParseError;
                                abReturn = null;
                            }
                            else
                            {
                                iCrc24Value   = (abCrc24[0] << 16) | (abCrc24[1] << 8) | abCrc24[2];
                                Crc24Computed = new Crc24(abReturn);
                                if (iCrc24Value != Crc24Computed.iCrc24)
                                {
                                    _eStatus = nStatus.CrcError;
                                    abReturn = null;
                                }
                            }
                        }
                    }
                }
                else
                {
                    _eStatus = nStatus.ParseError;
                }
            }
            return(abReturn);
        }
Ejemplo n.º 8
0
 public PgpArmor()
 {
     _eStatus = nStatus.Undefined;
 }
Ejemplo n.º 9
0
 protected PgpPacketBase()
 {
     _eStatus     = nStatus.Undefined;
     _iDataLength = _iHeaderLength = 0;
     _abRawBytes  = null;
 }