diff options
Diffstat (limited to 'device/noise-helpers.go')
-rw-r--r-- | device/noise-helpers.go | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/device/noise-helpers.go b/device/noise-helpers.go index ae52a7d..f5e4b4b 100644 --- a/device/noise-helpers.go +++ b/device/noise-helpers.go @@ -7,10 +7,12 @@ package device import ( "crypto/hmac" + "crypto/rand" "crypto/subtle" "hash" "golang.org/x/crypto/blake2s" + "golang.org/x/crypto/curve25519" ) /* KDF related functions. @@ -73,3 +75,28 @@ func setZero(arr []byte) { arr[i] = 0 } } + +func (sk *NoisePrivateKey) clamp() { + sk[0] &= 248 + sk[31] = (sk[31] & 127) | 64 +} + +func newPrivateKey() (sk NoisePrivateKey, err error) { + _, err = rand.Read(sk[:]) + sk.clamp() + return +} + +func (sk *NoisePrivateKey) publicKey() (pk NoisePublicKey) { + apk := (*[NoisePublicKeySize]byte)(&pk) + ask := (*[NoisePrivateKeySize]byte)(sk) + curve25519.ScalarBaseMult(apk, ask) + return +} + +func (sk *NoisePrivateKey) sharedSecret(pk NoisePublicKey) (ss [NoisePublicKeySize]byte) { + apk := (*[NoisePublicKeySize]byte)(&pk) + ask := (*[NoisePrivateKeySize]byte)(sk) + curve25519.ScalarMult(&ss, ask, apk) + return ss +} |