github.com/xraypb/xray-core@v1.6.6/transport/internet/tls/pin.go (about) 1 package tls 2 3 import ( 4 "crypto/sha256" 5 "encoding/base64" 6 "encoding/pem" 7 ) 8 9 func CalculatePEMCertChainSHA256Hash(certContent []byte) string { 10 var certChain [][]byte 11 for { 12 block, remain := pem.Decode(certContent) 13 if block == nil { 14 break 15 } 16 certChain = append(certChain, block.Bytes) 17 certContent = remain 18 } 19 certChainHash := GenerateCertChainHash(certChain) 20 certChainHashB64 := base64.StdEncoding.EncodeToString(certChainHash) 21 return certChainHashB64 22 } 23 24 func GenerateCertChainHash(rawCerts [][]byte) []byte { 25 var hashValue []byte 26 for _, certValue := range rawCerts { 27 out := sha256.Sum256(certValue) 28 if hashValue == nil { 29 hashValue = out[:] 30 } else { 31 newHashValue := sha256.Sum256(append(hashValue, out[:]...)) 32 hashValue = newHashValue[:] 33 } 34 } 35 return hashValue 36 }