| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- // Copyright (c) 2021 Tulir Asokan
- //
- // This Source Code Form is subject to the terms of the Mozilla Public
- // License, v. 2.0. If a copy of the MPL was not distributed with this
- // file, You can obtain one at http://mozilla.org/MPL/2.0/.
- // Package keys contains a utility struct for elliptic curve keypairs.
- package keys
- import (
- "go.mau.fi/libsignal/ecc"
- "go.mau.fi/util/random"
- "golang.org/x/crypto/curve25519"
- )
- type KeyPair struct {
- Pub *[32]byte
- Priv *[32]byte
- }
- var _ ecc.ECPublicKeyable
- func NewKeyPairFromPrivateKey(priv [32]byte) *KeyPair {
- var kp KeyPair
- kp.Priv = &priv
- var pub [32]byte
- curve25519.ScalarBaseMult(&pub, kp.Priv)
- kp.Pub = &pub
- return &kp
- }
- func NewKeyPair() *KeyPair {
- priv := *(*[32]byte)(random.Bytes(32))
- priv[0] &= 248
- priv[31] &= 127
- priv[31] |= 64
- return NewKeyPairFromPrivateKey(priv)
- }
- func (kp *KeyPair) CreateSignedPreKey(keyID uint32) *PreKey {
- newKey := NewPreKey(keyID)
- newKey.Signature = kp.Sign(&newKey.KeyPair)
- return newKey
- }
- func (kp *KeyPair) Sign(keyToSign *KeyPair) *[64]byte {
- pubKeyForSignature := make([]byte, 33)
- pubKeyForSignature[0] = ecc.DjbType
- copy(pubKeyForSignature[1:], keyToSign.Pub[:])
- signature := ecc.CalculateSignature(ecc.NewDjbECPrivateKey(*kp.Priv), pubKeyForSignature)
- return &signature
- }
- type PreKey struct {
- KeyPair
- KeyID uint32
- Signature *[64]byte
- }
- func NewPreKey(keyID uint32) *PreKey {
- return &PreKey{
- KeyPair: *NewKeyPair(),
- KeyID: keyID,
- }
- }
|