2015-06-10 23:29:52 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"crypto/ecdsa"
|
|
|
|
"crypto/rsa"
|
|
|
|
"crypto/x509"
|
|
|
|
"encoding/pem"
|
|
|
|
"flag"
|
|
|
|
"fmt"
|
|
|
|
"io/ioutil"
|
|
|
|
"log"
|
|
|
|
|
2020-11-27 04:09:37 +00:00
|
|
|
"git.sr.ht/~kisom/goutils/die"
|
2015-06-10 23:29:52 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
flag.Parse()
|
|
|
|
|
|
|
|
for _, fileName := range flag.Args() {
|
|
|
|
in, err := ioutil.ReadFile(fileName)
|
|
|
|
die.If(err)
|
|
|
|
|
|
|
|
if p, _ := pem.Decode(in); p != nil {
|
|
|
|
if p.Type != "CERTIFICATE REQUEST" {
|
|
|
|
log.Fatal("INVALID FILE TYPE")
|
|
|
|
}
|
|
|
|
in = p.Bytes
|
|
|
|
}
|
|
|
|
|
|
|
|
csr, err := x509.ParseCertificateRequest(in)
|
|
|
|
die.If(err)
|
|
|
|
|
|
|
|
out, err := x509.MarshalPKIXPublicKey(csr.PublicKey)
|
|
|
|
die.If(err)
|
|
|
|
|
|
|
|
var t string
|
|
|
|
switch pub := csr.PublicKey.(type) {
|
|
|
|
case *rsa.PublicKey:
|
|
|
|
t = "RSA PUBLIC KEY"
|
|
|
|
case *ecdsa.PublicKey:
|
|
|
|
t = "EC PUBLIC KEY"
|
|
|
|
default:
|
|
|
|
die.With("unrecognised public key type %T", pub)
|
|
|
|
}
|
|
|
|
|
|
|
|
p := &pem.Block{
|
|
|
|
Type: t,
|
|
|
|
Bytes: out,
|
|
|
|
}
|
|
|
|
|
|
|
|
err = ioutil.WriteFile(fileName+".pub", pem.EncodeToMemory(p), 0644)
|
|
|
|
die.If(err)
|
|
|
|
fmt.Printf("[+] wrote %s.\n", fileName+".pub")
|
|
|
|
}
|
|
|
|
}
|