interprocess/cryptdata/server/server.go (219 lines of code) (raw):
package server
import (
"context"
"encoding/base64"
grpc "google.golang.org/grpc"
"github.com/aliyun/aliyun_assist_client/agent/cryptdata"
"github.com/aliyun/aliyun_assist_client/agent/log"
pb "github.com/aliyun/aliyun_assist_client/interprocess/cryptdata/agrpc"
)
type agentServer struct {
pb.UnimplementedAssistAgentServer
}
func newRespStatus() *pb.RespStatus {
return &pb.RespStatus{
StatusCode: 0,
ErrMessage: "OK",
}
}
func RegisterAssistAgentServer(sr grpc.ServiceRegistrar) {
pb.RegisterAssistAgentServer(sr, &agentServer{})
}
func (s *agentServer) GenRsaKeyPair(ctx context.Context, req *pb.GenRsaKeyPairReq) (*pb.GenRsaKeyPairResp, error) {
resp := &pb.GenRsaKeyPairResp{
Status: newRespStatus(),
KeyInfo: &pb.KeyInfo{},
}
defer func() {
log.GetLogger().Infof("GenRsaKeyPair keyId[%s] timeout[%d] statusCode[%d] errMsg[%s]", resp.KeyInfo.KeyPairId, req.Timeout, resp.Status.StatusCode, resp.Status.ErrMessage)
}()
keyInfo, err := cryptdata.GenRsaKey(req.KeyPairId, int(req.Timeout))
if err != nil {
resp.Status.StatusCode = int32(cryptdata.ErrToCode(err))
resp.Status.ErrMessage = err.Error()
return resp, nil // if return error, client will get a nil resp and lose the error code
}
resp.KeyInfo.KeyPairId = keyInfo.Id
resp.KeyInfo.PublicKey = keyInfo.PublicKey
resp.KeyInfo.CreatedTimestamp = keyInfo.CreatedTimestamp
resp.KeyInfo.ExpiredTimestamp = keyInfo.ExpiredTimestamp
return resp, nil
}
func (s *agentServer) RmRsaKeyPair(ctx context.Context, req *pb.RemoveRsaKeyPairReq) (*pb.RemoveRsaKeyPairResp, error) {
resp := &pb.RemoveRsaKeyPairResp{
Status: newRespStatus(),
}
defer func() {
log.GetLogger().Infof("RmRsaKeyPair keyId[%s] statusCode[%d] errMsg[%s]", req.KeyPairId, resp.Status.StatusCode, resp.Status.ErrMessage)
}()
err := cryptdata.RemoveRsaKey(req.KeyPairId)
if err != nil {
resp.Status.StatusCode = int32(cryptdata.ErrToCode(err))
resp.Status.ErrMessage = err.Error()
}
return resp, nil
}
func (s *agentServer) EncryptText(ctx context.Context, req *pb.EncryptReq) (*pb.EncryptResp, error) {
resp := &pb.EncryptResp{
Status: newRespStatus(),
}
defer func() {
log.GetLogger().Infof("EncryptText keyId[%s] statusCode[%d] errMsg[%s]", req.KeyPairId, resp.Status.StatusCode, resp.Status.ErrMessage)
}()
cipherText, err := cryptdata.EncryptWithRsa(req.KeyPairId, req.PlainText)
if err != nil {
resp.Status.StatusCode = int32(cryptdata.ErrToCode(err))
resp.Status.ErrMessage = err.Error()
return resp, nil
}
resp.CipherText = base64.StdEncoding.EncodeToString(cipherText)
return resp, nil
}
func (s *agentServer) DecryptText(ctx context.Context, req *pb.DecryptReq) (*pb.DecryptResp, error) {
resp := &pb.DecryptResp{
Status: newRespStatus(),
}
defer func() {
log.GetLogger().Infof("DecryptText keyId[%s] statusCode[%d] errMsg[%s]", req.KeyPairId, resp.Status.StatusCode, resp.Status.ErrMessage)
}()
cipherText, err := base64.StdEncoding.DecodeString(req.CipherText)
if err != nil {
resp.Status.StatusCode = int32(cryptdata.ErrToCode(err))
resp.Status.ErrMessage = err.Error()
return resp, nil
}
plainText, err := cryptdata.DecryptWithRsa(req.KeyPairId, cipherText)
if err != nil {
resp.Status.StatusCode = int32(cryptdata.ErrToCode(err))
resp.Status.ErrMessage = err.Error()
return resp, nil
}
resp.PlainText = string(plainText)
return resp, nil
}
func (s *agentServer) CheckKey(ctx context.Context, req *pb.CheckKeyReq) (*pb.CheckKeyResp, error) {
resp := &pb.CheckKeyResp{
Status: newRespStatus(),
}
defer func() {
log.GetLogger().Infof("CheckKey keyId[%s] statusCode[%d] errMsg[%s]", req.KeyPairId, resp.Status.StatusCode, resp.Status.ErrMessage)
}()
if req.KeyPairId != "" {
keyInfo, err := cryptdata.CheckKey(req.KeyPairId)
if err != nil {
resp.Status.StatusCode = int32(cryptdata.ErrToCode(err))
resp.Status.ErrMessage = err.Error()
return resp, nil
}
resp.KeyInfos = append(resp.KeyInfos, &pb.KeyInfo{
KeyPairId: keyInfo.Id,
PublicKey: keyInfo.PublicKey,
CreatedTimestamp: keyInfo.CreatedTimestamp,
ExpiredTimestamp: keyInfo.ExpiredTimestamp,
})
} else {
keyList := cryptdata.CheckKeyList()
for _, keyInfo := range keyList {
resp.KeyInfos = append(resp.KeyInfos, &pb.KeyInfo{
KeyPairId: keyInfo.Id,
PublicKey: keyInfo.PublicKey,
CreatedTimestamp: keyInfo.CreatedTimestamp,
ExpiredTimestamp: keyInfo.ExpiredTimestamp,
})
}
}
return resp, nil
}
func (s *agentServer) CreateSecretParam(ctx context.Context, req *pb.CreateSecretParamReq) (*pb.CreateSecretParamResp, error) {
resp := &pb.CreateSecretParamResp{
Status: newRespStatus(),
SecretParam: &pb.SecretParamInfo{},
}
defer func() {
log.GetLogger().Infof("CreateSecretParam keyId[%s] secretName[%s] timeout[%d] statusCode[%d] errMsg[%s]", req.KeyPairId, req.SecretName, req.Timeout, resp.Status.StatusCode, resp.Status.ErrMessage)
}()
cipherText, err := base64.StdEncoding.DecodeString(req.CipherText)
if err != nil {
resp.Status.StatusCode = int32(cryptdata.ErrToCode(err))
resp.Status.ErrMessage = err.Error()
return resp, nil
}
var cipherAesKey []byte
if len(req.CipherAesKey) > 0 {
cipherAesKey, err = base64.StdEncoding.DecodeString(req.CipherAesKey)
if err != nil {
resp.Status.StatusCode = int32(cryptdata.ErrToCode(err))
resp.Status.ErrMessage = err.Error()
return resp, nil
}
}
paramInfo, err := cryptdata.CreateSecretParam(req.KeyPairId, req.SecretName, int64(req.Timeout), cipherText, cipherAesKey)
if err != nil {
resp.Status.StatusCode = int32(cryptdata.ErrToCode(err))
resp.Status.ErrMessage = err.Error()
return resp, nil
}
resp.SecretParam.SecretName = paramInfo.SecretName
resp.SecretParam.CreatedTimestamp = paramInfo.CreatedTimestamp
resp.SecretParam.ExpiredTimestamp = paramInfo.ExpiredTimestamp
return resp, nil
}
func (s *agentServer) GetSecretParamValue(ctx context.Context, req *pb.GetSecretParamValueReq) (*pb.GetSecretParamValueResp, error) {
resp := &pb.GetSecretParamValueResp{
Status: newRespStatus(),
SecretParamValue: &pb.SecretParamValue{},
}
defer func() {
log.GetLogger().Infof("GetSecretParamValue secretName[%s] statusCode[%d] errMsg[%s]", req.SecretName, resp.Status.StatusCode, resp.Status.ErrMessage)
}()
paramValue, err := cryptdata.GetSecretParamValue(req.SecretName)
if err != nil {
resp.Status.StatusCode = int32(cryptdata.ErrToCode(err))
resp.Status.ErrMessage = err.Error()
return resp, nil
}
resp.SecretParamValue.SecretName = paramValue.SecretName
resp.SecretParamValue.SecretValue = paramValue.SecretValue
resp.SecretParamValue.CreatedTimestamp = paramValue.CreatedTimestamp
resp.SecretParamValue.ExpiredTimestamp = paramValue.ExpiredTimestamp
return resp, nil
}
func (s *agentServer) SignData(ctx context.Context, req *pb.SignDataReq) (*pb.SignDataResp, error) {
resp := &pb.SignDataResp{
Status: newRespStatus(),
}
defer func() {
log.GetLogger().Infof("SignData keyPairId[%s] plainText[%s] statusCode[%d] errMsg[%s]", req.KeyPairId, req.PlainText, resp.Status.StatusCode, resp.Status.ErrMessage)
}()
signature, err := cryptdata.SignData(req.KeyPairId, req.PlainText)
if err != nil {
resp.Status.StatusCode = int32(cryptdata.ErrToCode(err))
resp.Status.ErrMessage = err.Error()
return resp, nil
}
signEncoded := base64.StdEncoding.EncodeToString(signature)
resp.Signature = signEncoded
return resp, nil
}
func (s *agentServer) VerifySignature(ctx context.Context, req *pb.VerifySignatureReq) (*pb.VerifySignatureResp, error) {
resp := &pb.VerifySignatureResp{
Status: newRespStatus(),
}
defer func() {
log.GetLogger().Infof("VerifySignature keyPairId[%s] plainText[%s] signature[%s] statusCode[%d] errMsg[%s]", req.KeyPairId, req.PlainText, req.PlainText, resp.Status.StatusCode, resp.Status.ErrMessage)
}()
signature, err := base64.StdEncoding.DecodeString(req.Signature)
if err != nil {
resp.Status.StatusCode = int32(cryptdata.ErrToCode(err))
resp.Status.ErrMessage = err.Error()
return resp, nil
}
valid, err := cryptdata.VerifySignature(req.KeyPairId, req.PlainText, signature)
if err != nil {
resp.Status.StatusCode = int32(cryptdata.ErrToCode(err))
resp.Status.ErrMessage = err.Error()
return resp, nil
}
resp.Valid = valid
return resp, nil
}