-
-
Notifications
You must be signed in to change notification settings - Fork 978
Expand file tree
/
Copy pathKeyExchangeMLKem768X25519Sha256.BouncyCastleImpl.cs
More file actions
36 lines (29 loc) · 1.39 KB
/
KeyExchangeMLKem768X25519Sha256.BouncyCastleImpl.cs
File metadata and controls
36 lines (29 loc) · 1.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Kems;
using Org.BouncyCastle.Crypto.Parameters;
using Renci.SshNet.Abstractions;
namespace Renci.SshNet.Security
{
internal sealed partial class KeyExchangeMLKem768X25519Sha256
{
private sealed class MLKemBouncyCastleImpl : Impl
{
private MLKemDecapsulator _mlkemDecapsulator;
public override byte[] GenerateClientPublicKey()
{
var mlkem768KeyPairGenerator = new MLKemKeyPairGenerator();
mlkem768KeyPairGenerator.Init(new MLKemKeyGenerationParameters(CryptoAbstraction.SecureRandom, MLKemParameters.ml_kem_768));
var mlkem768KeyPair = mlkem768KeyPairGenerator.GenerateKeyPair();
_mlkemDecapsulator = new MLKemDecapsulator(MLKemParameters.ml_kem_768);
_mlkemDecapsulator.Init(mlkem768KeyPair.Private);
return ((MLKemPublicKeyParameters)mlkem768KeyPair.Public).GetEncoded();
}
public override byte[] CalculateAgreement(byte[] serverPublicKey)
{
var mlkemSecret = new byte[_mlkemDecapsulator.SecretLength];
_mlkemDecapsulator.Decapsulate(serverPublicKey, 0, _mlkemDecapsulator.EncapsulationLength, mlkemSecret, 0, _mlkemDecapsulator.SecretLength);
return mlkemSecret;
}
}
}
}