@@ -8,7 +8,7 @@ namespace MySqlConnector.Authentication.Ed25519;
8
8
/// <summary>
9
9
/// Provides an implementation of the Parsec authentication plugin for MariaDB.
10
10
/// </summary>
11
- public sealed class ParsecAuthenticationPlugin : IAuthenticationPlugin2
11
+ public sealed class ParsecAuthenticationPlugin : IAuthenticationPlugin
12
12
{
13
13
/// <summary>
14
14
/// Registers the Parsec authentication plugin with MySqlConnector. You must call this method once before
@@ -30,10 +30,10 @@ public static void Install()
30
30
/// </summary>
31
31
public byte [ ] CreateResponse ( string password , ReadOnlySpan < byte > authenticationData )
32
32
{
33
- // First 32 bytes are server scramble
33
+ // first 32 bytes are server scramble
34
34
var serverScramble = authenticationData . Slice ( 0 , 32 ) ;
35
35
36
- // Generate client scramble
36
+ // generate client scramble
37
37
#if NET6_0_OR_GREATER || NETSTANDARD2_1_OR_GREATER
38
38
Span < byte > clientScramble = stackalloc byte [ 32 ] ;
39
39
RandomNumberGenerator . Fill ( clientScramble ) ;
@@ -43,7 +43,7 @@ public byte[] CreateResponse(string password, ReadOnlySpan<byte> authenticationD
43
43
randomNumberGenerator . GetBytes ( clientScramble ) ;
44
44
#endif
45
45
46
- // Parse extended salt from remaining auth data
46
+ // parse extended salt from remaining authentication data and verify format
47
47
var extendedSalt = authenticationData . Slice ( 32 ) ;
48
48
if ( extendedSalt [ 0 ] != ( byte ) 'P' )
49
49
throw new ArgumentException ( "Invalid extended salt" , nameof ( authenticationData ) ) ;
@@ -53,71 +53,31 @@ public byte[] CreateResponse(string password, ReadOnlySpan<byte> authenticationD
53
53
var iterationCount = 1024 << extendedSalt [ 1 ] ;
54
54
var salt = extendedSalt . Slice ( 2 ) ;
55
55
56
- // Derive private key using PBKDF2-SHA512
56
+ // derive private key using PBKDF2-SHA512
57
57
byte [ ] privateKey ;
58
58
#if NET6_0_OR_GREATER
59
59
privateKey = Rfc2898DeriveBytes . Pbkdf2 ( Encoding . UTF8 . GetBytes ( password ) , salt , iterationCount , HashAlgorithmName . SHA512 , 32 ) ;
60
60
#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 ) )
67
62
privateKey = pbkdf2 . GetBytes ( 32 ) ;
68
- }
69
63
#endif
64
+ var expandedPrivateKey = Chaos . NaCl . Ed25519 . ExpandedPrivateKeyFromSeed ( privateKey ) ;
70
65
71
- // Generate Ed25519 keypair and sign concatenated scrambles
72
- // var keyPair = Chaos.NaCl.Ed25519.GenerateKeyPair(privateKey);
66
+ // generate Ed25519 keypair and sign concatenated scrambles
73
67
var message = new byte [ serverScramble . Length + clientScramble . Length ] ;
74
68
serverScramble . CopyTo ( message ) ;
75
69
clientScramble . CopyTo ( message . AsSpan ( serverScramble . Length ) ) ;
76
70
77
- var expandedPrivateKey = Chaos . NaCl . Ed25519 . ExpandedPrivateKeyFromSeed ( privateKey ) ;
78
-
79
71
var signature = Chaos . NaCl . Ed25519 . Sign ( message , expandedPrivateKey ) ;
80
72
81
- // Return client scramble followed by signature
73
+ // return client scramble followed by signature
82
74
var response = new byte [ clientScramble . Length + signature . Length ] ;
83
75
clientScramble . CopyTo ( response . AsSpan ( ) ) ;
84
76
signature . CopyTo ( response . AsSpan ( clientScramble . Length ) ) ;
85
77
86
78
return response ;
87
79
}
88
80
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
-
121
81
private ParsecAuthenticationPlugin ( )
122
82
{
123
83
}
0 commit comments