loadPrivateKey.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package goStrongswanVici
  2. import (
  3. "crypto/ecdsa"
  4. "crypto/rsa"
  5. "crypto/x509"
  6. "encoding/pem"
  7. "fmt"
  8. )
  9. type keyPayload struct {
  10. Typ string `json:"type"`
  11. Data string `json:"data"`
  12. }
  13. // LoadECDSAPrivateKey encodes a *ecdsa.PrivateKey as a PEM block before sending
  14. // it to the Vici interface
  15. func (c *ClientConn) LoadECDSAPrivateKey(key *ecdsa.PrivateKey) error {
  16. mk, err := x509.MarshalECPrivateKey(key)
  17. if err != nil {
  18. return err
  19. }
  20. var pemData = pem.EncodeToMemory(&pem.Block{
  21. Type: "ECDSA PRIVATE KEY",
  22. Bytes: mk,
  23. })
  24. return c.loadPrivateKey("ECDSA", string(pemData))
  25. }
  26. // LoadRSAPrivateKey encodes a *rsa.PrivateKey as a PEM block before sending
  27. // it to the Vici interface
  28. func (c *ClientConn) LoadRSAPrivateKey(key *rsa.PrivateKey) error {
  29. var mk = x509.MarshalPKCS1PrivateKey(key)
  30. var pemData = pem.EncodeToMemory(&pem.Block{
  31. Type: "RSA PRIVATE KEY",
  32. Bytes: mk,
  33. })
  34. return c.loadPrivateKey("RSA", string(pemData))
  35. }
  36. // loadPrivateKey expects typ to be (RSA|ECDSA) and a PEM encoded data as a
  37. // string
  38. func (c *ClientConn) loadPrivateKey(typ, data string) (err error) {
  39. requestMap := &map[string]interface{}{}
  40. var k = keyPayload{
  41. Typ: typ,
  42. Data: data,
  43. }
  44. if err = ConvertToGeneral(k, requestMap); err != nil {
  45. return fmt.Errorf("error creating request: %v", err)
  46. }
  47. msg, err := c.Request("load-key", *requestMap)
  48. if msg["success"] != "yes" {
  49. return fmt.Errorf("unsuccessful loadPrivateKey: %v", msg["success"])
  50. }
  51. return nil
  52. }