forked from lug/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[:]
 | 
						||
}
 |