package main import ( "crypto/rsa" "crypto/sha256" "crypto/tls" "crypto/x509" "crypto/x509/pkix" "encoding/binary" "encoding/pem" "io" "math/big" "math/rand" "time" ) func deterministicReader() io.Reader { seed := sha256.Sum256([]byte("paopao-location-spoofer-ca-v1")) src := rand.NewSource(int64(binary.BigEndian.Uint64(seed[:8]))) return rand.New(src) } func generateCA() (certPEM, keyPEM []byte, err error) { rng := deterministicReader() privateKey, err := rsa.GenerateKey(rng, 2048) if err != nil { return nil, nil, err } template := x509.Certificate{ SerialNumber: big.NewInt(1), Subject: pkix.Name{ Organization: []string{"WLOC"}, CommonName: "WLOC CA " + time.Now().In(time.FixedZone("CST", 8*3600)).Format("2006.01.02 15:04"), }, NotBefore: time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC), NotAfter: time.Date(2045, 1, 1, 0, 0, 0, 0, time.UTC), KeyUsage: x509.KeyUsageDigitalSignature | x509.KeyUsageKeyEncipherment | x509.KeyUsageCertSign, ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, BasicConstraintsValid: true, IsCA: true, } certDER, err := x509.CreateCertificate(rng, &template, &template, &privateKey.PublicKey, privateKey) if err != nil { return nil, nil, err } certPEM = pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: certDER}) keyDER, err := x509.MarshalPKCS8PrivateKey(privateKey) if err != nil { return nil, nil, err } keyPEM = pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: keyDER}) return certPEM, keyPEM, nil } func parseCA(certPEM, keyPEM []byte) (*tls.Certificate, error) { cert, err := tls.X509KeyPair(certPEM, keyPEM) if err != nil { return nil, err } if cert.Leaf, err = x509.ParseCertificate(cert.Certificate[0]); err != nil { return nil, err } return &cert, nil }