Skip to content

Commit 958a178

Browse files
committed
Add Sign/Verify for SSH-Signatures
1 parent b230c43 commit 958a178

18 files changed

+451
-4
lines changed

SshNet.Keygen.Sample/SshNet.Keygen.Sample.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
</PropertyGroup>
99

1010
<ItemGroup>
11-
<PackageReference Include="SSH.NET" Version="2024.0.0" />
11+
<PackageReference Include="SSH.NET" Version="2024.1.0" />
1212
<ProjectReference Include="..\SshNet.Keygen\SshNet.Keygen.csproj" />
1313
</ItemGroup>
1414

SshNet.Keygen.Tests/SshNet.Keygen.Tests.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<PropertyGroup>
44
<TargetFrameworks Condition="'$(OS)' == 'Windows_NT'">net48;net8.0</TargetFrameworks>
55
<TargetFramework Condition="'$(OS)' != 'Windows_NT'">net8.0</TargetFramework>
6-
<LangVersion>9</LangVersion>
6+
<LangVersion>latest</LangVersion>
77
<IsPackable>false</IsPackable>
88
</PropertyGroup>
99

@@ -19,6 +19,7 @@
1919

2020
<ItemGroup>
2121
<EmbeddedResource Include="TestKeys\*" />
22+
<EmbeddedResource Include="TestSignatures\*" />
2223
</ItemGroup>
2324

2425
</Project>

SshNet.Keygen.Tests/TestKey.cs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,13 @@ private string GetKey(string keyname)
209209
return reader.ReadToEnd();
210210
}
211211

212+
private string GetSignatureResource(string keyname)
213+
{
214+
var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"SshNet.Keygen.Tests.TestSignatures.{keyname}");
215+
using var reader = new StreamReader(resourceStream, Encoding.ASCII);
216+
return reader.ReadToEnd().Replace(Environment.NewLine, "\n");
217+
}
218+
212219
private void TestFormatKey<T>(string keyname, int keyLength, string passphrase = null)
213220
{
214221
if (!string.IsNullOrEmpty(passphrase))
@@ -302,5 +309,46 @@ public void TestED25519()
302309
TestFormatKey<ED25519Key>("ED25519", 256);
303310
TestFormatKey<ED25519Key>("ED25519", 256, "12345");
304311
}
312+
313+
[Test]
314+
public void TestVerify()
315+
{
316+
List<string> keys = ["RSA2048", "RSA3072", "RSA4096", "RSA8192", "ECDSA256", "ECDSA384", "ECDSA521", "ED25519"];
317+
var data = Encoding.UTF8.GetBytes(GetSignatureResource("file.txt"));
318+
319+
foreach (var key in keys)
320+
{
321+
TestContext.WriteLine($"Testing Key {key}");
322+
var signature = GetSignatureResource($"file.txt.{key}.sig");
323+
ClassicAssert.IsTrue(SshSignature.Verify(data, signature));
324+
}
325+
}
326+
327+
[Test]
328+
public void TestSign()
329+
{
330+
List<string> keys = ["RSA2048", "RSA3072", "RSA4096", "RSA8192", "ECDSA256", "ECDSA384", "ECDSA521", "ED25519"];
331+
var data = Encoding.UTF8.GetBytes(GetSignatureResource("file.txt"));
332+
333+
foreach (var key in keys)
334+
{
335+
TestContext.WriteLine($"Testing Key {key}");
336+
var expectedSignature = GetSignatureResource($"file.txt.{key}.sig");
337+
var keyData = GetKey(key);
338+
var keyFile = new PrivateKeyFile(keyData.ToStream());
339+
var signature = keyFile.Signature(data);
340+
ClassicAssert.IsTrue(SshSignature.Verify(data, signature));
341+
342+
// ECDSA Signatures differ on each run
343+
if (!key.StartsWith("ECDSA"))
344+
ClassicAssert.AreEqual(expectedSignature, signature);
345+
346+
var file = $"file-{key}.txt";
347+
File.WriteAllText(file, "bla");
348+
keyFile.SignatureFile(file);
349+
ClassicAssert.IsTrue(SshSignature.VerifyFile(file, $"{file}.sig"));
350+
351+
}
352+
}
305353
}
306354
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
bla
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
-----BEGIN SSH SIGNATURE-----
2+
U1NIU0lHAAAAAQAAAGgAAAATZWNkc2Etc2hhMi1uaXN0cDI1NgAAAAhuaXN0cDI1NgAAAE
3+
EESopJD2EOZurPTh6aNd6RvfBG4/VIiEYL6RF3xWNuNJ9kD9q/qdNTt3bCTE7QgUiN4LvH
4+
3m2+1W/FdCo1rxVFcQAAAARmaWxlAAAAAAAAAAZzaGE1MTIAAABkAAAAE2VjZHNhLXNoYT
5+
ItbmlzdHAyNTYAAABJAAAAIGQ5GV/wx49Jt1ewe0lGDSdHRK84bxFrqkiaGd0ppF4FAAAA
6+
IQCgeawU+z9lTXJbfDX5jEirNV5EkYzQsWZ+L/T216objQ==
7+
-----END SSH SIGNATURE-----
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
-----BEGIN SSH SIGNATURE-----
2+
U1NIU0lHAAAAAQAAAIgAAAATZWNkc2Etc2hhMi1uaXN0cDM4NAAAAAhuaXN0cDM4NAAAAG
3+
EERxwFxKqyTbx914sfwUEobYBtwuyUqXwOgkAIArdChUzPUyP/SBj8U6SoxtiBHp8CXEzT
4+
pgkjwaYU7qNtypf0/Qy/JR8Bc3VO3iWNufT/t8A/Twc/6DMZIdmxOPWXQwaMAAAABGZpbG
5+
UAAAAAAAAABnNoYTUxMgAAAIMAAAATZWNkc2Etc2hhMi1uaXN0cDM4NAAAAGgAAAAwbnar
6+
SmL/5XlkV8ySShlIHrNNTUzVVioIWxd2AWFYdul7iaGF4DGfK6laBJSTK+eqAAAAMCdjtp
7+
OKFcNpYZ+cauvrBJSvTJ9Pb8EJj0PUi61SrJkp3ZFULesWuglUbtwUttrcSQ==
8+
-----END SSH SIGNATURE-----
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
-----BEGIN SSH SIGNATURE-----
2+
U1NIU0lHAAAAAQAAAKwAAAATZWNkc2Etc2hhMi1uaXN0cDUyMQAAAAhuaXN0cDUyMQAAAI
3+
UEAK5WmW+O0Ut75D9KATr6yEFwYZmBsHJmxUXRRrcyvTbdpKofHoVzpY4WHK4pJg8GHwG1
4+
NnpDHyjsPAD6oe4dYTiCAO9uYQPGlmxu8KTt+4VOtsX3IkAVaWPb3rsn+k9yz4WP2PEnRD
5+
ILrQXT4Nc5XmoA4lCAcFNIxmmxPu7zVaNq8/hBAAAABGZpbGUAAAAAAAAABnNoYTUxMgAA
6+
AKUAAAATZWNkc2Etc2hhMi1uaXN0cDUyMQAAAIoAAABBbSiayMz22ln7pRn0byMB57Cq/R
7+
4sg8m0ngeFOmY70XC/kNK7TTA3VTD0UkBsdG2KLAj6s2haUiH8LSiOjJ6mbmAAAABBPpmj
8+
I2mBpTW38WZLGsEf4prYeIO7dO0TY1hzGefm6txqOxFaBmpzZMT8ktYaikU/O8JBaIqiw7
9+
ZMZNe5ShmuvuM=
10+
-----END SSH SIGNATURE-----
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
-----BEGIN SSH SIGNATURE-----
2+
U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgTlboFw2cy42Ati5RrXwX8KLx3M
3+
+p4g78fffefTK/ijoAAAAEZmlsZQAAAAAAAAAGc2hhNTEyAAAAUwAAAAtzc2gtZWQyNTUx
4+
OQAAAED0TUwGrgbbWKVj6BiR07l0OrtJa5uM6vCo5Fe4smzPcTzmJDODkllHIgRuI/E+PD
5+
dC67uGC9N7Jgzc54EoFHIO
6+
-----END SSH SIGNATURE-----
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
-----BEGIN SSH SIGNATURE-----
2+
U1NIU0lHAAAAAQAAARcAAAAHc3NoLXJzYQAAAAMBAAEAAAEBAOJpdVVMNyPkABr2ywB2iO
3+
ns3StUJMUNDGuFjqyNzVYvaX3C8rjB6i1EoBCHbp6ZPEEU8e6bOPU6i2hvQTjFWxqmaRvj
4+
3hz7VAu+wMMmQkw1IMZyw2YhKi/+sCz8Yb3vI2xUHR1PZLtZj7K47prVLkbiWtycIiJaCD
5+
n9nI1QYeHX40in+0witV9D6T+tieUbyda/3C31KL1y5Vs4plHssEWayKq/Yi5xqWLAitGO
6+
KGUofEk1N0FEagJrMEzfDiEUxbFOFjedRo2lfgY/KUUzc1gabNYHH927P+gup/60pYLM9s
7+
MpgjBB8v1KJ2F/tCBKMyX0BZ7QYhWvVMFIM4F3SycAAAAEZmlsZQAAAAAAAAAGc2hhNTEy
8+
AAABFAAAAAxyc2Etc2hhMi01MTIAAAEA2WMT5aZ6fJ/ZXF0Gl/Vym8mTtDXEufziwjmt+z
9+
ZSt3MF0GlwNDiYkeHFjyg16zqrJkeddj7yENyQ0Eae0Ew+7iFML6sKTEJKaiYf51/U+Jli
10+
DVawwhH0+i3YZaCGmbiEQeXHfuFtA8deCdyxUkUYbycpdrfd0bx2dZFYu/WgNa9gHu/OVO
11+
NQqqDOAHZUAko2MHN2GZ7wiepbGO9NAjhRtRE2tV6X8l3KI1+PmqvyfOQQMZcVa1V/WaFR
12+
8wx1Z3VBJ+szP0XBdWrrwKY8K7yEE5rm55mx2rGtXuySGgISMbZlUHlJp31YE0Z4jMcEE+
13+
5m61gVpll8DYFSakNlBk6Xgg==
14+
-----END SSH SIGNATURE-----
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
-----BEGIN SSH SIGNATURE-----
2+
U1NIU0lHAAAAAQAAAZcAAAAHc3NoLXJzYQAAAAMBAAEAAAGBAKs3fv8jufGNRU/E8SNlcG
3+
Eg3HBy+NXCcF0zzvwQivdQ38GjjZG3AyLJd1IYNX4JmSxLOoy17LMlHlY0Yn9tb9ZVgoiX
4+
Nz+TC/8t1BMvKcokxlcMlJuK30WEYFzcseJ/zrC+KEeHZMlzWa4Hm5R8mvsgF5+9N3RQYL
5+
kekiVn6dCu6Glw0ZGt6QUMhF8VXJx6wDDqbHLgtO/UzauoAE3a87ypj8zpDjsbDee3EJ9p
6+
RkCg4o0FiECOniOkOxRZCVFEKm7kwR8wiPTyjReNZcConEFkU1rb/ZYztkcu7W1psZYUmj
7+
j0TMfZpiimyLuASfAlqKshtL4VZdCOr+YTL6gkoMEQcce8SsT4+38F42ecGsybw43k8tCy
8+
t6D6c72irREqr+yO8qWy1CunMPHcu1zqIgPKISntdjC4ha7XGxqr6kqDlQfkqdqqNaVU5q
9+
x9GzpaB3+cT+auZsZFBgz6ProxxjtCTv3+wuPnAKIMbk24LM1wN21zpzFG4uWf7fYSG9Zb
10+
RQAAAARmaWxlAAAAAAAAAAZzaGE1MTIAAAGUAAAADHJzYS1zaGEyLTUxMgAAAYAC6NRILC
11+
HH/D2iTC+cvr0M2zwjoEDfEOIMCIcIF2BYRobo6UIudUL2ST8eIBriAsxkgdOnvt/+evN/
12+
iirFMtb7RDC/bysHoaWEJYSkHsM/aklEiPgw0z3+eGDQChRBZQPRPPuAl6GOl8RRuNm0Ea
13+
Wy+Rpj483yvDb4JSsf5+iAIFKhdv692B8T9MaqAfzhgkDLfoKfHPSRs8i3jlCFmIEXdBVu
14+
Gs34jYKaX1uxuDsBvTeC24XsZNcwbRAO2YUrH0PRX6mpqS06xeRTUzIlYd7Iq1an62xGx1
15+
Alu2cGrh4P1tWHwxF6TC7um6CaqQOVipWP7jAUc12cBdjC205Vw/GCPB+N7Q5Ot7qSl3L5
16+
ELyd2n1HJVXuL5rFQDp7iELgjuiObn1ZSF3+C1tryBTSVsnfkui4BmZmC2AstbGUfuX2Nn
17+
HDLTpRAt/ocC17HLro43pm6aj/HYa8Y3s8kZoPYVg/YzYOxqPXaBDlPsEyK7P06utKFsq/
18+
wlTihlGHDyob6n8=
19+
-----END SSH SIGNATURE-----

0 commit comments

Comments
 (0)