|
18 | 18 | package solana |
19 | 19 |
|
20 | 20 | import ( |
| 21 | + "crypto/ed25519" |
21 | 22 | "encoding/binary" |
22 | 23 | "encoding/hex" |
23 | 24 | "errors" |
@@ -143,6 +144,43 @@ func TestPrivateKeyFromSolanaKeygenFile(t *testing.T) { |
143 | 144 | } |
144 | 145 | } |
145 | 146 |
|
| 147 | +func TestPrivateKeyFromBase58RejectsMismatchedSeedAndPublicKey(t *testing.T) { |
| 148 | + original := MustPrivateKeyFromBase58("66cDvko73yAf8LYvFMM3r8vF5vJtkk7JKMgEKwkmBC86oHdq41C7i1a2vS3zE1yCcdLLk6VUatUb32ZzVjSBXtRs") |
| 149 | + require.Len(t, original, PrivateKeyLength) |
| 150 | + |
| 151 | + tampered := append([]byte(nil), original...) |
| 152 | + tampered[0] ^= 0xFF |
| 153 | + |
| 154 | + valid, err := ValidatePrivateKey(tampered) |
| 155 | + require.False(t, valid) |
| 156 | + require.EqualError(t, err, "invalid private key: seed/public key mismatch") |
| 157 | + |
| 158 | + _, err = PrivateKeyFromBase58(PrivateKey(tampered).String()) |
| 159 | + require.EqualError(t, err, "invalid private key: seed/public key mismatch") |
| 160 | +} |
| 161 | + |
| 162 | +func TestPrivateKeyFromBase58ReturnsDiagnosticForOffCurvePublicKey(t *testing.T) { |
| 163 | + original := MustPrivateKeyFromBase58("66cDvko73yAf8LYvFMM3r8vF5vJtkk7JKMgEKwkmBC86oHdq41C7i1a2vS3zE1yCcdLLk6VUatUb32ZzVjSBXtRs") |
| 164 | + require.Len(t, original, PrivateKeyLength) |
| 165 | + |
| 166 | + tampered := append([]byte(nil), original...) |
| 167 | + offCurve := make([]byte, ed25519.PublicKeySize) |
| 168 | + found := false |
| 169 | + for i := uint32(0); i < 100_000; i++ { |
| 170 | + binary.LittleEndian.PutUint32(offCurve[:4], i) |
| 171 | + if !IsOnCurve(offCurve) { |
| 172 | + found = true |
| 173 | + break |
| 174 | + } |
| 175 | + } |
| 176 | + require.True(t, found, "expected to find an off-curve public key test vector") |
| 177 | + copy(tampered[ed25519.SeedSize:], offCurve) |
| 178 | + |
| 179 | + valid, err := ValidatePrivateKey(tampered) |
| 180 | + require.False(t, valid) |
| 181 | + require.EqualError(t, err, "invalid private key: seed/public key mismatch (provided public key is NOT on the ed25519 curve)") |
| 182 | +} |
| 183 | + |
146 | 184 | func TestPublicKey_MarshalText(t *testing.T) { |
147 | 185 | keyString := "4wBqpZM9k69W87zdYXT2bRtLViWqTiJV3i2Kn9q7S6j" |
148 | 186 | keyParsed := MustPublicKeyFromBase58(keyString) |
|
0 commit comments