Beispiel #1
0
        internal OpenPgpPacketHeader(byte firstByte, Stream inputStream)
        {
            if ((firstByte & NewHeaderHighBits) != NewHeaderHighBits)
            {
                throw new ArgumentException();
            }

            _TagId = firstByte & ~NewHeaderHighBits;

            // See 4.2.2.1: "A one-octet Body Length header encodes a length of 0 to 191 octets."
            int firstLengthByte = inputStream.ReadByte();

            if (firstLengthByte < 0)
            {
                throw new EndOfStreamException();
            }
            if (firstLengthByte < 192)
            {
                Length = firstLengthByte;
                return;
            }

            // See 4.2.2.2: "A two-octet Body Length header encodes a length of 192 to 8383 octets."
            if ((firstLengthByte >= 192) && (firstLengthByte <= 223))
            {
                int secondLengthByte = inputStream.ReadByte();
                if (secondLengthByte < 0)
                {
                    throw new EndOfStreamException();
                }
                Length = ((firstLengthByte - 192) << 8) + secondLengthByte + 192;
                return;
            }

            // 4.2.2.3: "A five-octet Body Length header consists of a single octet holding the value 255, followed by a four-octet scalar."

            if (firstLengthByte != 255)
            {
                throw new InvalidDataException();
            }

            Length = OpenPgpScalarNumber.Read(inputStream, 4);
        }
Beispiel #2
0
 public virtual void WriteTo(Stream outputStream)
 {
     outputStream.WriteByte((byte)(NewHeaderHighBits | TagId));
     if (Length <= 191)
     {
         outputStream.WriteByte((byte)Length);
     }
     else if (Length <= 8383)
     {
         int  bodyLenRemainder = (int)(Length - 192);
         byte secondLengthByte = (byte)(bodyLenRemainder & 0xFF);
         bodyLenRemainder >>= 8;
         byte firstLengthByte = (byte)(bodyLenRemainder + 192);
         outputStream.WriteByte(firstLengthByte);
         outputStream.WriteByte(secondLengthByte);
     }
     else
     {
         outputStream.WriteByte(0xFF);
         OpenPgpScalarNumber.WriteTo((uint)Length, outputStream);
     }
 }
Beispiel #3
0
 public void WriteTo(Stream outputStream)
 {
     OpenPgpScalarNumber.WriteTo((uint)(Date - Epoch).TotalSeconds, outputStream);
 }
Beispiel #4
0
 public static OpenPgpTimeField Read(Stream inputStream)
 {
     return(new OpenPgpTimeField(OpenPgpScalarNumber.Read(inputStream, 4)));
 }