Files
web-core-fr-gp/activitypub/keys.go
T

67 lines
1.6 KiB
Go
Raw Normal View History

2018-06-24 23:46:42 -04:00
package activitypub
import (
2018-06-25 00:28:14 -04:00
"crypto"
2018-06-24 23:46:42 -04:00
"crypto/rsa"
"crypto/x509"
"encoding/pem"
"fmt"
2018-06-25 00:28:14 -04:00
"github.com/spacemonkeygo/openssl"
2018-06-24 23:46:42 -04:00
"log"
)
const keyBitSize = 2048
// GenerateKey creates an RSA keypair.
2018-06-25 00:28:14 -04:00
func GenerateKey() (openssl.PrivateKey, error) {
return openssl.GenerateRSAKey(keyBitSize)
}
// EncodeKeysToPEM encodes public and private key to PEM format, returning
// them in that order.
func EncodeKeysToPEM(privKey openssl.PrivateKey) (pubPEM []byte, privPEM []byte) {
var err error
privPEM, err = privKey.MarshalPKCS1PrivateKeyPEM()
2018-06-24 23:46:42 -04:00
if err != nil {
2018-06-25 00:28:14 -04:00
log.Printf("Unable to marshal private key: %v", err)
return nil, nil
2018-06-24 23:46:42 -04:00
}
2018-06-25 00:28:14 -04:00
pubPEM, err = privKey.MarshalPKIXPublicKeyPEM()
2018-06-24 23:46:42 -04:00
if err != nil {
2018-06-25 00:28:14 -04:00
log.Printf("Unable to marshal public key: %v", err)
return nil, nil
2018-06-24 23:46:42 -04:00
}
2018-06-25 00:28:14 -04:00
return
2018-06-24 23:46:42 -04:00
}
2018-06-25 00:28:14 -04:00
func parsePrivateKey(der []byte) (crypto.PrivateKey, error) {
if key, err := x509.ParsePKCS1PrivateKey(der); err == nil {
return key, nil
2018-06-24 23:46:42 -04:00
}
2018-06-25 00:28:14 -04:00
if key, err := x509.ParsePKCS8PrivateKey(der); err == nil {
switch key := key.(type) {
case *rsa.PrivateKey:
return key, nil
default:
return nil, fmt.Errorf("found unknown private key type in PKCS#8 wrapping")
}
2018-06-24 23:46:42 -04:00
}
2018-06-25 00:28:14 -04:00
if key, err := x509.ParseECPrivateKey(der); err == nil {
return key, nil
2018-06-24 23:46:42 -04:00
}
2018-06-25 00:28:14 -04:00
return nil, fmt.Errorf("failed to parse private key")
2018-06-24 23:46:42 -04:00
}
// DecodePrivateKey encodes public and private key to PEM format, returning
// them in that order.
2018-06-25 00:28:14 -04:00
func DecodePrivateKey(k []byte) (crypto.PrivateKey, error) {
2018-06-24 23:46:42 -04:00
block, _ := pem.Decode(k)
if block == nil || block.Type != "RSA PRIVATE KEY" {
return nil, fmt.Errorf("failed to decode PEM block containing private key")
}
2018-06-25 00:28:14 -04:00
return parsePrivateKey(block.Bytes)
2018-06-24 23:46:42 -04:00
}