forked from jshiffer/matterbridge
45 lines
1.1 KiB
Go
45 lines
1.1 KiB
Go
/*
|
||
In cryptography, Curve25519 is an elliptic curve offering 128 bits of security and designed for use with the elliptic
|
||
curve Diffie–Hellman (ECDH) key agreement scheme. It is one of the fastest ECC curves and is not covered by any known
|
||
patents. The reference implementation is public domain software. The original Curve25519 paper defined it
|
||
as a Diffie–Hellman (DH) function.
|
||
*/
|
||
package curve25519
|
||
|
||
import (
|
||
"crypto/rand"
|
||
"golang.org/x/crypto/curve25519"
|
||
"io"
|
||
)
|
||
|
||
/*
|
||
GenerateKey generates a public private key pair using Curve25519.
|
||
*/
|
||
func GenerateKey() (privateKey *[32]byte, publicKey *[32]byte, err error) {
|
||
var pub, priv [32]byte
|
||
|
||
_, err = io.ReadFull(rand.Reader, priv[:])
|
||
if err != nil {
|
||
return nil, nil, err
|
||
}
|
||
|
||
priv[0] &= 248
|
||
priv[31] &= 127
|
||
priv[31] |= 64
|
||
|
||
curve25519.ScalarBaseMult(&pub, &priv)
|
||
|
||
return &priv, &pub, nil
|
||
}
|
||
|
||
/*
|
||
GenerateSharedSecret generates the shared secret with a given public private key pair.
|
||
*/
|
||
func GenerateSharedSecret(priv, pub [32]byte) []byte {
|
||
var secret [32]byte
|
||
|
||
curve25519.ScalarMult(&secret, &priv, &pub)
|
||
|
||
return secret[:]
|
||
}
|