| package sec |
| |
| import ( |
| "crypto/x509" |
| "encoding/pem" |
| |
| "github.com/apache/mynewt-artifact/errors" |
| "golang.org/x/crypto/ed25519" |
| ) |
| |
| func parsePubPemKey(data []byte) (interface{}, error) { |
| p, _ := pem.Decode(data) |
| if p == nil { |
| return nil, errors.Errorf( |
| "error parsing public key: unknown format") |
| } |
| |
| if p.Type != "PUBLIC KEY" && p.Type != "RSA PUBLIC KEY" { |
| return nil, errors.Errorf( |
| "error parsing public key: PEM type=\"%s\"", p.Type) |
| } |
| |
| itf, err := x509.ParsePKIXPublicKey(p.Bytes) |
| if err != nil { |
| // Not x509; assume ed25519. |
| pkix, err := unmarshalEd25519(p.Bytes) |
| if err != nil { |
| return nil, errors.Errorf( |
| "error parsing public key: unrecognized format") |
| } |
| |
| if len(pkix.BitString.Bytes) != ed25519.PublicKeySize { |
| return nil, errors.Errorf( |
| "error parsing public key: "+ |
| "ed25519 public key has wrong size: have=%d want=%d", |
| len(pkix.BitString.Bytes), ed25519.PublicKeySize) |
| } |
| |
| itf = ed25519.PublicKey(pkix.BitString.Bytes) |
| } |
| |
| return itf, nil |
| } |