Changeset 614 in code for trunk/service.go


Ignore:
Timestamp:
Oct 8, 2021, 7:47:25 AM (4 years ago)
Author:
contact
Message:

Split CertFP logic into separate file

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/service.go

    r607 r614  
    22
    33import (
    4         "crypto"
    5         "crypto/ecdsa"
    6         "crypto/ed25519"
    7         "crypto/elliptic"
    8         "crypto/rand"
    9         "crypto/rsa"
    104        "crypto/sha1"
    115        "crypto/sha256"
    126        "crypto/sha512"
    13         "crypto/x509"
    14         "crypto/x509/pkix"
    157        "encoding/hex"
    168        "errors"
     
    1810        "fmt"
    1911        "io/ioutil"
    20         "math/big"
    2112        "sort"
    2213        "strconv"
     
    239230                                        usage:  "[-key-type rsa|ecdsa|ed25519] [-bits N] <network name>",
    240231                                        desc:   "generate a new self-signed certificate, defaults to using RSA-3072 key",
    241                                         handle: handleServiceCertfpGenerate,
     232                                        handle: handleServiceCertFPGenerate,
    242233                                },
    243234                                "fingerprint": {
    244235                                        usage:  "<network name>",
    245236                                        desc:   "show fingerprints of certificate associated with the network",
    246                                         handle: handleServiceCertfpFingerprints,
     237                                        handle: handleServiceCertFPFingerprints,
    247238                                },
    248239                        },
     
    622613}
    623614
    624 func handleServiceCertfpGenerate(dc *downstreamConn, params []string) error {
     615func sendCertfpFingerprints(dc *downstreamConn, cert []byte) {
     616        sha1Sum := sha1.Sum(cert)
     617        sendServicePRIVMSG(dc, "SHA-1 fingerprint: "+hex.EncodeToString(sha1Sum[:]))
     618        sha256Sum := sha256.Sum256(cert)
     619        sendServicePRIVMSG(dc, "SHA-256 fingerprint: "+hex.EncodeToString(sha256Sum[:]))
     620        sha512Sum := sha512.Sum512(cert)
     621        sendServicePRIVMSG(dc, "SHA-512 fingerprint: "+hex.EncodeToString(sha512Sum[:]))
     622}
     623
     624func handleServiceCertFPGenerate(dc *downstreamConn, params []string) error {
    625625        fs := newFlagSet()
    626626        keyType := fs.String("key-type", "rsa", "key type to generate (rsa, ecdsa, ed25519)")
     
    640640        }
    641641
    642         var (
    643                 privKey crypto.PrivateKey
    644                 pubKey  crypto.PublicKey
    645         )
    646         switch *keyType {
    647         case "rsa":
    648                 if *bits <= 0 || *bits > maxRSABits {
    649                         return fmt.Errorf("invalid value for -bits")
    650                 }
    651                 key, err := rsa.GenerateKey(rand.Reader, *bits)
    652                 if err != nil {
    653                         return err
    654                 }
    655                 privKey = key
    656                 pubKey = key.Public()
    657         case "ecdsa":
    658                 key, err := ecdsa.GenerateKey(elliptic.P521(), rand.Reader)
    659                 if err != nil {
    660                         return err
    661                 }
    662                 privKey = key
    663                 pubKey = key.Public()
    664         case "ed25519":
    665                 var err error
    666                 pubKey, privKey, err = ed25519.GenerateKey(rand.Reader)
    667                 if err != nil {
    668                         return err
    669                 }
    670         }
    671 
    672         // Using PKCS#8 allows easier extension for new key types.
    673         privKeyBytes, err := x509.MarshalPKCS8PrivateKey(privKey)
     642        if *bits <= 0 || *bits > maxRSABits {
     643                return fmt.Errorf("invalid value for -bits")
     644        }
     645
     646        privKey, cert, err := generateCertFP(*keyType, *bits)
    674647        if err != nil {
    675648                return err
    676649        }
    677650
    678         notBefore := time.Now()
    679         // Lets make a fair assumption nobody will use the same cert for more than 20 years...
    680         notAfter := notBefore.Add(24 * time.Hour * 365 * 20)
    681         serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
    682         serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)
    683         if err != nil {
    684                 return err
    685         }
    686         cert := &x509.Certificate{
    687                 SerialNumber: serialNumber,
    688                 Subject:      pkix.Name{CommonName: "soju auto-generated certificate"},
    689                 NotBefore:    notBefore,
    690                 NotAfter:     notAfter,
    691                 KeyUsage:     x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
    692                 ExtKeyUsage:  []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},
    693         }
    694         derBytes, err := x509.CreateCertificate(rand.Reader, cert, cert, pubKey, privKey)
    695         if err != nil {
    696                 return err
    697         }
    698 
    699         net.SASL.External.CertBlob = derBytes
    700         net.SASL.External.PrivKeyBlob = privKeyBytes
     651        net.SASL.External.CertBlob = cert
     652        net.SASL.External.PrivKeyBlob = privKey
    701653        net.SASL.Mechanism = "EXTERNAL"
    702654
     
    706658
    707659        sendServicePRIVMSG(dc, "certificate generated")
    708 
    709         sha1Sum := sha1.Sum(derBytes)
    710         sendServicePRIVMSG(dc, "SHA-1 fingerprint: "+hex.EncodeToString(sha1Sum[:]))
    711         sha256Sum := sha256.Sum256(derBytes)
    712         sendServicePRIVMSG(dc, "SHA-256 fingerprint: "+hex.EncodeToString(sha256Sum[:]))
    713         sha512Sum := sha512.Sum512(derBytes)
    714         sendServicePRIVMSG(dc, "SHA-512 fingerprint: "+hex.EncodeToString(sha512Sum[:]))
    715 
    716         return nil
    717 }
    718 
    719 func handleServiceCertfpFingerprints(dc *downstreamConn, params []string) error {
     660        sendCertfpFingerprints(dc, cert)
     661        return nil
     662}
     663
     664func handleServiceCertFPFingerprints(dc *downstreamConn, params []string) error {
    720665        if len(params) != 1 {
    721666                return fmt.Errorf("expected exactly one argument")
     
    727672        }
    728673
    729         sha1Sum := sha1.Sum(net.SASL.External.CertBlob)
    730         sendServicePRIVMSG(dc, "SHA-1 fingerprint: "+hex.EncodeToString(sha1Sum[:]))
    731         sha256Sum := sha256.Sum256(net.SASL.External.CertBlob)
    732         sendServicePRIVMSG(dc, "SHA-256 fingerprint: "+hex.EncodeToString(sha256Sum[:]))
    733         sha512Sum := sha512.Sum512(net.SASL.External.CertBlob)
    734         sendServicePRIVMSG(dc, "SHA-512 fingerprint: "+hex.EncodeToString(sha512Sum[:]))
     674        if net.SASL.Mechanism != "EXTERNAL" {
     675                return fmt.Errorf("CertFP not set up")
     676        }
     677
     678        sendCertfpFingerprints(dc, net.SASL.External.CertBlob)
    735679        return nil
    736680}
Note: See TracChangeset for help on using the changeset viewer.