| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- package all
- import (
- "crypto/rand"
- "encoding/base64"
- "fmt"
- "golang.org/x/crypto/curve25519"
- )
- func Curve25519Genkey(StdEncoding bool, input_base64 string) {
- var output string
- var err error
- var privateKey, publicKey []byte
- var encoding *base64.Encoding
- if *input_stdEncoding || StdEncoding {
- encoding = base64.StdEncoding
- } else {
- encoding = base64.RawURLEncoding
- }
- if len(input_base64) > 0 {
- privateKey, err = encoding.DecodeString(input_base64)
- if err != nil {
- output = err.Error()
- goto out
- }
- if len(privateKey) != curve25519.ScalarSize {
- output = "Invalid length of private key."
- goto out
- }
- }
- if privateKey == nil {
- privateKey = make([]byte, curve25519.ScalarSize)
- if _, err = rand.Read(privateKey); err != nil {
- output = err.Error()
- goto out
- }
- }
- // Modify random bytes using algorithm described at:
- // https://cr.yp.to/ecdh.html.
- privateKey[0] &= 248
- privateKey[31] &= 127 | 64
- if publicKey, err = curve25519.X25519(privateKey, curve25519.Basepoint); err != nil {
- output = err.Error()
- goto out
- }
- output = fmt.Sprintf("Private key: %v\nPublic key: %v",
- encoding.EncodeToString(privateKey),
- encoding.EncodeToString(publicKey))
- out:
- fmt.Println(output)
- }
|