...
1
2
3
4
5
6
7 package ocsp
8
9 import (
10 "crypto"
11 "sync"
12 "time"
13
14 "golang.org/x/crypto/ocsp"
15 )
16
17 type cacheKey struct {
18 HashAlgorithm crypto.Hash
19 IssuerNameHash string
20 IssuerKeyHash string
21 SerialNumber string
22 }
23
24
25 type Cache interface {
26 Update(*ocsp.Request, *ResponseDetails) *ResponseDetails
27 Get(request *ocsp.Request) *ResponseDetails
28 }
29
30
31 type ConcurrentCache struct {
32 cache map[cacheKey]*ResponseDetails
33 sync.Mutex
34 }
35
36 var _ Cache = (*ConcurrentCache)(nil)
37
38
39 func NewCache() *ConcurrentCache {
40 return &ConcurrentCache{
41 cache: make(map[cacheKey]*ResponseDetails),
42 }
43 }
44
45
46
47
48
49
50
51 func (c *ConcurrentCache) Update(request *ocsp.Request, response *ResponseDetails) *ResponseDetails {
52 unknown := response.Status == ocsp.Unknown
53 hasUpdateTime := !response.NextUpdate.IsZero()
54 canBeCached := !unknown && hasUpdateTime
55 key := createCacheKey(request)
56
57 c.Lock()
58 defer c.Unlock()
59
60 current, ok := c.cache[key]
61 if !ok {
62 if canBeCached {
63 c.cache[key] = response
64 }
65
66
67
68 return response
69 }
70
71
72 if unknown {
73 return current
74 }
75
76
77
78
79 if !hasUpdateTime {
80 delete(c.cache, key)
81 return response
82 }
83
84
85
86 newest := current
87 if response.NextUpdate.After(current.NextUpdate) {
88 c.cache[key] = response
89 newest = response
90 }
91 return newest
92 }
93
94
95
96 func (c *ConcurrentCache) Get(request *ocsp.Request) *ResponseDetails {
97 key := createCacheKey(request)
98
99 c.Lock()
100 defer c.Unlock()
101
102 response, ok := c.cache[key]
103 if !ok {
104 return nil
105 }
106
107 if time.Now().UTC().Before(response.NextUpdate) {
108 return response
109 }
110 delete(c.cache, key)
111 return nil
112 }
113
114 func createCacheKey(request *ocsp.Request) cacheKey {
115 return cacheKey{
116 HashAlgorithm: request.HashAlgorithm,
117 IssuerNameHash: string(request.IssuerNameHash),
118 IssuerKeyHash: string(request.IssuerKeyHash),
119 SerialNumber: request.SerialNumber.String(),
120 }
121 }
122
View as plain text