Files
cunicu/pkg/pb/signaling.go
2022-07-16 23:38:02 +02:00

56 lines
1.3 KiB
Go

package pb
import (
"errors"
"fmt"
"google.golang.org/protobuf/proto"
"riasc.eu/wice/pkg/crypto"
)
func (e *SignalingEnvelope) PublicKeyPair() (crypto.PublicKeyPair, error) {
sender, err := crypto.ParseKeyBytes(e.Sender)
if err != nil {
return crypto.PublicKeyPair{}, fmt.Errorf("invalid key: %w", err)
}
recipient, err := crypto.ParseKeyBytes(e.Recipient)
if err != nil {
return crypto.PublicKeyPair{}, fmt.Errorf("invalid key: %w", err)
}
return crypto.PublicKeyPair{
Ours: recipient,
Theirs: sender,
}, nil
}
func (e *SignalingEnvelope) Decrypt(kp *crypto.KeyPair) (*SignalingMessage, error) {
ekp, err := e.PublicKeyPair()
if err != nil {
return nil, fmt.Errorf("failed to get keys from envelope: %w", err)
}
if ekp != kp.Public() {
return nil, errors.New("key pair mismatch")
}
msg := &SignalingMessage{}
return msg, e.Contents.Unmarshal(msg, kp)
}
func (e *SignalingMessage) Encrypt(kp *crypto.KeyPair) (*SignalingEnvelope, error) {
envp := &SignalingEnvelope{
Sender: kp.Ours.PublicKey().Bytes(),
Recipient: kp.Theirs.Bytes(),
Contents: &EncryptedMessage{},
}
return envp, envp.Contents.Marshal(e, kp)
}
func (e *SignalingEnvelope) DeepCopyInto(out *SignalingEnvelope) {
p := proto.Clone(e).(*SignalingEnvelope)
*out = *p
}