I'm trying to load a dsa private key in my program, Here is how I approached it:
-
I create a dsa key pair using openssl:
openssl dsaparam -genkey 2048 -out dsakey.pem
-
I use the following function to parse the pem file
func getDSAPrivateKeyFromPemFile(pemfilepath string) (recoveredprivateKey *dsa.PrivateKey, err error) { pemfile, err := os.Open(pemfilepath) if err != nil { return nil, err } recoveredbytes, err := ioutil.ReadAll(pemfile) if err != nil { return nil, err } recoveredpemdsaparameteres, rest := pem.Decode(recoveredbytes) if recoveredpemdsaparameteres == nil { return nil, errors.New("No pem recovered") } _, err = asn1.Unmarshal(append(recoveredpemdsaparameteres.Bytes, recoveredpemdsaprivatekey.Bytes...), recoveredprivateKey) if err != nil { return nil, err } fmt.Printf("PEM:%v ", recoveredpemdsaparameteres) recoveredpemdsaprivatekey, _ := pem.Decode(rest) fmt.Printf("PEM:%v ", recoveredpemdsaprivatekey) pemfile.Close() }
When I call this function if fails:
panic: reflect: call of reflect.Value.Type on zero Value
goroutine 1 [running]:
reflect.Value.Type(0x0, 0x0, 0x0, 0x0, 0x0)
/usr/local/go/src/reflect/value.go:1664 +0x7b
encoding/asn1.parseField(0x0, 0x0, 0x0, 0xc8200b0600, 0x58b, 0x600, 0x0, 0x0, 0x0, 0x0, ...)
/usr/local/go/src/encoding/asn1/asn1.go:558 +0xbd
encoding/asn1.UnmarshalWithParams(0xc8200b0600, 0x58b, 0x600, 0x1383e0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
/usr/local/go/src/encoding/asn1/asn1.go:957 +0x16e
encoding/asn1.Unmarshal(0xc8200b0600, 0x58b, 0x600, 0x1383e0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
/usr/local/go/src/encoding/asn1/asn1.go:950 +0x8f
main.getDSAPrivateKeyFromPemFile(0x1e7fa0, 0x26, 0x0, 0x0, 0x0)
However, I can perfectly see my dsa key in output:
PEM:&{DSA PARAMETERS map[] [48 130 2 45 2 130...]}
PEM:&{DSA PRIVATE KEY map[] [48 130 3 86 2 1 0 ...]}
The problem is in fact how to unmarshal pem bytes to dsa.PrivateKey. Any ideas?
P.S: I was not able to find any example of loading DSA private key pem file over the internet.