| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- // +build !windows
- // +build !confonly
- package xtls
- import (
- "crypto/x509"
- "sync"
- )
- type rootCertsCache struct {
- sync.Mutex
- pool *x509.CertPool
- }
- func (c *rootCertsCache) load() (*x509.CertPool, error) {
- c.Lock()
- defer c.Unlock()
- if c.pool != nil {
- return c.pool, nil
- }
- pool, err := x509.SystemCertPool()
- if err != nil {
- return nil, err
- }
- c.pool = pool
- return pool, nil
- }
- var rootCerts rootCertsCache
- func (c *Config) getCertPool() (*x509.CertPool, error) {
- if c.DisableSystemRoot {
- return c.loadSelfCertPool()
- }
- if len(c.Certificate) == 0 {
- return rootCerts.load()
- }
- pool, err := x509.SystemCertPool()
- if err != nil {
- return nil, newError("system root").AtWarning().Base(err)
- }
- for _, cert := range c.Certificate {
- if !pool.AppendCertsFromPEM(cert.Certificate) {
- return nil, newError("append cert to root").AtWarning().Base(err)
- }
- }
- return pool, err
- }
|