//Generate is use to create a pair of keys (Private and Public) you can specify if you want to save them in a file, // the path is defined by PrivateKeyPath and PublicKeyPath global variable func Generate(identifier string, save bool) (*rsa.PrivateKey, *rsa.PublicKey, error) { var publickey *rsa.PublicKey var privatekey *rsa.PrivateKey privatekey, err := rsa.GenerateKey(rand.Reader, 1024) if err != nil { return nil, nil, err } privatekey.Precompute() err = privatekey.Validate() if err != nil { return nil, nil, err } publickey = &privatekey.PublicKey if save == true { savePrivateKey(privatekey, PrivateKeyPath) savePublicKey(publickey, identifier, PublicKeyPath) } return privatekey, publickey, nil }
func (s *server) insertIdentity(req []byte) error { var record struct { Type string `sshtype:"17"` Rest []byte `ssh:"rest"` } if err := ssh.Unmarshal(req, &record); err != nil { return err } switch record.Type { case ssh.KeyAlgoRSA: var k rsaKeyMsg if err := ssh.Unmarshal(req, &k); err != nil { return err } priv := rsa.PrivateKey{ PublicKey: rsa.PublicKey{ E: int(k.E.Int64()), N: k.N, }, D: k.D, Primes: []*big.Int{k.P, k.Q}, } priv.Precompute() return s.agent.Add(AddedKey{PrivateKey: &priv, Comment: k.Comments}) } return fmt.Errorf("not implemented: %s", record.Type) }
func (pk *PrivateKey) parseRSAPrivateKey(data []byte) (err os.Error) { rsaPub := pk.PublicKey.PublicKey.(*rsa.PublicKey) rsaPriv := new(rsa.PrivateKey) rsaPriv.PublicKey = *rsaPub buf := bytes.NewBuffer(data) d, _, err := readMPI(buf) if err != nil { return } p, _, err := readMPI(buf) if err != nil { return } q, _, err := readMPI(buf) if err != nil { return } rsaPriv.D = new(big.Int).SetBytes(d) rsaPriv.P = new(big.Int).SetBytes(p) rsaPriv.Q = new(big.Int).SetBytes(q) pk.PrivateKey = rsaPriv pk.Encrypted = false pk.encryptedData = nil return nil }
func NewSignedClientCertificate(cfg ClientCertConfig, key *rsa.PrivateKey, caCert *x509.Certificate, caKey *rsa.PrivateKey) (*x509.Certificate, error) { ips := make([]net.IP, len(cfg.IPAddresses)) for i, ipStr := range cfg.IPAddresses { ips[i] = net.ParseIP(ipStr) } serial, err := rand.Int(rand.Reader, new(big.Int).SetInt64(math.MaxInt64)) if err != nil { return nil, err } if cfg.Duration <= 0 { return nil, errors.New("Cert duration must not be negative or zero.") } certTmpl := x509.Certificate{ Subject: pkix.Name{ CommonName: cfg.CommonName, Organization: caCert.Subject.Organization, }, DNSNames: cfg.DNSNames, IPAddresses: ips, SerialNumber: serial, NotBefore: caCert.NotBefore, NotAfter: time.Now().Add(cfg.Duration).UTC(), KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth}, } certDERBytes, err := x509.CreateCertificate(rand.Reader, &certTmpl, caCert, key.Public(), caKey) if err != nil { return nil, err } return x509.ParseCertificate(certDERBytes) }
func NewSignedCertificate(cfg CertConfig, key *rsa.PrivateKey, caCert *x509.Certificate, caKey *rsa.PrivateKey) (*x509.Certificate, error) { serial, err := rand.Int(rand.Reader, new(big.Int).SetInt64(math.MaxInt64)) if err != nil { return nil, err } certTmpl := x509.Certificate{ Subject: pkix.Name{ CommonName: cfg.CommonName, Organization: caCert.Subject.Organization, }, DNSNames: cfg.AltNames.DNSNames, IPAddresses: cfg.AltNames.IPs, SerialNumber: serial, NotBefore: caCert.NotBefore, NotAfter: time.Now().Add(Duration365d).UTC(), KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth}, } certDERBytes, err := x509.CreateCertificate(rand.Reader, &certTmpl, caCert, key.Public(), caKey) if err != nil { return nil, err } return x509.ParseCertificate(certDERBytes) }
func NewSelfSignedCACertificate(cfg CertConfig, key *rsa.PrivateKey, validDuration time.Duration) (*x509.Certificate, error) { now := time.Now() dur := Duration365d * 10 if validDuration != 0 { dur = validDuration } tmpl := x509.Certificate{ SerialNumber: new(big.Int).SetInt64(0), Subject: pkix.Name{ CommonName: cfg.CommonName, Organization: cfg.Organization, }, NotBefore: now, NotAfter: now.Add(dur), KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign, BasicConstraintsValid: true, IsCA: true, } certDERBytes, err := x509.CreateCertificate(rand.Reader, &tmpl, &tmpl, key.Public(), key) if err != nil { return nil, err } return x509.ParseCertificate(certDERBytes) }
// signPKCS7 does the minimal amount of work necessary to embed an RSA // signature into a PKCS#7 certificate. // // We prepare the certificate using the x509 package, read it back in // to our custom data type and then write it back out with the signature. func signPKCS7(rand io.Reader, priv *rsa.PrivateKey, msg []byte) ([]byte, error) { const serialNumber = 0x5462c4dd // arbitrary name := pkix.Name{CommonName: "gomobile"} template := &x509.Certificate{ SerialNumber: big.NewInt(serialNumber), SignatureAlgorithm: x509.SHA1WithRSA, Subject: name, } b, err := x509.CreateCertificate(rand, template, template, priv.Public(), priv) if err != nil { return nil, err } c := certificate{} if _, err := asn1.Unmarshal(b, &c); err != nil { return nil, err } h := sha1.New() h.Write(msg) hashed := h.Sum(nil) signed, err := rsa.SignPKCS1v15(rand, priv, crypto.SHA1, hashed) if err != nil { return nil, err } content := pkcs7SignedData{ ContentType: oidSignedData, Content: signedData{ Version: 1, DigestAlgorithms: []pkix.AlgorithmIdentifier{{ Algorithm: oidSHA1, Parameters: asn1.RawValue{Tag: 5}, }}, ContentInfo: contentInfo{Type: oidData}, Certificates: c, SignerInfos: []signerInfo{{ Version: 1, IssuerAndSerialNumber: issuerAndSerialNumber{ Issuer: name.ToRDNSequence(), SerialNumber: serialNumber, }, DigestAlgorithm: pkix.AlgorithmIdentifier{ Algorithm: oidSHA1, Parameters: asn1.RawValue{Tag: 5}, }, DigestEncryptionAlgorithm: pkix.AlgorithmIdentifier{ Algorithm: oidRSAEncryption, Parameters: asn1.RawValue{Tag: 5}, }, EncryptedDigest: signed, }}, }, } return asn1.Marshal(content) }
// MarshalPKCS1PrivateKey converts a private key to ASN.1 DER encoded form. func MarshalPKCS1PrivateKey(key *rsa.PrivateKey) []byte { key.Precompute() version := 0 if len(key.Primes) > 2 { version = 1 } priv := pkcs1PrivateKey{ Version: version, N: key.N, E: key.PublicKey.E, D: key.D, P: key.Primes[0], Q: key.Primes[1], Dp: key.Precomputed.Dp, Dq: key.Precomputed.Dq, Qinv: key.Precomputed.Qinv, } priv.AdditionalPrimes = make([]pkcs1AdditionalRSAPrime, len(key.Precomputed.CRTValues)) for i, values := range key.Precomputed.CRTValues { priv.AdditionalPrimes[i].Prime = key.Primes[2+i] priv.AdditionalPrimes[i].Exp = values.Exp priv.AdditionalPrimes[i].Coeff = values.Coeff } b, _ := asn1.Marshal(priv) return b }
func NewRsaEncrypt(privateKeyInput io.Reader, keyBytes int, newHash func() hash.Hash) (*RsaEncrypt, error) { data, err := ioutil.ReadAll(privateKeyInput) if err != nil { return nil, err } var block *pem.Block if block, _ = pem.Decode(data); block == nil || block.Type != "RSA PRIVATE KEY" { return nil, errors.New("wrong private key") } var privateKey *rsa.PrivateKey if privateKey, err = x509.ParsePKCS1PrivateKey(block.Bytes); err != nil { return nil, err } privateKey.Precompute() if err = privateKey.Validate(); err != nil { return nil, err } h := newHash() r := &RsaEncrypt{ privateKey: privateKey, keyBytes: keyBytes, maxMsgBytes: keyBytes - (h.Size()*2 + 2), newHash: newHash, } return r, nil }
// MarshalPKCS1PrivateKey converts a private key to ASN.1 DER encoded form. func MarshalPKCS1PrivateKey(key *rsa.PrivateKey) []byte { key.Precompute() version := 0 if len(key.Primes) > 2 { version = 1 } priv := pkcs1PrivateKey{ Version: version, N: rawValueForBig(key.N), E: key.PublicKey.E, D: rawValueForBig(key.D), P: rawValueForBig(key.Primes[0]), Q: rawValueForBig(key.Primes[1]), Dp: rawValueForBig(key.Precomputed.Dp), Dq: rawValueForBig(key.Precomputed.Dq), Qinv: rawValueForBig(key.Precomputed.Qinv), } priv.AdditionalPrimes = make([]pkcs1AdditionalRSAPrime, len(key.Precomputed.CRTValues)) for i, values := range key.Precomputed.CRTValues { priv.AdditionalPrimes[i].Prime = rawValueForBig(key.Primes[2+i]) priv.AdditionalPrimes[i].Exp = rawValueForBig(values.Exp) priv.AdditionalPrimes[i].Coeff = rawValueForBig(values.Coeff) } b, _ := asn1.Marshal(priv) return b }
func main() { var primes []uint64 = prime.PrimeSieveBatch{BatchSize: 100}.GetPrimes(10000) var p, q uint64 = /*uint64(104723), uint64(104729) */ primes[len(primes)-2], primes[len(primes)-1] fmt.Println(p, q) var mod int64 = int64(p * q) fmt.Println(mod) var puk, prk = /*int(65537), uint64(10195862609) */ KeyGenerator1{}.KeyGen(p, q) fmt.Println(puk, prk) b := []byte("Hi") var pub rsa.PublicKey = rsa.PublicKey{N: big.NewInt(mod), E: puk} var priv rsa.PrivateKey = rsa.PrivateKey{PublicKey: pub} priv.D = big.NewInt(int64(prk)) priv.Primes = []*big.Int{big.NewInt(int64(p)), big.NewInt(int64(q))} fmt.Println(len(b)) fmt.Printf("% x\n", b) //h := md5.New() enc, erre := rsa.EncryptPKCS1v15(rand.Reader, &pub, b) //h.Reset() dec, errd := rsa.DecryptPKCS1v15(rand.Reader, &priv, b) //fmt.Println(64 - 11) fmt.Printf("%s\n", erre) fmt.Printf("%s\n", errd) fmt.Printf("% x\n", enc) fmt.Printf("% x\n", dec) }
// GetTLSCertificate - takes x509 cert and private key, returns tls.Certificate that is ready for proxy use func GetTLSCertificate(cert *x509.Certificate, priv *rsa.PrivateKey, hostname string, validity time.Duration) (*tls.Certificate, error) { host, _, err := net.SplitHostPort(hostname) if err == nil { hostname = host } pub := priv.Public() pkixpub, err := x509.MarshalPKIXPublicKey(pub) if err != nil { return nil, err } h := sha1.New() h.Write(pkixpub) keyID := h.Sum(nil) serial, err := rand.Int(rand.Reader, MaxSerialNumber) if err != nil { return nil, err } tmpl := &x509.Certificate{ SerialNumber: serial, Subject: pkix.Name{ CommonName: hostname, Organization: cert.Subject.Organization, }, SubjectKeyId: keyID, KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, BasicConstraintsValid: true, NotBefore: time.Now().Add(validity), NotAfter: time.Now().Add(validity), } if ip := net.ParseIP(hostname); ip != nil { tmpl.IPAddresses = []net.IP{ip} } else { tmpl.DNSNames = []string{hostname} } raw, err := x509.CreateCertificate(rand.Reader, tmpl, cert, priv.Public(), priv) if err != nil { return nil, err } // Parse certificate bytes to get a leaf certificate x509c, err := x509.ParseCertificate(raw) if err != nil { return nil, err } tlsc := &tls.Certificate{ Certificate: [][]byte{raw, cert.Raw}, PrivateKey: priv, Leaf: x509c, } return tlsc, nil }
// NewKeyChain sets up a new keychain based on the RSA private key passed // in. It ensures the returned keychain is valid. func NewKeyChain(prv *rsa.PrivateKey) (kc *KeyChain, err error) { if err = prv.Validate(); err != nil { return } kc = new(KeyChain) kc.Private = prv kc.Public = make([]*PubKey, 0) return }
func keyFunc(key *rsa.PrivateKey) func(token *jwt.Token) (interface{}, error) { return func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok { return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) } return key.Public(), nil } }
// msg -> rsa func UnpackPrivateKey(k *msgs.PrivateKey) *rsa.PrivateKey { var key rsa.PrivateKey key.PublicKey = *UnpackKey(k.PublicKey) key.D = new(big.Int) key.D.SetBytes(k.D) for _, p := range k.Primes { key.Primes = append(key.Primes, new(big.Int).SetBytes(p)) } return &key }
func decrypt(key *rsa.PrivateKey, ciphertext string) (string, error) { cipherBytes, err := base64.StdEncoding.DecodeString(ciphertext) if err != nil { panic(err) } decrypted, err := key.Decrypt(rand.Reader, cipherBytes, crypto.SHA1.New()) if err != nil { return "", err } return base64.StdEncoding.EncodeToString(decrypted), nil }
func signDataSHA1(key *rsa.PrivateKey, data string) ([]byte, error) { hash := sha1.New() io.WriteString(hash, data) sum := hash.Sum(nil) signed, err := key.Sign(rand.Reader, sum, crypto.SHA1) if err != nil { return []byte{}, err } return signed, nil }
func (pk *PrivateKey) parseRSAPrivateKey(data []byte) (err error) { rsaPub := pk.PublicKey.PublicKey.(*rsa.PublicKey) rsaPriv := new(rsa.PrivateKey) rsaPriv.PublicKey = *rsaPub buf := bytes.NewBuffer(data) d, _, err := readMPI(buf) if err != nil { return } p, _, err := readMPI(buf) if err != nil { return } q, _, err := readMPI(buf) if err != nil { return } rsaPriv.D = new(big.Int).SetBytes(d) rsaPriv.Primes = make([]*big.Int, 2) rsaPriv.Primes[0] = new(big.Int).SetBytes(p) rsaPriv.Primes[1] = new(big.Int).SetBytes(q) if err := rsaPriv.Validate(); err != nil { return err } rsaPriv.Precompute() pk.PrivateKey = rsaPriv pk.Encrypted = false pk.encryptedData = nil return nil }
func GetKey() rsa.PrivateKey { var placeholder []byte var mykey MyKey var key rsa.PrivateKey stmt, err := db.Prepare("SELECT key FROM key") if err != nil { fmt.Println("While SELECTing", err) } err = stmt.Exec() if err != nil { fmt.Println("While running Exec()", err) } for { if !stmt.Next() { break } else { stmt.Scan(&placeholder) //fmt.Println("Getting key:",string(placeholder)) err = json.Unmarshal(placeholder, &mykey) if err != nil { fmt.Println(err) os.Exit(1) } d := big.NewInt(0) p := big.NewInt(0) q := big.NewInt(0) n := big.NewInt(0) d.SetString(mykey.D, 10) p.SetString(mykey.P, 10) q.SetString(mykey.Q, 10) n.SetString(mykey.PublicKey.N, 10) pubkey := rsa.PublicKey{N: n, E: mykey.PublicKey.E} key = rsa.PrivateKey{D: d, P: p, Q: q, PublicKey: pubkey} //fmt.Println("KEY:",key) err = key.Validate() if err != nil { fmt.Println("key errors:", err) } else { //fmt.Println("key looks valid") } } } return key }
func UnmarshalRsaPrivateFromProto(msg *RsaPrivateKeyMessage) (*rsa.PrivateKey, error) { if msg == nil { return nil, errors.New("No message") } key := new(rsa.PrivateKey) key.D = new(big.Int) key.D.SetBytes(msg.D) key.PublicKey.N = new(big.Int) key.PublicKey.N.SetBytes(msg.PublicKey.Modulus) key.PublicKey.E = 0x10001 // Fix // if msg.PublicKey.P != nil && msg.PublicKey.Q != nil { // msg.Primes[0] = new(big.Int) // msg.Primes[1] = new(big.Int) // msg.Primes[0].SetBytes(msg.PublicKey.P) // msg.Primes[1].SetBytes(msg.PublicKey.Q) // } return key, nil }
func TestAlertFlushing(t *testing.T) { c, s := net.Pipe() done := make(chan bool) clientWCC := &writeCountingConn{Conn: c} serverWCC := &writeCountingConn{Conn: s} serverConfig := testConfig.Clone() // Cause a signature-time error brokenKey := rsa.PrivateKey{PublicKey: testRSAPrivateKey.PublicKey} brokenKey.D = big.NewInt(42) serverConfig.Certificates = []Certificate{{ Certificate: [][]byte{testRSACertificate}, PrivateKey: &brokenKey, }} go func() { Server(serverWCC, serverConfig).Handshake() serverWCC.Close() done <- true }() err := Client(clientWCC, testConfig).Handshake() if err == nil { t.Fatal("client unexpectedly returned no error") } const expectedError = "remote error: tls: handshake failure" if e := err.Error(); !strings.Contains(e, expectedError) { t.Fatalf("expected to find %q in error but error was %q", expectedError, e) } clientWCC.Close() <-done if n := clientWCC.numWrites; n != 1 { t.Errorf("expected client handshake to complete with one write, but saw %d", n) } if n := serverWCC.numWrites; n != 1 { t.Errorf("expected server handshake to complete with one write, but saw %d", n) } }
func parseRSACert(req []byte) (*AddedKey, error) { var k rsaCertMsg if err := ssh.Unmarshal(req, &k); err != nil { return nil, err } pubKey, err := ssh.ParsePublicKey(k.CertBytes) if err != nil { return nil, err } cert, ok := pubKey.(*ssh.Certificate) if !ok { return nil, errors.New("agent: bad RSA certificate") } // An RSA publickey as marshaled by rsaPublicKey.Marshal() in keys.go var rsaPub struct { Name string E *big.Int N *big.Int } if err := ssh.Unmarshal(cert.Key.Marshal(), &rsaPub); err != nil { return nil, fmt.Errorf("agent: Unmarshal failed to parse public key: %v", err) } if rsaPub.E.BitLen() > 30 { return nil, errors.New("agent: RSA public exponent too large") } priv := rsa.PrivateKey{ PublicKey: rsa.PublicKey{ E: int(rsaPub.E.Int64()), N: rsaPub.N, }, D: k.D, Primes: []*big.Int{k.Q, k.P}, } priv.Precompute() return &AddedKey{PrivateKey: &priv, Certificate: cert, Comment: k.Comments}, nil }
// GenerateCertificate generates an X509 Certificate from a template, given a GUN func (ucs *UnlockedCryptoService) GenerateCertificate(gun string) (*x509.Certificate, error) { algorithm := ucs.PrivKey.Algorithm() var publicKey crypto.PublicKey var privateKey crypto.PrivateKey var err error switch algorithm { case data.RSAKey: var rsaPrivateKey *rsa.PrivateKey rsaPrivateKey, err = x509.ParsePKCS1PrivateKey(ucs.PrivKey.Private()) privateKey = rsaPrivateKey publicKey = rsaPrivateKey.Public() case data.ECDSAKey: var ecdsaPrivateKey *ecdsa.PrivateKey ecdsaPrivateKey, err = x509.ParseECPrivateKey(ucs.PrivKey.Private()) privateKey = ecdsaPrivateKey publicKey = ecdsaPrivateKey.Public() default: return nil, fmt.Errorf("only RSA or ECDSA keys are currently supported. Found: %s", algorithm) } if err != nil { return nil, fmt.Errorf("failed to parse root key: %s (%v)", gun, err) } template, err := trustmanager.NewCertificate(gun) if err != nil { return nil, fmt.Errorf("failed to create the certificate template for: %s (%v)", gun, err) } derBytes, err := x509.CreateCertificate(rand.Reader, template, template, publicKey, privateKey) if err != nil { return nil, fmt.Errorf("failed to create the certificate for: %s (%v)", gun, err) } // Encode the new certificate into PEM cert, err := x509.ParseCertificate(derBytes) if err != nil { return nil, fmt.Errorf("failed to parse the certificate for key: %s (%v)", gun, err) } return cert, nil }
// SplitPrivateKey takes an existing rsa.PrivateKey and splits it into two mrsa.PrivateKeys. // The value of D for the first key is chosen uniformly, and the value for D of the second key // is thus fixed. func SplitPrivateKey(k *rsa.PrivateKey) (*PrivateKey, *PrivateKey, error) { k1 := &PrivateKey{PublicKey: PublicKey(k.PublicKey)} k2 := &PrivateKey{PublicKey: PublicKey(k.PublicKey)} err := k.Validate() if err != nil { return nil, nil, err } k1.D, err = rand.Int(rand.Reader, k.D) if err != nil { return nil, nil, err } k2.D = new(big.Int).Sub(k.D, k1.D) return k1, k2, nil }
// GenerateKeys creates a public and private key for the current transfer // returns both func GenerateKeys() (*rsa.PublicKey, *rsa.PrivateKey) { var publicKey *rsa.PublicKey var privateKey *rsa.PrivateKey var err error // Generate Private Key if privateKey, err = rsa.GenerateKey(rand.Reader, 1024); err != nil { log.Fatal(err) } // Validate Private Key -- Sanity checks on the key if err = privateKey.Validate(); err != nil { log.Fatal(err) } // Precompute some calculations speeds up private key operations in the future privateKey.Precompute() //Public key address (of an RSA key) publicKey = &privateKey.PublicKey return publicKey, privateKey }
func TestRsa() { var private_key *rsa.PrivateKey var public_key *rsa.PublicKey var plain_text, encrypted, decrypted, label []byte var err error plain_text = []byte("Plain text message to be encrypted") //Generate Private Key if private_key, err = rsa.GenerateKey(rand.Reader, 1024); err != nil { log.Fatal(err) } fmt.Println(private_key) // Precompute some calculations -- Calculations that speed up private key operations in the future private_key.Precompute() //Validate Private Key -- Sanity checks on the key if err = private_key.Validate(); err != nil { log.Fatal(err) } //Public key address (of an RSA key) public_key = &private_key.PublicKey encrypted = Encrypt_oaep(public_key, plain_text, label) decrypted = Decrypt_oaep(private_key, encrypted, label) fmt.Printf("OAEP Encrypted [%s] to \n[%x]\n", string(plain_text), encrypted) fmt.Printf("OAEP Decrypted [%x] to \n[%s]\n", encrypted, decrypted) // To use existing private key (Skipping the GenerateKey, Precompute, Validation steps shown above) // This reads pem file and retrieves the public, private key needed to encrypt data //use_exsiting_keys() }
func NewSelfSignedCACertificate(cfg CACertConfig, key *rsa.PrivateKey) (*x509.Certificate, error) { if cfg.Duration <= 0 { return nil, errors.New("Cert duration must not be negative or zero.") } tmpl := x509.Certificate{ SerialNumber: new(big.Int).SetInt64(0), Subject: pkix.Name{ CommonName: cfg.CommonName, Organization: []string{cfg.Organization}, }, NotBefore: time.Now().UTC(), NotAfter: time.Now().Add(cfg.Duration).UTC(), KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign, BasicConstraintsValid: true, IsCA: true, } certDERBytes, err := x509.CreateCertificate(rand.Reader, &tmpl, &tmpl, key.Public(), key) if err != nil { return nil, err } return x509.ParseCertificate(certDERBytes) }
// Read a private key (file) string and create a public key. Return the private key. func (k *RR_DNSKEY) readPrivateKeyRSA(kv map[string]string) (PrivateKey, os.Error) { p := new(rsa.PrivateKey) p.Primes = []*big.Int{nil, nil} for k, v := range kv { switch k { case "modulus", "publicexponent", "privateexponent", "prime1", "prime2": v1, err := packBase64([]byte(v)) if err != nil { return nil, err } switch k { case "modulus": p.PublicKey.N = big.NewInt(0) p.PublicKey.N.SetBytes(v1) case "publicexponent": i := big.NewInt(0) i.SetBytes(v1) p.PublicKey.E = int(i.Int64()) // int64 should be large enough case "privateexponent": p.D = big.NewInt(0) p.D.SetBytes(v1) case "prime1": p.Primes[0] = big.NewInt(0) p.Primes[0].SetBytes(v1) case "prime2": p.Primes[1] = big.NewInt(0) p.Primes[1].SetBytes(v1) } case "exponent1", "exponent2", "coefficient": // not used in Go (yet) case "created", "publish", "activate": // not used in Go (yet) } } return p, nil }
// ParsePKCS1PrivateKey returns an RSA private key from its ASN.1 PKCS#1 DER encoded form. func ParsePKCS1PrivateKey(der []byte) (*rsa.PrivateKey, error) { var priv pkcs1PrivateKey rest, err := asn1.Unmarshal(der, &priv) if len(rest) > 0 { return nil, asn1.SyntaxError{Msg: "trailing data"} } if err != nil { return nil, err } if priv.Version > 1 { return nil, errors.New("x509: unsupported private key version") } if priv.N.Sign() <= 0 || priv.D.Sign() <= 0 || priv.P.Sign() <= 0 || priv.Q.Sign() <= 0 { return nil, errors.New("x509: private key contains zero or negative value") } key := new(rsa.PrivateKey) key.PublicKey = rsa.PublicKey{ E: priv.E, N: priv.N, } key.D = priv.D key.Primes = make([]*big.Int, 2+len(priv.AdditionalPrimes)) key.Primes[0] = priv.P key.Primes[1] = priv.Q for i, a := range priv.AdditionalPrimes { if a.Prime.Sign() <= 0 { return nil, errors.New("x509: private key contains zero or negative prime") } key.Primes[i+2] = a.Prime // We ignore the other two values because rsa will calculate // them as needed. } err = key.Validate() if err != nil { return nil, err } key.Precompute() return key, nil }
return x } func intFromB64(b64 string) int { return int(bigIntFromB64(b64).Int64()) } var n = bigIntFromB64("n4EPtAOCc9AlkeQHPzHStgAbgs7bTZLwUBZdR8_KuKPEHLd4rHVTeT-O-XV2jRojdNhxJWTDvNd7nqQ0VEiZQHz_AJmSCpMaJMRBSFKrKb2wqVwGU_NsYOYL-QtiWN2lbzcEe6XC0dApr5ydQLrHqkHHig3RBordaZ6Aj-oBHqFEHYpPe7Tpe-OfVfHd1E6cS6M1FZcD1NNLYD5lFHpPI9bTwJlsde3uhGqC0ZCuEHg8lhzwOHrtIQbS0FVbb9k3-tVTU4fg_3L_vniUFAKwuCLqKnS2BYwdq_mzSnbLY7h_qixoR7jig3__kRhuaxwUkRz5iaiQkqgc5gHdrNP5zw==") var e = intFromB64("AQAB") var d = bigIntFromB64("bWUC9B-EFRIo8kpGfh0ZuyGPvMNKvYWNtB_ikiH9k20eT-O1q_I78eiZkpXxXQ0UTEs2LsNRS-8uJbvQ-A1irkwMSMkK1J3XTGgdrhCku9gRldY7sNA_AKZGh-Q661_42rINLRCe8W-nZ34ui_qOfkLnK9QWDDqpaIsA-bMwWWSDFu2MUBYwkHTMEzLYGqOe04noqeq1hExBTHBOBdkMXiuFhUq1BU6l-DqEiWxqg82sXt2h-LMnT3046AOYJoRioz75tSUQfGCshWTBnP5uDjd18kKhyv07lhfSJdrPdM5Plyl21hsFf4L_mHCuoFau7gdsPfHPxxjVOcOpBrQzwQ==") var p = bigIntFromB64("uKE2dh-cTf6ERF4k4e_jy78GfPYUIaUyoSSJuBzp3Cubk3OCqs6grT8bR_cu0Dm1MZwWmtdqDyI95HrUeq3MP15vMMON8lHTeZu2lmKvwqW7anV5UzhM1iZ7z4yMkuUwFWoBvyY898EXvRD-hdqRxHlSqAZ192zB3pVFJ0s7pFc=") var q = bigIntFromB64("uKE2dh-cTf6ERF4k4e_jy78GfPYUIaUyoSSJuBzp3Cubk3OCqs6grT8bR_cu0Dm1MZwWmtdqDyI95HrUeq3MP15vMMON8lHTeZu2lmKvwqW7anV5UzhM1iZ7z4yMkuUwFWoBvyY898EXvRD-hdqRxHlSqAZ192zB3pVFJ0s7pFc=") var TheKey = rsa.PrivateKey{ PublicKey: rsa.PublicKey{N: n, E: e}, D: d, Primes: []*big.Int{p, q}, } var accountKey = &jose.JsonWebKey{Key: TheKey.Public()} var ident = core.AcmeIdentifier{Type: core.IdentifierDNS, Value: "localhost"} var log = mocks.UseMockLog() // All paths that get assigned to tokens MUST be valid tokens const expectedToken = "LoqXcYV8q5ONbJQxbmR7SCTNo3tiAXDfowyjxAjEuX0" const pathWrongToken = "i6lNAC4lOOLYCl-A08VJt9z_tKYvVk63Dumo8icsBjQ" const path404 = "404" const pathFound = "GBq8SwWq3JsbREFdCamk5IX3KLsxW5ULeGs98Ajl_UM" const pathMoved = "5J4FIMrWNfmvHZo-QpKZngmuhqZGwRm21-oEgUDstJM"