public ElGamalPublicBcpgKey( BcpgInputStream bcpgIn) { this.p = new MPInteger(bcpgIn); this.g = new MPInteger(bcpgIn); this.y = new MPInteger(bcpgIn); }
internal PublicKeyPacket( BcpgInputStream bcpgIn) { version = bcpgIn.ReadByte(); time = ((uint)bcpgIn.ReadByte() << 24) | ((uint)bcpgIn.ReadByte() << 16) | ((uint)bcpgIn.ReadByte() << 8) | (uint)bcpgIn.ReadByte(); if (version <= 3) { validDays = (bcpgIn.ReadByte() << 8) | bcpgIn.ReadByte(); } algorithm = (PublicKeyAlgorithmTag) bcpgIn.ReadByte(); switch ((PublicKeyAlgorithmTag) algorithm) { case PublicKeyAlgorithmTag.RsaEncrypt: case PublicKeyAlgorithmTag.RsaGeneral: case PublicKeyAlgorithmTag.RsaSign: key = new RsaPublicBcpgKey(bcpgIn); break; case PublicKeyAlgorithmTag.Dsa: key = new DsaPublicBcpgKey(bcpgIn); break; case PublicKeyAlgorithmTag.ElGamalEncrypt: case PublicKeyAlgorithmTag.ElGamalGeneral: key = new ElGamalPublicBcpgKey(bcpgIn); break; default: throw new IOException("unknown PGP public key algorithm encountered"); } }
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 ((PublicKeyAlgorithmTag) algorithm) { case PublicKeyAlgorithmTag.RsaEncrypt: case PublicKeyAlgorithmTag.RsaGeneral: data = new BigInteger[]{ new MPInteger(bcpgIn).Value }; break; case PublicKeyAlgorithmTag.ElGamalEncrypt: case PublicKeyAlgorithmTag.ElGamalGeneral: data = new BigInteger[] { new MPInteger(bcpgIn).Value, new MPInteger(bcpgIn).Value }; break; default: throw new IOException("unknown PGP public key algorithm encountered"); } }
/// <param name="bcpgIn">The stream to read the packet from.</param> public DsaPublicBcpgKey( BcpgInputStream bcpgIn) { this.p = new MPInteger(bcpgIn); this.q = new MPInteger(bcpgIn); this.g = new MPInteger(bcpgIn); this.y = new MPInteger(bcpgIn); }
internal ExperimentalPacket( PacketTag tag, BcpgInputStream bcpgIn) { this.tag = tag; this.contents = bcpgIn.ReadAll(); }
internal ModDetectionCodePacket( BcpgInputStream bcpgIn) { if (bcpgIn == null) throw new ArgumentNullException("bcpgIn"); this.digest = new byte[20]; bcpgIn.ReadFully(this.digest); }
public SymmetricKeyEncSessionPacket( BcpgInputStream bcpgIn) { version = bcpgIn.ReadByte(); encAlgorithm = (SymmetricKeyAlgorithmTag) bcpgIn.ReadByte(); s2k = new S2k(bcpgIn); secKeyData = bcpgIn.ReadAll(); }
public RsaSecretBcpgKey( BcpgInputStream bcpgIn) { this.d = new MPInteger(bcpgIn); this.p = new MPInteger(bcpgIn); this.q = new MPInteger(bcpgIn); this.u = new MPInteger(bcpgIn); this.expP = d.Value.Remainder(p.Value.Subtract(BigInteger.One)); this.expQ = d.Value.Remainder(q.Value.Subtract(BigInteger.One)); this.crt = q.Value.ModInverse(p.Value); }
public TrustPacket( BcpgInputStream bcpgIn) { MemoryStream bOut = new MemoryStream(); int ch; while ((ch = bcpgIn.ReadByte()) >= 0) { bOut.WriteByte((byte) ch); } levelAndTrustAmount = bOut.ToArray(); }
public MPInteger( BcpgInputStream bcpgIn) { if (bcpgIn == null) throw new ArgumentNullException("bcpgIn"); int length = (bcpgIn.ReadByte() << 8) | bcpgIn.ReadByte(); byte[] bytes = new byte[(length + 7) / 8]; bcpgIn.ReadFully(bytes); this.val = new BigInteger(1, bytes); }
internal LiteralDataPacket( BcpgInputStream bcpgIn) : base(bcpgIn) { format = bcpgIn.ReadByte(); int len = bcpgIn.ReadByte(); fileName = new byte[len]; for (int i = 0; i != len; ++i) { fileName[i] = (byte)bcpgIn.ReadByte(); } modDate = (((uint)bcpgIn.ReadByte() << 24) | ((uint)bcpgIn.ReadByte() << 16) | ((uint)bcpgIn.ReadByte() << 8) | (uint)bcpgIn.ReadByte()) * 1000L; }
public UserAttributePacket( BcpgInputStream bcpgIn) { UserAttributeSubpacketsParser sIn = new UserAttributeSubpacketsParser(bcpgIn); UserAttributeSubpacket sub; IList v = Platform.CreateArrayList(); while ((sub = sIn.ReadPacket()) != null) { v.Add(sub); } subpackets = new UserAttributeSubpacket[v.Count]; for (int i = 0; i != subpackets.Length; i++) { subpackets[i] = (UserAttributeSubpacket)v[i]; } }
internal OnePassSignaturePacket( BcpgInputStream bcpgIn) { version = bcpgIn.ReadByte(); sigType = bcpgIn.ReadByte(); hashAlgorithm = (HashAlgorithmTag) bcpgIn.ReadByte(); keyAlgorithm = (PublicKeyAlgorithmTag) 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(); nested = bcpgIn.ReadByte(); }
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(); }
public UserIdPacket( BcpgInputStream bcpgIn) { this.idData = bcpgIn.ReadAll(); }
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)); IList v = Platform.CreateArrayList(); 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; } }
internal CompressedDataPacket( BcpgInputStream bcpgIn) : base(bcpgIn) { this.algorithm = (CompressionAlgorithmTag) bcpgIn.ReadByte(); }
public Packet ReadPacket() { int hdr = ReadByte(); if (hdr < 0) { return null; } if ((hdr & 0x80) == 0) { throw new IOException("invalid header encountered"); } bool newPacket = (hdr & 0x40) != 0; PacketTag tag; int bodyLen = 0; bool partial = false; if (newPacket) { tag = (PacketTag) (hdr & 0x3f); int l = ReadByte(); if (l < 192) { bodyLen = l; } else if (l <= 223) { int b = _in.ReadByte(); bodyLen = ((l - 192) << 8) + (b) + 192; } else if (l == 255) { bodyLen = (_in.ReadByte() << 24) | (_in.ReadByte() << 16) | (_in.ReadByte() << 8) | _in.ReadByte(); } else { partial = true; bodyLen = 1 << (l & 0x1f); } } else { int lengthType = hdr & 0x3; tag = (PacketTag) ((hdr & 0x3f) >> 2); switch (lengthType) { case 0: bodyLen = ReadByte(); break; case 1: bodyLen = (ReadByte() << 8) | ReadByte(); break; case 2: bodyLen = (ReadByte() << 24) | (ReadByte() << 16) | (ReadByte() << 8) | ReadByte(); break; case 3: partial = true; break; default: throw new IOException("unknown length type encountered"); } } BcpgInputStream objStream; if (bodyLen == 0 && partial) { objStream = this; } else { var pis = new PartialInputStream(this, partial, bodyLen); objStream = new BcpgInputStream(pis); } switch (tag) { case PacketTag.Reserved: return new InputStreamPacket(objStream); case PacketTag.PublicKeyEncryptedSession: return new PublicKeyEncSessionPacket(objStream); case PacketTag.Signature: return new SignaturePacket(objStream); case PacketTag.SymmetricKeyEncryptedSessionKey: return new SymmetricKeyEncSessionPacket(objStream); case PacketTag.OnePassSignature: return new OnePassSignaturePacket(objStream); case PacketTag.SecretKey: return new SecretKeyPacket(objStream); case PacketTag.PublicKey: return new PublicKeyPacket(objStream); case PacketTag.SecretSubkey: return new SecretSubkeyPacket(objStream); case PacketTag.CompressedData: return new CompressedDataPacket(objStream); case PacketTag.SymmetricKeyEncrypted: return new SymmetricEncDataPacket(objStream); case PacketTag.Marker: return new MarkerPacket(objStream); case PacketTag.LiteralData: return new LiteralDataPacket(objStream); case PacketTag.Trust: return new TrustPacket(objStream); case PacketTag.UserId: return new UserIdPacket(objStream); case PacketTag.UserAttribute: return new UserAttributePacket(objStream); case PacketTag.PublicSubkey: return new PublicSubkeyPacket(objStream); case PacketTag.SymmetricEncryptedIntegrityProtected: return new SymmetricEncIntegrityPacket(objStream); case PacketTag.ModificationDetectionCode: return new ModDetectionCodePacket(objStream); case PacketTag.Experimental1: case PacketTag.Experimental2: case PacketTag.Experimental3: case PacketTag.Experimental4: return new ExperimentalPacket(tag, objStream); default: throw new IOException("unknown packet type encountered: " + tag); } }
/** * @param in */ public DsaSecretBcpgKey( BcpgInputStream bcpgIn) { this.x = new MPInteger(bcpgIn); }
internal PublicSubkeyPacket( BcpgInputStream bcpgIn) : base(bcpgIn) { }
public MarkerPacket( BcpgInputStream bcpgIn) { bcpgIn.ReadFully(marker); }
public SymmetricEncDataPacket( BcpgInputStream bcpgIn) : base(bcpgIn) { }
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)); IList v = Platform.CreateArrayList(); 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; } }
internal SecretSubkeyPacket( BcpgInputStream bcpgIn) : base(bcpgIn) { }
/** * @param in */ public ElGamalSecretBcpgKey( BcpgInputStream bcpgIn) { this.x = new MPInteger(bcpgIn); }
internal SymmetricEncIntegrityPacket( BcpgInputStream bcpgIn) : base(bcpgIn) { version = bcpgIn.ReadByte(); }
/// <summary>Construct an RSA public key from the passed in stream.</summary> public RsaPublicBcpgKey( BcpgInputStream bcpgIn) { this.n = new MPInteger(bcpgIn); this.e = new MPInteger(bcpgIn); }
internal PartialInputStream(BcpgInputStream bcpgIn, bool partial, int dataLength) { _in = bcpgIn; _partial = partial; _dataLength = dataLength; }