...
1
2
3
4
5
6
7 package main
8
9 import (
10 "crypto"
11 "crypto/tls"
12 "crypto/x509"
13 "io"
14 "log"
15 "net/rpc"
16 "os"
17 "time"
18 )
19
20
21 type SignArgs struct {
22 Digest []byte
23 Opts crypto.SignerOpts
24 }
25
26
27 type EnterpriseCertSigner struct {
28 cert *tls.Certificate
29 }
30
31
32 type Connection struct {
33 io.ReadCloser
34 io.WriteCloser
35 }
36
37
38 func (c *Connection) Close() error {
39 rerr := c.ReadCloser.Close()
40 werr := c.WriteCloser.Close()
41 if rerr != nil {
42 return rerr
43 }
44 return werr
45 }
46
47
48
49 func (k *EnterpriseCertSigner) CertificateChain(ignored struct{}, certificateChain *[][]byte) error {
50 *certificateChain = k.cert.Certificate
51 return nil
52 }
53
54
55 func (k *EnterpriseCertSigner) Public(ignored struct{}, publicKey *[]byte) (err error) {
56 if len(k.cert.Certificate) == 0 {
57 return nil
58 }
59 cert, err := x509.ParseCertificate(k.cert.Certificate[0])
60 if err != nil {
61 return err
62 }
63 *publicKey, err = x509.MarshalPKIXPublicKey(cert.PublicKey)
64 return err
65 }
66
67
68 func (k *EnterpriseCertSigner) Sign(args SignArgs, resp *[]byte) (err error) {
69 return nil
70 }
71
72 func main() {
73 enterpriseCertSigner := new(EnterpriseCertSigner)
74
75 data, err := os.ReadFile(os.Args[1])
76 if err != nil {
77 log.Fatalf("Error reading certificate: %v", err)
78 }
79 cert, _ := tls.X509KeyPair(data, data)
80
81 enterpriseCertSigner.cert = &cert
82
83 if err := rpc.Register(enterpriseCertSigner); err != nil {
84 log.Fatalf("Error registering net/rpc: %v", err)
85 }
86
87
88
89
90 go func() {
91 for {
92 if os.Getppid() == 1 {
93 log.Fatalln("Parent process died, exiting...")
94 }
95 time.Sleep(time.Second)
96 }
97 }()
98
99 rpc.ServeConn(&Connection{os.Stdin, os.Stdout})
100 }
101
View as plain text