source: code/trunk/certfp.go@ 640

Last change on this file since 640 was 614, checked in by contact, 4 years ago

Split CertFP logic into separate file

File size: 1.7 KB
Line 
1package soju
2
3import (
4 "crypto"
5 "crypto/ecdsa"
6 "crypto/ed25519"
7 "crypto/elliptic"
8 "crypto/rand"
9 "crypto/rsa"
10 "crypto/x509"
11 "crypto/x509/pkix"
12 "math/big"
13 "time"
14)
15
16func generateCertFP(keyType string, bits int) (privKeyBytes, certBytes []byte, err error) {
17 var (
18 privKey crypto.PrivateKey
19 pubKey crypto.PublicKey
20 )
21 switch keyType {
22 case "rsa":
23 key, err := rsa.GenerateKey(rand.Reader, bits)
24 if err != nil {
25 return nil, nil, err
26 }
27 privKey = key
28 pubKey = key.Public()
29 case "ecdsa":
30 key, err := ecdsa.GenerateKey(elliptic.P521(), rand.Reader)
31 if err != nil {
32 return nil, nil, err
33 }
34 privKey = key
35 pubKey = key.Public()
36 case "ed25519":
37 var err error
38 pubKey, privKey, err = ed25519.GenerateKey(rand.Reader)
39 if err != nil {
40 return nil, nil, err
41 }
42 }
43
44 // Using PKCS#8 allows easier extension for new key types.
45 privKeyBytes, err = x509.MarshalPKCS8PrivateKey(privKey)
46 if err != nil {
47 return nil, nil, err
48 }
49
50 notBefore := time.Now()
51 // Lets make a fair assumption nobody will use the same cert for more than 20 years...
52 notAfter := notBefore.Add(24 * time.Hour * 365 * 20)
53 serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
54 serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)
55 if err != nil {
56 return nil, nil, err
57 }
58 cert := &x509.Certificate{
59 SerialNumber: serialNumber,
60 Subject: pkix.Name{CommonName: "soju auto-generated certificate"},
61 NotBefore: notBefore,
62 NotAfter: notAfter,
63 KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
64 ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},
65 }
66 certBytes, err = x509.CreateCertificate(rand.Reader, cert, cert, pubKey, privKey)
67 if err != nil {
68 return nil, nil, err
69 }
70
71 return privKeyBytes, certBytes, nil
72}
Note: See TracBrowser for help on using the repository browser.