mirror of
https://codeberg.org/cunicu/cunicu.git
synced 2025-10-04 16:32:57 +08:00
56 lines
1.3 KiB
Go
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
|
|
}
|