mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2025-12-19 16:30:07 +08:00
chore: simplifying generator code
Some checks are pending
Test / test (1.20, macos-13) (push) Waiting to run
Test / test (1.20, macos-latest) (push) Waiting to run
Test / test (1.20, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.20, ubuntu-latest) (push) Waiting to run
Test / test (1.20, windows-latest) (push) Waiting to run
Test / test (1.21, macos-13) (push) Waiting to run
Test / test (1.21, macos-latest) (push) Waiting to run
Test / test (1.21, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.21, ubuntu-latest) (push) Waiting to run
Test / test (1.21, windows-latest) (push) Waiting to run
Test / test (1.22, macos-13) (push) Waiting to run
Test / test (1.22, macos-latest) (push) Waiting to run
Test / test (1.22, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.22, ubuntu-latest) (push) Waiting to run
Test / test (1.22, windows-latest) (push) Waiting to run
Test / test (1.23, macos-13) (push) Waiting to run
Test / test (1.23, macos-latest) (push) Waiting to run
Test / test (1.23, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.23, ubuntu-latest) (push) Waiting to run
Test / test (1.23, windows-latest) (push) Waiting to run
Test / test (1.24, macos-13) (push) Waiting to run
Test / test (1.24, macos-latest) (push) Waiting to run
Test / test (1.24, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.24, ubuntu-latest) (push) Waiting to run
Test / test (1.24, windows-latest) (push) Waiting to run
Test / test (1.25, macos-13) (push) Waiting to run
Test / test (1.25, macos-latest) (push) Waiting to run
Test / test (1.25, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.25, ubuntu-latest) (push) Waiting to run
Test / test (1.25, windows-latest) (push) Waiting to run
Trigger CMFA Update / trigger-CMFA-update (push) Waiting to run
Some checks are pending
Test / test (1.20, macos-13) (push) Waiting to run
Test / test (1.20, macos-latest) (push) Waiting to run
Test / test (1.20, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.20, ubuntu-latest) (push) Waiting to run
Test / test (1.20, windows-latest) (push) Waiting to run
Test / test (1.21, macos-13) (push) Waiting to run
Test / test (1.21, macos-latest) (push) Waiting to run
Test / test (1.21, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.21, ubuntu-latest) (push) Waiting to run
Test / test (1.21, windows-latest) (push) Waiting to run
Test / test (1.22, macos-13) (push) Waiting to run
Test / test (1.22, macos-latest) (push) Waiting to run
Test / test (1.22, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.22, ubuntu-latest) (push) Waiting to run
Test / test (1.22, windows-latest) (push) Waiting to run
Test / test (1.23, macos-13) (push) Waiting to run
Test / test (1.23, macos-latest) (push) Waiting to run
Test / test (1.23, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.23, ubuntu-latest) (push) Waiting to run
Test / test (1.23, windows-latest) (push) Waiting to run
Test / test (1.24, macos-13) (push) Waiting to run
Test / test (1.24, macos-latest) (push) Waiting to run
Test / test (1.24, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.24, ubuntu-latest) (push) Waiting to run
Test / test (1.24, windows-latest) (push) Waiting to run
Test / test (1.25, macos-13) (push) Waiting to run
Test / test (1.25, macos-latest) (push) Waiting to run
Test / test (1.25, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.25, ubuntu-latest) (push) Waiting to run
Test / test (1.25, windows-latest) (push) Waiting to run
Trigger CMFA Update / trigger-CMFA-update (push) Waiting to run
This commit is contained in:
parent
e4dfe09744
commit
664ddb8d55
@ -1,97 +0,0 @@
|
|||||||
// Copy from https://github.com/WireGuard/wgctrl-go/blob/a9ab2273dd1075ea74b88c76f8757f8b4003fcbf/wgtypes/types.go#L71-L155
|
|
||||||
|
|
||||||
package generater
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/rand"
|
|
||||||
"encoding/base64"
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"golang.org/x/crypto/curve25519"
|
|
||||||
)
|
|
||||||
|
|
||||||
// KeyLen is the expected key length for a WireGuard key.
|
|
||||||
const KeyLen = 32 // wgh.KeyLen
|
|
||||||
|
|
||||||
// A Key is a public, private, or pre-shared secret key. The Key constructor
|
|
||||||
// functions in this package can be used to create Keys suitable for each of
|
|
||||||
// these applications.
|
|
||||||
type Key [KeyLen]byte
|
|
||||||
|
|
||||||
// GenerateKey generates a Key suitable for use as a pre-shared secret key from
|
|
||||||
// a cryptographically safe source.
|
|
||||||
//
|
|
||||||
// The output Key should not be used as a private key; use GeneratePrivateKey
|
|
||||||
// instead.
|
|
||||||
func GenerateKey() (Key, error) {
|
|
||||||
b := make([]byte, KeyLen)
|
|
||||||
if _, err := rand.Read(b); err != nil {
|
|
||||||
return Key{}, fmt.Errorf("wgtypes: failed to read random bytes: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return NewKey(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GeneratePrivateKey generates a Key suitable for use as a private key from a
|
|
||||||
// cryptographically safe source.
|
|
||||||
func GeneratePrivateKey() (Key, error) {
|
|
||||||
key, err := GenerateKey()
|
|
||||||
if err != nil {
|
|
||||||
return Key{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Modify random bytes using algorithm described at:
|
|
||||||
// https://cr.yp.to/ecdh.html.
|
|
||||||
key[0] &= 248
|
|
||||||
key[31] &= 127
|
|
||||||
key[31] |= 64
|
|
||||||
|
|
||||||
return key, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewKey creates a Key from an existing byte slice. The byte slice must be
|
|
||||||
// exactly 32 bytes in length.
|
|
||||||
func NewKey(b []byte) (Key, error) {
|
|
||||||
if len(b) != KeyLen {
|
|
||||||
return Key{}, fmt.Errorf("wgtypes: incorrect key size: %d", len(b))
|
|
||||||
}
|
|
||||||
|
|
||||||
var k Key
|
|
||||||
copy(k[:], b)
|
|
||||||
|
|
||||||
return k, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParseKey parses a Key from a base64-encoded string, as produced by the
|
|
||||||
// Key.String method.
|
|
||||||
func ParseKey(s string) (Key, error) {
|
|
||||||
b, err := base64.StdEncoding.DecodeString(s)
|
|
||||||
if err != nil {
|
|
||||||
return Key{}, fmt.Errorf("wgtypes: failed to parse base64-encoded key: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return NewKey(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
// PublicKey computes a public key from the private key k.
|
|
||||||
//
|
|
||||||
// PublicKey should only be called when k is a private key.
|
|
||||||
func (k Key) PublicKey() Key {
|
|
||||||
var (
|
|
||||||
pub [KeyLen]byte
|
|
||||||
priv = [KeyLen]byte(k)
|
|
||||||
)
|
|
||||||
|
|
||||||
// ScalarBaseMult uses the correct base value per https://cr.yp.to/ecdh.html,
|
|
||||||
// so no need to specify it.
|
|
||||||
curve25519.ScalarBaseMult(&pub, &priv)
|
|
||||||
|
|
||||||
return Key(pub)
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns the base64-encoded string representation of a Key.
|
|
||||||
//
|
|
||||||
// ParseKey can be used to produce a new Key from this string.
|
|
||||||
func (k Key) String() string {
|
|
||||||
return base64.StdEncoding.EncodeToString(k[:])
|
|
||||||
}
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package generater
|
package generator
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
@ -22,20 +22,19 @@ func Main(args []string) {
|
|||||||
}
|
}
|
||||||
fmt.Println(newUUID.String())
|
fmt.Println(newUUID.String())
|
||||||
case "reality-keypair":
|
case "reality-keypair":
|
||||||
privateKey, err := GeneratePrivateKey()
|
privateKey, err := GenX25519PrivateKey()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
publicKey := privateKey.PublicKey()
|
fmt.Println("PrivateKey: " + base64.RawURLEncoding.EncodeToString(privateKey.Bytes()))
|
||||||
fmt.Println("PrivateKey: " + base64.RawURLEncoding.EncodeToString(privateKey[:]))
|
fmt.Println("PublicKey: " + base64.RawURLEncoding.EncodeToString(privateKey.PublicKey().Bytes()))
|
||||||
fmt.Println("PublicKey: " + base64.RawURLEncoding.EncodeToString(publicKey[:]))
|
|
||||||
case "wg-keypair":
|
case "wg-keypair":
|
||||||
privateKey, err := GeneratePrivateKey()
|
privateKey, err := GenX25519PrivateKey()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
fmt.Println("PrivateKey: " + privateKey.String())
|
fmt.Println("PrivateKey: " + base64.StdEncoding.EncodeToString(privateKey.Bytes()))
|
||||||
fmt.Println("PublicKey: " + privateKey.PublicKey().String())
|
fmt.Println("PublicKey: " + base64.StdEncoding.EncodeToString(privateKey.PublicKey().Bytes()))
|
||||||
case "ech-keypair":
|
case "ech-keypair":
|
||||||
if len(args) < 2 {
|
if len(args) < 2 {
|
||||||
panic("Using: generate ech-keypair <plain_server_name>")
|
panic("Using: generate ech-keypair <plain_server_name>")
|
||||||
27
component/generator/x25519.go
Normal file
27
component/generator/x25519.go
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package generator
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/ecdh"
|
||||||
|
"crypto/rand"
|
||||||
|
)
|
||||||
|
|
||||||
|
const X25519KeySize = 32
|
||||||
|
|
||||||
|
func GenX25519PrivateKey() (*ecdh.PrivateKey, error) {
|
||||||
|
var privateKey [X25519KeySize]byte
|
||||||
|
_, err := rand.Read(privateKey[:])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Avoid generating equivalent X25519 private keys
|
||||||
|
// https://github.com/XTLS/Xray-core/pull/1747
|
||||||
|
//
|
||||||
|
// Modify random bytes using algorithm described at:
|
||||||
|
// https://cr.yp.to/ecdh.html.
|
||||||
|
privateKey[0] &= 248
|
||||||
|
privateKey[31] &= 127
|
||||||
|
privateKey[31] |= 64
|
||||||
|
|
||||||
|
return ecdh.X25519().NewPrivateKey(privateKey[:])
|
||||||
|
}
|
||||||
@ -21,7 +21,7 @@ import (
|
|||||||
"github.com/metacubex/mihomo/component/ca"
|
"github.com/metacubex/mihomo/component/ca"
|
||||||
"github.com/metacubex/mihomo/component/dialer"
|
"github.com/metacubex/mihomo/component/dialer"
|
||||||
"github.com/metacubex/mihomo/component/ech"
|
"github.com/metacubex/mihomo/component/ech"
|
||||||
"github.com/metacubex/mihomo/component/generater"
|
"github.com/metacubex/mihomo/component/generator"
|
||||||
tlsC "github.com/metacubex/mihomo/component/tls"
|
tlsC "github.com/metacubex/mihomo/component/tls"
|
||||||
C "github.com/metacubex/mihomo/constant"
|
C "github.com/metacubex/mihomo/constant"
|
||||||
|
|
||||||
@ -48,13 +48,12 @@ var echConfigBase64, echKeyPem, _ = ech.GenECHConfig(echPublicSni)
|
|||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
rand.Read(httpData)
|
rand.Read(httpData)
|
||||||
privateKey, err := generater.GeneratePrivateKey()
|
privateKey, err := generator.GenX25519PrivateKey()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
publicKey := privateKey.PublicKey()
|
realityPrivateKey = base64.RawURLEncoding.EncodeToString(privateKey.Bytes())
|
||||||
realityPrivateKey = base64.RawURLEncoding.EncodeToString(privateKey[:])
|
realityPublickey = base64.RawURLEncoding.EncodeToString(privateKey.PublicKey().Bytes())
|
||||||
realityPublickey = base64.RawURLEncoding.EncodeToString(publicKey[:])
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type TestTunnel struct {
|
type TestTunnel struct {
|
||||||
|
|||||||
4
main.go
4
main.go
@ -14,7 +14,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
"github.com/metacubex/mihomo/component/generater"
|
"github.com/metacubex/mihomo/component/generator"
|
||||||
"github.com/metacubex/mihomo/component/geodata"
|
"github.com/metacubex/mihomo/component/geodata"
|
||||||
"github.com/metacubex/mihomo/component/updater"
|
"github.com/metacubex/mihomo/component/updater"
|
||||||
"github.com/metacubex/mihomo/config"
|
"github.com/metacubex/mihomo/config"
|
||||||
@ -73,7 +73,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(os.Args) > 1 && os.Args[1] == "generate" {
|
if len(os.Args) > 1 && os.Args[1] == "generate" {
|
||||||
generater.Main(os.Args[2:])
|
generator.Main(os.Args[2:])
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -56,6 +56,9 @@ func GenX25519(privateKeyStr string) (privateKeyBase64, passwordBase64 string, e
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Avoid generating equivalent X25519 private keys
|
||||||
|
// https://github.com/XTLS/Xray-core/pull/1747
|
||||||
|
//
|
||||||
// Modify random bytes using algorithm described at:
|
// Modify random bytes using algorithm described at:
|
||||||
// https://cr.yp.to/ecdh.html.
|
// https://cr.yp.to/ecdh.html.
|
||||||
privateKey[0] &= 248
|
privateKey[0] &= 248
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user