package main import ( "crypto/rand" "crypto/rsa" "crypto/tls" "crypto/x509" "crypto/x509/pkix" "encoding/pem" "math/big" "time" ) func randomSerialNumber() (*big.Int, error) { // Keep the serial positive and within the RFC 5280 recommended 20-octet bound. limit := new(big.Int).Lsh(big.NewInt(1), 159) return rand.Int(rand.Reader, limit) } func generateCA() (certPEM, keyPEM []byte, err error) { privateKey, err := rsa.GenerateKey(rand.Reader, 2048) if err != nil { return nil, nil, err } serialNumber, err := randomSerialNumber() if err != nil { return nil, nil, err } template := x509.Certificate{ SerialNumber: serialNumber, Subject: pkix.Name{ Organization: []string{"Location Spoofer"}, CommonName: "Location Spoofer CA", }, 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(rand.Reader, &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 }