diff --git a/cover.html b/cover.html
new file mode 100644
index 0000000..f63f349
--- /dev/null
+++ b/cover.html
@@ -0,0 +1,196 @@
+
+
+
+
+
+
+
package selfcert
+
+import (
+ "crypto/ecdsa"
+ "crypto/elliptic"
+ "crypto/rand"
+ "crypto/tls"
+ "crypto/x509"
+ "crypto/x509/pkix"
+ "encoding/pem"
+ "math/big"
+ "net"
+ "time"
+)
+
+func NewTLSConfig(hosts []string) (*tls.Config, error) {
+ priv, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
+ if err != nil {
+ return nil, err
+ }
+
+ serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
+
+ serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)
+ if err != nil {
+ return nil, err
+ }
+
+ template := x509.Certificate{
+ SerialNumber: serialNumber,
+ Subject: pkix.Name{
+ Organization: []string{"Acme Co"},
+ },
+ NotBefore: time.Now(),
+ NotAfter: time.Now().Add(10 * 365 * 24 * time.Hour),
+ KeyUsage: x509.KeyUsageDigitalSignature,
+ ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
+ BasicConstraintsValid: true,
+ }
+
+ for _, h := range hosts {
+ if ip := net.ParseIP(h); ip != nil {
+ template.IPAddresses = append(template.IPAddresses, ip)
+ } else {
+ template.DNSNames = append(template.DNSNames, h)
+ }
+ }
+
+ certBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, &priv.PublicKey, priv)
+ if err != nil {
+ return nil, err
+ }
+
+ certPem := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: certBytes})
+
+ keyBytes, err := x509.MarshalPKCS8PrivateKey(priv)
+ if err != nil {
+ return nil, err
+ }
+
+ keyPem := pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: keyBytes})
+
+ cert, err := tls.X509KeyPair(certPem, keyPem)
+ if err != nil {
+ return nil, err
+ }
+
+ conf := &tls.Config{
+ Certificates: []tls.Certificate{cert},
+ MinVersion: tls.VersionTLS13,
+ NextProtos: []string{"h2"},
+ }
+
+ return conf, nil
+}
+
+func NewTLSConfigFromHostPort(hostport string) (*tls.Config, error) {
+ host, _, err := net.SplitHostPort(hostport)
+ if err != nil {
+ return nil, err
+ }
+
+ return NewTLSConfig([]string{host})
+}
+
+
+
+
+
+
diff --git a/cover.out b/cover.out
new file mode 100644
index 0000000..c98659a
--- /dev/null
+++ b/cover.out
@@ -0,0 +1,19 @@
+mode: atomic
+github.com/gopatchy/selfcert/selfcert.go:16.56,18.16 2 1
+github.com/gopatchy/selfcert/selfcert.go:18.16,20.3 1 0
+github.com/gopatchy/selfcert/selfcert.go:22.2,25.16 3 1
+github.com/gopatchy/selfcert/selfcert.go:25.16,27.3 1 0
+github.com/gopatchy/selfcert/selfcert.go:29.2,41.26 2 1
+github.com/gopatchy/selfcert/selfcert.go:41.26,42.38 1 1
+github.com/gopatchy/selfcert/selfcert.go:42.38,44.4 1 0
+github.com/gopatchy/selfcert/selfcert.go:44.9,46.4 1 1
+github.com/gopatchy/selfcert/selfcert.go:49.2,50.16 2 1
+github.com/gopatchy/selfcert/selfcert.go:50.16,52.3 1 0
+github.com/gopatchy/selfcert/selfcert.go:54.2,57.16 3 1
+github.com/gopatchy/selfcert/selfcert.go:57.16,59.3 1 0
+github.com/gopatchy/selfcert/selfcert.go:61.2,64.16 3 1
+github.com/gopatchy/selfcert/selfcert.go:64.16,66.3 1 0
+github.com/gopatchy/selfcert/selfcert.go:68.2,74.18 2 1
+github.com/gopatchy/selfcert/selfcert.go:77.69,79.16 2 1
+github.com/gopatchy/selfcert/selfcert.go:79.16,81.3 1 0
+github.com/gopatchy/selfcert/selfcert.go:83.2,83.37 1 1