Skip to content

x/crypto/ssh: please provide unified parameter types for ed25519.PrivateKey #51974

Open
@dacapoday

Description

@dacapoday

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    NeedsInvestigationSomeone must examine and confirm this is a valid issue and not a duplicate of an existing one.Unfortunate

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions