Files
quic-go/crypto/cert_cache.go
2016-08-09 14:34:49 +02:00

43 lines
912 B
Go

package crypto
import (
"hash/fnv"
"sync"
)
var (
compressedCertsCache = map[uint64][]byte{}
compressedCertsCacheMutex sync.RWMutex
)
func getCompressedCert(chain [][]byte, pCommonSetHashes, pCachedHashes []byte) ([]byte, error) {
// Hash all inputs
hash := fnv.New64a()
for _, v := range chain {
hash.Write(v)
}
hash.Write(pCommonSetHashes)
hash.Write(pCachedHashes)
hashRes := hash.Sum64()
compressedCertsCacheMutex.RLock()
result, isCached := compressedCertsCache[hashRes]
compressedCertsCacheMutex.RUnlock()
if isCached {
return result, nil
}
compressedCertsCacheMutex.Lock()
defer compressedCertsCacheMutex.Unlock()
result, isCached = compressedCertsCache[hashRes]
if isCached {
return result, nil
}
cached, err := compressChain(chain, pCommonSetHashes, pCachedHashes)
if err != nil {
return nil, err
}
compressedCertsCache[hashRes] = cached
return cached, nil
}