You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
3.7 KiB
126 lines
3.7 KiB
1 year ago
|
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
|
||
|
#pragma warning disable
|
||
|
using System;
|
||
|
using System.IO;
|
||
|
|
||
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Date;
|
||
|
|
||
|
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Bcpg
|
||
|
{
|
||
|
/// <remarks>Basic packet for a PGP public key.</remarks>
|
||
|
public class PublicKeyPacket
|
||
|
: ContainedPacket //, PublicKeyAlgorithmTag
|
||
|
{
|
||
|
private int version;
|
||
|
private long time;
|
||
|
private int validDays;
|
||
|
private PublicKeyAlgorithmTag algorithm;
|
||
|
private IBcpgKey key;
|
||
|
|
||
|
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;
|
||
|
case PublicKeyAlgorithmTag.ECDH:
|
||
|
key = new ECDHPublicBcpgKey(bcpgIn);
|
||
|
break;
|
||
|
case PublicKeyAlgorithmTag.ECDsa:
|
||
|
key = new ECDsaPublicBcpgKey(bcpgIn);
|
||
|
break;
|
||
|
default:
|
||
|
throw new IOException("unknown PGP public key algorithm encountered");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>Construct a version 4 public key packet.</summary>
|
||
|
public PublicKeyPacket(
|
||
|
PublicKeyAlgorithmTag algorithm,
|
||
|
DateTime time,
|
||
|
IBcpgKey key)
|
||
|
{
|
||
|
this.version = 4;
|
||
|
this.time = DateTimeUtilities.DateTimeToUnixMs(time) / 1000L;
|
||
|
this.algorithm = algorithm;
|
||
|
this.key = key;
|
||
|
}
|
||
|
|
||
|
public virtual int Version
|
||
|
{
|
||
|
get { return version; }
|
||
|
}
|
||
|
|
||
|
public virtual PublicKeyAlgorithmTag Algorithm
|
||
|
{
|
||
|
get { return algorithm; }
|
||
|
}
|
||
|
|
||
|
public virtual int ValidDays
|
||
|
{
|
||
|
get { return validDays; }
|
||
|
}
|
||
|
|
||
|
public virtual DateTime GetTime()
|
||
|
{
|
||
|
return DateTimeUtilities.UnixMsToDateTime(time * 1000L);
|
||
|
}
|
||
|
|
||
|
public virtual IBcpgKey Key
|
||
|
{
|
||
|
get { return key; }
|
||
|
}
|
||
|
|
||
|
public virtual byte[] GetEncodedContents()
|
||
|
{
|
||
|
MemoryStream bOut = new MemoryStream();
|
||
|
BcpgOutputStream pOut = new BcpgOutputStream(bOut);
|
||
|
|
||
|
pOut.WriteByte((byte) version);
|
||
|
pOut.WriteInt((int) time);
|
||
|
|
||
|
if (version <= 3)
|
||
|
{
|
||
|
pOut.WriteShort((short) validDays);
|
||
|
}
|
||
|
|
||
|
pOut.WriteByte((byte) algorithm);
|
||
|
|
||
|
pOut.WriteObject((BcpgObject)key);
|
||
|
|
||
|
return bOut.ToArray();
|
||
|
}
|
||
|
|
||
|
public override void Encode(
|
||
|
BcpgOutputStream bcpgOut)
|
||
|
{
|
||
|
bcpgOut.WritePacket(PacketTag.PublicKey, GetEncodedContents(), true);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#pragma warning restore
|
||
|
#endif
|