Open
Description
Hi,
When I want to use go to do some format cleaning for PEM file found that ssh.ParseRawPrivateKey
and x509.MarshalPKCS8PrivateKey
have different data type for ed25519.PrivateKey
.
ssh.ParseRawPrivateKey
actually output a Pointer, x509.MarshalPKCS8PrivateKey
only receiver Value.
But other algorithms are both pointers. So I had to do type assertion for ed25519.PrivateKey
.
example code:
package main
import (
"crypto/ed25519"
"crypto/x509"
"encoding/base64"
"encoding/pem"
"fmt"
"golang.org/x/crypto/ssh"
)
var pemfile []byte
func main() {
prikey, err := ssh.ParseRawPrivateKey(pemfile)
if err != nil {
panic(err)
}
// workaround for golang.org/x/crypto/ssh/ed25519
ed25519key, ok := prikey.(*ed25519.PrivateKey)
if ok {
prikey = *ed25519key
}
prikeycontent, err := x509.MarshalPKCS8PrivateKey(prikey)
if err != nil {
panic(err)
}
block := &pem.Block{
Type: "PRIVATE KEY",
Bytes: prikeycontent,
}
prikeypem := pem.EncodeToMemory(block)
fmt.Printf("prikey: \n%s\n", prikeypem)
}
func init() {
var err error
pemfile, err = base64.StdEncoding.DecodeString(samplePem)
if err != nil {
panic(err)
}
}
var samplePem = `LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0KYjNCbGJuTnphQzFyWlhrdGRqRUFBQUFBQkc1dmJtVUFBQUFFYm05dVpRQUFBQUFBQUFBQkFBQUFNd0FBQUF0emMyZ3RaVwpReU5UVXhPUUFBQUNDc1pUcEpXZ0ljajFqcFR0OVJHQ2ovUktCTlJZSTFiWmZDZFJXNCtmNmJ2UUFBQUlqWExVaTYxeTFJCnVnQUFBQXR6YzJndFpXUXlOVFV4T1FBQUFDQ3NaVHBKV2dJY2oxanBUdDlSR0NqL1JLQk5SWUkxYlpmQ2RSVzQrZjZidlEKQUFBRUNPUm12SUdjaDVWMzRqSUpWSGFiU3FQbGl3RGJsL3diamNtNVpmeWZhRjdxeGxPa2xhQWh5UFdPbE8zMUVZS1A5RQpvRTFGZ2pWdGw4SjFGYmo1L3B1OUFBQUFBbmg0QVFJRAotLS0tLUVORCBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0K`
I think it's not necessary. Perhaps we can make x509.MarshalPKCS8PrivateKey
receiver ed25519.PrivateKey
Pointer and Value at same time or make ssh.ParseRawPrivateKey
output Value because ed25519.PrivateKey
underlying type is []byte
.