Core components of the web application. https://write.as
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

67 строки
1.6 KiB

  1. package activitypub
  2. import (
  3. "crypto"
  4. "crypto/rsa"
  5. "crypto/x509"
  6. "encoding/pem"
  7. "fmt"
  8. "github.com/spacemonkeygo/openssl"
  9. "log"
  10. )
  11. const keyBitSize = 2048
  12. // GenerateKey creates an RSA keypair.
  13. func GenerateKey() (openssl.PrivateKey, error) {
  14. return openssl.GenerateRSAKey(keyBitSize)
  15. }
  16. // EncodeKeysToPEM encodes public and private key to PEM format, returning
  17. // them in that order.
  18. func EncodeKeysToPEM(privKey openssl.PrivateKey) (pubPEM []byte, privPEM []byte) {
  19. var err error
  20. privPEM, err = privKey.MarshalPKCS1PrivateKeyPEM()
  21. if err != nil {
  22. log.Printf("Unable to marshal private key: %v", err)
  23. return nil, nil
  24. }
  25. pubPEM, err = privKey.MarshalPKIXPublicKeyPEM()
  26. if err != nil {
  27. log.Printf("Unable to marshal public key: %v", err)
  28. return nil, nil
  29. }
  30. return
  31. }
  32. func parsePrivateKey(der []byte) (crypto.PrivateKey, error) {
  33. if key, err := x509.ParsePKCS1PrivateKey(der); err == nil {
  34. return key, nil
  35. }
  36. if key, err := x509.ParsePKCS8PrivateKey(der); err == nil {
  37. switch key := key.(type) {
  38. case *rsa.PrivateKey:
  39. return key, nil
  40. default:
  41. return nil, fmt.Errorf("found unknown private key type in PKCS#8 wrapping")
  42. }
  43. }
  44. if key, err := x509.ParseECPrivateKey(der); err == nil {
  45. return key, nil
  46. }
  47. return nil, fmt.Errorf("failed to parse private key")
  48. }
  49. // DecodePrivateKey encodes public and private key to PEM format, returning
  50. // them in that order.
  51. func DecodePrivateKey(k []byte) (crypto.PrivateKey, error) {
  52. block, _ := pem.Decode(k)
  53. if block == nil || block.Type != "RSA PRIVATE KEY" {
  54. return nil, fmt.Errorf("failed to decode PEM block containing private key")
  55. }
  56. return parsePrivateKey(block.Bytes)
  57. }