Skip to content

Commit 8d2046f

Browse files
committed
Clean up code.
Signed-off-by: Bradley Grainger <[email protected]>
1 parent 9c24dbf commit 8d2046f

File tree

1 file changed

+9
-49
lines changed

1 file changed

+9
-49
lines changed

src/MySqlConnector.Authentication.Ed25519/ParsecAuthenticationPlugin.cs

Lines changed: 9 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace MySqlConnector.Authentication.Ed25519;
88
/// <summary>
99
/// Provides an implementation of the Parsec authentication plugin for MariaDB.
1010
/// </summary>
11-
public sealed class ParsecAuthenticationPlugin : IAuthenticationPlugin2
11+
public sealed class ParsecAuthenticationPlugin : IAuthenticationPlugin
1212
{
1313
/// <summary>
1414
/// Registers the Parsec authentication plugin with MySqlConnector. You must call this method once before
@@ -30,10 +30,10 @@ public static void Install()
3030
/// </summary>
3131
public byte[] CreateResponse(string password, ReadOnlySpan<byte> authenticationData)
3232
{
33-
// First 32 bytes are server scramble
33+
// first 32 bytes are server scramble
3434
var serverScramble = authenticationData.Slice(0, 32);
3535

36-
// Generate client scramble
36+
// generate client scramble
3737
#if NET6_0_OR_GREATER || NETSTANDARD2_1_OR_GREATER
3838
Span<byte> clientScramble = stackalloc byte[32];
3939
RandomNumberGenerator.Fill(clientScramble);
@@ -43,7 +43,7 @@ public byte[] CreateResponse(string password, ReadOnlySpan<byte> authenticationD
4343
randomNumberGenerator.GetBytes(clientScramble);
4444
#endif
4545

46-
// Parse extended salt from remaining auth data
46+
// parse extended salt from remaining authentication data and verify format
4747
var extendedSalt = authenticationData.Slice(32);
4848
if (extendedSalt[0] != (byte) 'P')
4949
throw new ArgumentException("Invalid extended salt", nameof(authenticationData));
@@ -53,71 +53,31 @@ public byte[] CreateResponse(string password, ReadOnlySpan<byte> authenticationD
5353
var iterationCount = 1024 << extendedSalt[1];
5454
var salt = extendedSalt.Slice(2);
5555

56-
// Derive private key using PBKDF2-SHA512
56+
// derive private key using PBKDF2-SHA512
5757
byte[] privateKey;
5858
#if NET6_0_OR_GREATER
5959
privateKey = Rfc2898DeriveBytes.Pbkdf2(Encoding.UTF8.GetBytes(password), salt, iterationCount, HashAlgorithmName.SHA512, 32);
6060
#else
61-
using (var pbkdf2 = new Rfc2898DeriveBytes(
62-
Encoding.UTF8.GetBytes(password),
63-
salt.ToArray(),
64-
iterationCount,
65-
HashAlgorithmName.SHA512))
66-
{
61+
using (var pbkdf2 = new Rfc2898DeriveBytes(Encoding.UTF8.GetBytes(password), salt.ToArray(), iterationCount, HashAlgorithmName.SHA512))
6762
privateKey = pbkdf2.GetBytes(32);
68-
}
6963
#endif
64+
var expandedPrivateKey = Chaos.NaCl.Ed25519.ExpandedPrivateKeyFromSeed(privateKey);
7065

71-
// Generate Ed25519 keypair and sign concatenated scrambles
72-
// var keyPair = Chaos.NaCl.Ed25519.GenerateKeyPair(privateKey);
66+
// generate Ed25519 keypair and sign concatenated scrambles
7367
var message = new byte[serverScramble.Length + clientScramble.Length];
7468
serverScramble.CopyTo(message);
7569
clientScramble.CopyTo(message.AsSpan(serverScramble.Length));
7670

77-
var expandedPrivateKey = Chaos.NaCl.Ed25519.ExpandedPrivateKeyFromSeed(privateKey);
78-
7971
var signature = Chaos.NaCl.Ed25519.Sign(message, expandedPrivateKey);
8072

81-
// Return client scramble followed by signature
73+
// return client scramble followed by signature
8274
var response = new byte[clientScramble.Length + signature.Length];
8375
clientScramble.CopyTo(response.AsSpan());
8476
signature.CopyTo(response.AsSpan(clientScramble.Length));
8577

8678
return response;
8779
}
8880

89-
/// <summary>
90-
/// Creates the Parsec password hash.
91-
/// </summary>
92-
public byte[] CreatePasswordHash(string password, ReadOnlySpan<byte> authenticationData)
93-
{
94-
// Parse extended salt from auth data
95-
var extSalt = Encoding.UTF8.GetString(authenticationData.ToArray());
96-
var parts = extSalt.Split(':');
97-
98-
// Parse iteration count (P0 = 1024, P1 = 2048, etc)
99-
var iterationCount = 1024 << (parts[0][1] - '0');
100-
var salt = Convert.FromBase64String(parts[1]);
101-
102-
// Derive private key using PBKDF2-SHA512
103-
var privateKey = new byte[32];
104-
using (var pbkdf2 = new Rfc2898DeriveBytes(
105-
password,
106-
salt,
107-
iterationCount,
108-
HashAlgorithmName.SHA512))
109-
{
110-
privateKey = pbkdf2.GetBytes(32);
111-
}
112-
113-
// Generate Ed25519 keypair and get public key
114-
Chaos.NaCl.Ed25519.KeyPairFromSeed(out var publicKey, out _, privateKey);
115-
116-
// Format hash string: P<iter>:<salt-b64>:<pubkey-b64>
117-
var hashString = $"{parts[0]}:{parts[1]}:{Convert.ToBase64String(publicKey)}";
118-
return Encoding.UTF8.GetBytes(hashString);
119-
}
120-
12181
private ParsecAuthenticationPlugin()
12282
{
12383
}

0 commit comments

Comments
 (0)