You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
3.6 KiB
C#

namespace Renci.SshNet.Messages.Authentication
{
/// <summary>
/// Represents "publickey" SSH_MSG_USERAUTH_REQUEST message.
/// </summary>
public class RequestMessagePublicKey : RequestMessage
{
/// <summary>
/// Gets the name of the public key algorithm as ASCII encoded byte array.
/// </summary>
/// <value>
/// The name of the public key algorithm.
/// </value>
public byte[] PublicKeyAlgorithmName { get; private set; }
/// <summary>
/// Gets the public key data.
/// </summary>
public byte[] PublicKeyData { get; private set; }
/// <summary>
/// Gets or sets public key signature.
/// </summary>
/// <value>
/// The signature.
/// </value>
public byte[] Signature { get; set; }
/// <summary>
/// Gets the size of the message in bytes.
/// </summary>
/// <value>
/// The size of the messages in bytes.
/// </value>
protected override int BufferCapacity
{
get
{
var capacity = base.BufferCapacity;
capacity += 1; // Signature flag
capacity += 4; // PublicKeyAlgorithmName length
capacity += PublicKeyAlgorithmName.Length; // PublicKeyAlgorithmName
capacity += 4; // PublicKeyData length
capacity += PublicKeyData.Length; // PublicKeyData
if (Signature != null)
{
capacity += 4; // Signature length
capacity += Signature.Length; // Signature
}
return capacity;
}
}
/// <summary>
/// Initializes a new instance of the <see cref="RequestMessagePublicKey"/> class.
/// </summary>
/// <param name="serviceName">Name of the service.</param>
/// <param name="username">Authentication username.</param>
/// <param name="keyAlgorithmName">Name of private key algorithm.</param>
/// <param name="keyData">Private key data.</param>
public RequestMessagePublicKey(ServiceName serviceName, string username, string keyAlgorithmName, byte[] keyData)
: base(serviceName, username, "publickey")
{
PublicKeyAlgorithmName = Ascii.GetBytes(keyAlgorithmName);
PublicKeyData = keyData;
}
/// <summary>
/// Initializes a new instance of the <see cref="RequestMessagePublicKey"/> class.
/// </summary>
/// <param name="serviceName">Name of the service.</param>
/// <param name="username">Authentication username.</param>
/// <param name="keyAlgorithmName">Name of private key algorithm.</param>
/// <param name="keyData">Private key data.</param>
/// <param name="signature">Private key signature.</param>
public RequestMessagePublicKey(ServiceName serviceName, string username, string keyAlgorithmName, byte[] keyData, byte[] signature)
: this(serviceName, username, keyAlgorithmName, keyData)
{
Signature = signature;
}
/// <summary>
/// Called when type specific data need to be saved.
/// </summary>
protected override void SaveData()
{
base.SaveData();
Write(Signature != null);
WriteBinaryString(PublicKeyAlgorithmName);
WriteBinaryString(PublicKeyData);
if (Signature != null)
WriteBinaryString(Signature);
}
}
}