libp2p / go-libp2p

libp2p implementation in Go
MIT License
5.83k stars 1.03k forks source link

Go-libp2p Ed25519 keys are not compatible with crypto/ssh? #2846

Closed felix314159 closed 6 days ago

felix314159 commented 1 week ago

Hi, I want to generate an ed25519 keypair then use crypto/ssh to encrypt the key into the OpenSSH format. When I try to use an ed25519 key created with go-libp2p/core/crypto with the function ssh.MarshalPrivateKeyWithPassphrase(), then I get the error "ssh: unsupported key type *crypto.Ed25519PrivateKey". But when I use crypto/ed25519 to generate the ed25519 key it works as expected. Here is an example demonstrating both scenarios: https://go.dev/play/p/CzuK_YDL09G

Note: the libp2p version of the code does not run in playground due to timing out, so run it somewhere else

If this is not a bug: How to change the code so that I can continue using the go-libp2p/core/crypto instead of crypto/ed25519? I am using go version go1.22.3 if that matters.

Thanks, have a nice day!

Version Information
github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96
github.com/benbjohnson/clock v1.3.5
github.com/beorn7/perks v1.0.1
github.com/cespare/xxhash v1.1.0
github.com/cespare/xxhash/v2 v2.2.0
github.com/containerd/cgroups v1.1.0
github.com/coreos/go-systemd/v22 v22.5.0
github.com/davecgh/go-spew v1.1.1
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c
github.com/decred/dcrd/crypto/blake256 v1.0.1
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0
github.com/dgraph-io/badger v1.6.2
github.com/dgraph-io/ristretto v0.0.2
github.com/docker/go-units v0.5.0
github.com/dustin/go-humanize v1.0.0
github.com/elastic/gosigar v0.14.2
github.com/flynn/noise v1.1.0
github.com/francoispqt/gojay v1.2.13
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572
github.com/godbus/dbus/v5 v5.1.0
github.com/gogo/protobuf v1.3.2
github.com/golang/protobuf v1.5.3
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db
github.com/google/go-cmp v0.5.5
github.com/google/gopacket v1.1.19
github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5
github.com/google/uuid v1.4.0
github.com/gorilla/websocket v1.5.1
github.com/hashicorp/golang-lru/arc/v2 v2.0.7
github.com/hashicorp/golang-lru/v2 v2.0.7
github.com/huin/goupnp v1.3.0
github.com/ipfs/go-cid v0.4.1
github.com/ipfs/go-datastore v0.6.0
github.com/ipfs/go-ds-badger v0.3.0
github.com/ipfs/go-ds-leveldb v0.5.0
github.com/ipfs/go-log/v2 v2.5.1
github.com/jackpal/go-nat-pmp v1.0.2
github.com/jbenet/go-temp-err-catcher v0.1.0
github.com/jbenet/goprocess v0.1.4
github.com/klauspost/compress v1.17.8
github.com/klauspost/cpuid/v2 v2.2.7
github.com/koron/go-ssdp v0.0.4
github.com/libp2p/go-buffer-pool v0.1.0
github.com/libp2p/go-flow-metrics v0.1.0
github.com/libp2p/go-libp2p v0.35.1
github.com/libp2p/go-libp2p-asn-util v0.4.1
github.com/libp2p/go-libp2p-core v0.20.1
github.com/libp2p/go-libp2p-testing v0.12.0
github.com/libp2p/go-msgio v0.3.0
github.com/libp2p/go-nat v0.2.0
github.com/libp2p/go-netroute v0.2.1
github.com/libp2p/go-openssl v0.1.0
github.com/libp2p/go-reuseport v0.4.0
github.com/libp2p/go-yamux/v4 v4.0.1
github.com/libp2p/zeroconf/v2 v2.2.0
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd
github.com/mattn/go-isatty v0.0.20
github.com/mattn/go-pointer v0.0.1
github.com/miekg/dns v1.1.58
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc
github.com/minio/sha256-simd v1.0.1
github.com/mr-tron/base58 v1.2.0
github.com/multiformats/go-base32 v0.1.0
github.com/multiformats/go-base36 v0.2.0
github.com/multiformats/go-multiaddr v0.12.4
github.com/multiformats/go-multiaddr-dns v0.3.1
github.com/multiformats/go-multiaddr-fmt v0.1.0
github.com/multiformats/go-multibase v0.2.0
github.com/multiformats/go-multicodec v0.9.0
github.com/multiformats/go-multihash v0.2.3
github.com/multiformats/go-multistream v0.5.0
github.com/multiformats/go-varint v0.0.7
github.com/nxadm/tail v1.4.11
github.com/onsi/ginkgo/v2 v2.15.0
github.com/opencontainers/runtime-spec v1.2.0
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58
github.com/pion/datachannel v1.5.6
github.com/pion/dtls/v2 v2.2.11
github.com/pion/ice/v2 v2.3.25
github.com/pion/interceptor v0.1.29
github.com/pion/logging v0.2.2
github.com/pion/mdns v0.0.12
github.com/pion/randutil v0.1.0
github.com/pion/rtcp v1.2.14
github.com/pion/rtp v1.8.6
github.com/pion/sctp v1.8.16
github.com/pion/sdp/v3 v3.0.9
github.com/pion/srtp/v2 v2.0.18
github.com/pion/stun v0.6.1
github.com/pion/transport/v2 v2.2.5
github.com/pion/turn/v2 v2.1.6
github.com/pion/webrtc/v3 v3.2.40
github.com/pkg/errors v0.9.1
github.com/pmezard/go-difflib v1.0.0
github.com/prometheus/client_golang v1.19.1
github.com/prometheus/client_model v0.6.1
github.com/prometheus/common v0.48.0
github.com/prometheus/procfs v0.12.0
github.com/quic-go/qpack v0.4.0
github.com/quic-go/quic-go v0.44.0
github.com/quic-go/webtransport-go v0.8.0
github.com/raulk/go-watchdog v1.3.0
github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572
github.com/spaolacci/murmur3 v1.1.0
github.com/stretchr/testify v1.9.0
github.com/syndtr/goleveldb v1.0.0
go.uber.org/atomic v1.10.0
go.uber.org/dig v1.17.1
go.uber.org/fx v1.21.1
go.uber.org/goleak v1.3.0
go.uber.org/mock v0.4.0
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
golang.org/x/crypto v0.24.0
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842
golang.org/x/mod v0.17.0
golang.org/x/net v0.25.0
golang.org/x/sync v0.7.0
golang.org/x/sys v0.21.0
golang.org/x/term v0.21.0
golang.org/x/text v0.16.0
golang.org/x/tools v0.21.0
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543
google.golang.org/protobuf v1.34.1
gopkg.in/yaml.v3 v3.0.1
lukechampine.com/blake3 v1.2.1
master255 commented 1 week ago

I think you have a serialization problem. Try converting the keys to strings and see how they look like.

felix314159 commented 1 week ago

Still can't get this to work. For now my workaround is storing them as ed25519.PrivateKey and then at runtime casting them to go-libp2p/core/crypto.PrivKey with UnmarshalEd25519PrivateKey()

master255 commented 6 days ago

Use crypto.GenerateKeyPair( crypto.Ed25519, -1, )

sukunrt commented 6 days ago

You can use the Raw() method to get the raw bytes and convert them to ed25519.PrivateKey