Skip to content

Commit

Permalink
crypto/x509: add CertPool.Equal
Browse files Browse the repository at this point in the history
Fixes #46057

Change-Id: Id3af101c54108d6fd5b65946c4358872358eefcc
Reviewed-on: https://go-review.googlesource.com/c/go/+/388915
Trust: Roland Shoemaker <[email protected]>
Run-TryBot: Roland Shoemaker <[email protected]>
TryBot-Result: Gopher Robot <[email protected]>
Reviewed-by: Damien Neil <[email protected]>
  • Loading branch information
rolandshoemaker committed Apr 5, 2022
1 parent cd33b40 commit 4aacb7f
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 0 deletions.
13 changes: 13 additions & 0 deletions src/crypto/x509/cert_pool.go
Original file line number Diff line number Diff line change
Expand Up @@ -249,3 +249,16 @@ func (s *CertPool) Subjects() [][]byte {
}
return res
}

// Equal reports whether s and other are equal.
func (s *CertPool) Equal(other *CertPool) bool {
if s.systemPool != other.systemPool || len(s.haveSum) != len(other.haveSum) {
return false
}
for h := range s.haveSum {
if !other.haveSum[h] {
return false
}
}
return true
}
58 changes: 58 additions & 0 deletions src/crypto/x509/cert_pool_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
// Copyright 2022 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package x509

import "testing"

func TestCertPoolEqual(t *testing.T) {
a, b := NewCertPool(), NewCertPool()
if !a.Equal(b) {
t.Error("two empty pools not equal")
}

tc := &Certificate{Raw: []byte{1, 2, 3}, RawSubject: []byte{2}}
a.AddCert(tc)
if a.Equal(b) {
t.Error("empty pool equals non-empty pool")
}

b.AddCert(tc)
if !a.Equal(b) {
t.Error("two non-empty pools not equal")
}

otherTC := &Certificate{Raw: []byte{9, 8, 7}, RawSubject: []byte{8}}
a.AddCert(otherTC)
if a.Equal(b) {
t.Error("non-equal pools equal")
}

systemA, err := SystemCertPool()
if err != nil {
t.Fatalf("unable to load system cert pool: %s", err)
}
systemB, err := SystemCertPool()
if err != nil {
t.Fatalf("unable to load system cert pool: %s", err)
}
if !systemA.Equal(systemB) {
t.Error("two empty system pools not equal")
}

systemA.AddCert(tc)
if systemA.Equal(systemB) {
t.Error("empty system pool equals non-empty system pool")
}

systemB.AddCert(tc)
if !systemA.Equal(systemB) {
t.Error("two non-empty system pools not equal")
}

systemA.AddCert(otherTC)
if systemA.Equal(systemB) {
t.Error("non-equal system pools equal")
}
}

0 comments on commit 4aacb7f

Please sign in to comment.