diff --git a/internal/handler/msgpack.go b/internal/handler/msgpack.go index 64def3a..ffc460b 100644 --- a/internal/handler/msgpack.go +++ b/internal/handler/msgpack.go @@ -279,6 +279,13 @@ func (m *MsgPackHandler) parseCommand(frame []byte, command *protocol.Command) e } command.Command = revokeCertificateCommand + case messages.CmdSignOpenPGP: + signOpenPGPCommand, err := m.parseSignOpenPGPCommand(frame) + if err != nil { + return err + } + + command.Command = signOpenPGPCommand default: return fmt.Errorf("unhandled command code %s", command.Announce.Code) } @@ -401,6 +408,18 @@ func (m *MsgPackHandler) parseRevokeCertificateCommand(frame []byte) (*messages. return &command, nil } +func (m *MsgPackHandler) parseSignOpenPGPCommand(frame []byte) (*messages.SignOpenPGPCommand, error) { + var command messages.SignOpenPGPCommand + + if err := msgpack.Unmarshal(frame, &command); err != nil { + m.logger.WithError(err).Errorf("unmarshal failed") + + return nil, errors.New("could not unmarshal sign OpenPGP command") + } + + return &command, nil +} + func New(logger *logrus.Logger, handlers ...RegisterHandler) (protocol.ServerHandler, error) { messages.RegisterGeneratedResolver() diff --git a/pkg/messages/messages.go b/pkg/messages/messages.go index bdf5077..3403a75 100644 --- a/pkg/messages/messages.go +++ b/pkg/messages/messages.go @@ -394,3 +394,37 @@ func (r *RevokeCertificateResponse) String() string { r.IssuerID, new(big.Int).SetBytes(r.Serial).Text(16), r.RevokedAt.Format(time.RFC3339), ) } + +type SignOpenPGPCommand struct { + IssuerID string `msgpack:"issuer_id"` + ProfileName string `msgpack:"profile_name"` + PublicKey []byte `msgpack:"public_key"` + CommonName string `msgpack:"cn"` + EmailAddresses []string `msgpack:"email_addresses"` +} + +func (c *SignOpenPGPCommand) String() string { + builder := &strings.Builder{} + + _, _ = fmt.Fprintf( + builder, "issuer_id=%s, profile_name=%s, cn=%s", c.IssuerID, c.ProfileName, c.CommonName, + ) + + if len(c.EmailAddresses) > 0 { + builder.WriteString(", email_addresses=[") + + builder.WriteString(strings.Join(c.EmailAddresses, ", ")) + + builder.WriteRune(']') + } + + return builder.String() +} + +type SignOpenPGPResponse struct { + SignatureData []byte `msgpack:"signature_data"` +} + +func (r *SignOpenPGPResponse) String() string { + return fmt.Sprintf("sig_data of %d bytes", len(r.SignatureData)) +}