grpc.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package kms
  2. import (
  3. "context"
  4. "time"
  5. "github.com/drakkan/sftpgo/v2/sdk/plugin/kms/proto"
  6. )
  7. const (
  8. rpcTimeout = 20 * time.Second
  9. )
  10. // GRPCClient is an implementation of KMS interface that talks over RPC.
  11. type GRPCClient struct {
  12. client proto.KMSClient
  13. }
  14. // Encrypt implements the KMSService interface
  15. func (c *GRPCClient) Encrypt(payload, additionalData, URL, masterKey string) (string, string, int32, error) {
  16. ctx, cancel := context.WithTimeout(context.Background(), rpcTimeout)
  17. defer cancel()
  18. resp, err := c.client.Encrypt(ctx, &proto.EncryptRequest{
  19. Payload: payload,
  20. AdditionalData: additionalData,
  21. Url: URL,
  22. MasterKey: masterKey,
  23. })
  24. if err != nil {
  25. return "", "", 0, err
  26. }
  27. return resp.Payload, resp.Key, resp.Mode, nil
  28. }
  29. // Decrypt implements the KMSService interface
  30. func (c *GRPCClient) Decrypt(payload, key, additionalData string, mode int, URL, masterKey string) (string, error) {
  31. ctx, cancel := context.WithTimeout(context.Background(), rpcTimeout)
  32. defer cancel()
  33. resp, err := c.client.Decrypt(ctx, &proto.DecryptRequest{
  34. Payload: payload,
  35. Key: key,
  36. AdditionalData: additionalData,
  37. Mode: int32(mode),
  38. Url: URL,
  39. MasterKey: masterKey,
  40. })
  41. if err != nil {
  42. return "", err
  43. }
  44. return resp.Payload, nil
  45. }
  46. // GRPCServer defines the gRPC server that GRPCClient talks to.
  47. type GRPCServer struct {
  48. Impl Service
  49. }
  50. // Encrypt implements the serve side encrypt method
  51. func (s *GRPCServer) Encrypt(ctx context.Context, req *proto.EncryptRequest) (*proto.EncryptResponse, error) {
  52. payload, key, mode, err := s.Impl.Encrypt(req.Payload, req.AdditionalData, req.Url, req.MasterKey)
  53. if err != nil {
  54. return nil, err
  55. }
  56. return &proto.EncryptResponse{
  57. Payload: payload,
  58. Key: key,
  59. Mode: mode,
  60. }, nil
  61. }
  62. // Decrypt implements the serve side decrypt method
  63. func (s *GRPCServer) Decrypt(ctx context.Context, req *proto.DecryptRequest) (*proto.DecryptResponse, error) {
  64. payload, err := s.Impl.Decrypt(req.Payload, req.Key, req.AdditionalData, int(req.Mode), req.Url, req.MasterKey)
  65. if err != nil {
  66. return nil, err
  67. }
  68. return &proto.DecryptResponse{
  69. Payload: payload,
  70. }, nil
  71. }