Improve private key parsing
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@ -1 +1,2 @@
|
||||
log
|
||||
i2p-backup
|
@ -211,6 +211,18 @@ func Test_KeyGenerationAndHandling(t *testing.T) {
|
||||
if buf.String() != expected {
|
||||
t.Errorf("StoreKeysIncompat wrote incorrect data. Got '%s', want '%s'", buf.String(), expected)
|
||||
}
|
||||
// store the buffer content to a permanent local file in this directory
|
||||
err = ioutil.WriteFile("test_keys.txt", buf.Bytes(), 0644)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to write buffer content to file: '%v'", err)
|
||||
}
|
||||
content, err := ioutil.ReadFile("test_keys.txt")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to read test_keys.txt: '%v'", err)
|
||||
}
|
||||
if string(content) != expected {
|
||||
t.Errorf("StoreKeysIncompat wrote incorrect data to file. Got '%s', want '%s'", string(content), expected)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("StoreKeys", func(t *testing.T) {
|
||||
|
28
I2PKeys.go
28
I2PKeys.go
@ -164,16 +164,34 @@ func (k I2PKeys) Public() crypto.PublicKey {
|
||||
return k.Address
|
||||
}
|
||||
|
||||
// Private returns the private key as a byte slice.
|
||||
func (k I2PKeys) Private() []byte {
|
||||
log.Debug("Extracting private key")
|
||||
src := strings.Split(k.String(), k.Addr().String())[0]
|
||||
var dest []byte
|
||||
_, err := i2pB64enc.Decode(dest, []byte(src))
|
||||
|
||||
// The private key is everything after the public key in the combined string
|
||||
fullKeys := k.String()
|
||||
publicKey := k.Addr().String()
|
||||
|
||||
// Find where the public key ends in the full string
|
||||
if !strings.HasPrefix(fullKeys, publicKey) {
|
||||
log.Error("Invalid key format: public key not found at start of combined keys")
|
||||
return nil
|
||||
}
|
||||
|
||||
// Extract the private key portion (everything after the public key)
|
||||
privateKeyB64 := fullKeys[len(publicKey):]
|
||||
|
||||
// Pre-allocate destination slice with appropriate capacity
|
||||
dest := make([]byte, i2pB64enc.DecodedLen(len(privateKeyB64)))
|
||||
|
||||
n, err := i2pB64enc.Decode(dest, []byte(privateKeyB64))
|
||||
if err != nil {
|
||||
log.WithError(err).Error("Error decoding private key")
|
||||
panic(err)
|
||||
return nil // Return nil instead of panicking
|
||||
}
|
||||
return dest
|
||||
|
||||
// Return only the portion that was actually decoded
|
||||
return dest[:n]
|
||||
}
|
||||
|
||||
// Returns the keys (both public and private), in I2Ps base64 format. Use this
|
||||
|
@ -116,6 +116,16 @@ func (c *samClient) generateKeys(ctx context.Context, conn net.Conn, keyType str
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
log.Println("Generated keys:", pub, priv)
|
||||
if len(pub) == 0 || len(priv) == 0 {
|
||||
return nil, fmt.Errorf("invalid key response: %s", response)
|
||||
}
|
||||
if len(pub) > maxResponseSize || len(priv) > maxResponseSize {
|
||||
return nil, fmt.Errorf("key response too large: %s", response)
|
||||
}
|
||||
if len(pub) < 128 || len(priv) < 128 {
|
||||
return nil, fmt.Errorf("key response too small: %s", response)
|
||||
}
|
||||
|
||||
return &I2PKeys{
|
||||
Address: I2PAddr(pub),
|
||||
|
Reference in New Issue
Block a user