mirror of https://github.com/docker/docs.git
				
				
				
			
		
			
				
	
	
		
			303 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			303 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Go
		
	
	
	
package trustmanager
 | 
						|
 | 
						|
import (
 | 
						|
	"crypto/x509"
 | 
						|
	"encoding/pem"
 | 
						|
	"io/ioutil"
 | 
						|
	"testing"
 | 
						|
)
 | 
						|
 | 
						|
func TestAddCert(t *testing.T) {
 | 
						|
	// Read certificate from file
 | 
						|
	b, err := ioutil.ReadFile("../fixtures/root-ca.crt")
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("couldn't load fixture: %v", err)
 | 
						|
	}
 | 
						|
	// Decode PEM block
 | 
						|
	var block *pem.Block
 | 
						|
	block, _ = pem.Decode(b)
 | 
						|
 | 
						|
	// Load X509 Certificate
 | 
						|
	cert, err := x509.ParseCertificate(block.Bytes)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("couldn't parse certificate: %v", err)
 | 
						|
	}
 | 
						|
	// Create a Store and add the certificate to it
 | 
						|
	store := NewX509MemStore()
 | 
						|
	err = store.AddCert(cert)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("failed to load certificate: %v", err)
 | 
						|
	}
 | 
						|
	// Retrieve all the certificates
 | 
						|
	certs := store.GetCertificates()
 | 
						|
	// Check to see if certificate is present and total number of certs is correct
 | 
						|
	numCerts := len(certs)
 | 
						|
	if numCerts != 1 {
 | 
						|
		t.Fatalf("unexpected number of certificates in store: %d", numCerts)
 | 
						|
	}
 | 
						|
	if certs[0] != cert {
 | 
						|
		t.Fatalf("expected certificates to be the same")
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestAddCertFromFile(t *testing.T) {
 | 
						|
	store := NewX509MemStore()
 | 
						|
	err := store.AddCertFromFile("../fixtures/root-ca.crt")
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("failed to load certificate from file: %v", err)
 | 
						|
	}
 | 
						|
	numCerts := len(store.GetCertificates())
 | 
						|
	if numCerts != 1 {
 | 
						|
		t.Fatalf("unexpected number of certificates in store: %d", numCerts)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestAddCertFromPEM(t *testing.T) {
 | 
						|
	b, err := ioutil.ReadFile("../fixtures/root-ca.crt")
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("couldn't load fixture: %v", err)
 | 
						|
	}
 | 
						|
 | 
						|
	store := NewX509MemStore()
 | 
						|
	err = store.AddCertFromPEM(b)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("failed to load certificate from PEM: %v", err)
 | 
						|
	}
 | 
						|
	numCerts := len(store.GetCertificates())
 | 
						|
	if numCerts != 1 {
 | 
						|
		t.Fatalf("unexpected number of certificates in store: %d", numCerts)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestRemoveCert(t *testing.T) {
 | 
						|
	b, err := ioutil.ReadFile("../fixtures/root-ca.crt")
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("couldn't load fixture: %v", err)
 | 
						|
	}
 | 
						|
	var block *pem.Block
 | 
						|
	block, _ = pem.Decode(b)
 | 
						|
 | 
						|
	cert, err := x509.ParseCertificate(block.Bytes)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("couldn't parse certificate: %v", err)
 | 
						|
	}
 | 
						|
 | 
						|
	store := NewX509MemStore()
 | 
						|
	err = store.AddCert(cert)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("failed to load certificate: %v", err)
 | 
						|
	}
 | 
						|
 | 
						|
	// Number of certificates should be 1 since we added the cert
 | 
						|
	numCerts := len(store.GetCertificates())
 | 
						|
	if numCerts != 1 {
 | 
						|
		t.Fatalf("unexpected number of certificates in store: %d", numCerts)
 | 
						|
	}
 | 
						|
 | 
						|
	// Remove the cert from the store
 | 
						|
	err = store.RemoveCert(cert)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("failed to remove certificate: %v", err)
 | 
						|
	}
 | 
						|
	// Number of certificates should be 0 since we added and removed the cert
 | 
						|
	numCerts = len(store.GetCertificates())
 | 
						|
	if numCerts != 0 {
 | 
						|
		t.Fatalf("unexpected number of certificates in store: %d", numCerts)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestRemoveAllX509MemStore(t *testing.T) {
 | 
						|
	// Add three certificates to store
 | 
						|
	store := NewX509MemStore()
 | 
						|
	certFiles := [3]string{"../fixtures/root-ca.crt",
 | 
						|
		"../fixtures/intermediate-ca.crt",
 | 
						|
		"../fixtures/secure.example.com.crt"}
 | 
						|
	for _, file := range certFiles {
 | 
						|
		b, err := ioutil.ReadFile(file)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatalf("couldn't load fixture: %v", err)
 | 
						|
		}
 | 
						|
		var block *pem.Block
 | 
						|
		block, _ = pem.Decode(b)
 | 
						|
 | 
						|
		cert, err := x509.ParseCertificate(block.Bytes)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatalf("couldn't parse certificate: %v", err)
 | 
						|
		}
 | 
						|
		err = store.AddCert(cert)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatalf("failed to load certificate: %v", err)
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	// Number of certificates should be 3 since we added the cert
 | 
						|
	numCerts := len(store.GetCertificates())
 | 
						|
	if numCerts != 3 {
 | 
						|
		t.Fatalf("unexpected number of certificates in store: %d", numCerts)
 | 
						|
	}
 | 
						|
 | 
						|
	// Remove the cert from the store
 | 
						|
	err := store.RemoveAll()
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("failed to remove all certificates: %v", err)
 | 
						|
	}
 | 
						|
	// Number of certificates should be 0 since we added and removed the cert
 | 
						|
	numCerts = len(store.GetCertificates())
 | 
						|
	if numCerts != 0 {
 | 
						|
		t.Fatalf("unexpected number of certificates in store: %d", numCerts)
 | 
						|
	}
 | 
						|
}
 | 
						|
func TestInexistentGetCertificateByCertID(t *testing.T) {
 | 
						|
	store := NewX509MemStore()
 | 
						|
	err := store.AddCertFromFile("../fixtures/root-ca.crt")
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("failed to load certificate from file: %v", err)
 | 
						|
	}
 | 
						|
 | 
						|
	_, err = store.GetCertificateByCertID("4d06afd30b8bed131d2a84c97d00b37f422021598bfae34285ce98e77b708b5a")
 | 
						|
	if err == nil {
 | 
						|
		t.Fatalf("no error returned for inexistent certificate")
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestGetCertificateByKeyID(t *testing.T) {
 | 
						|
	b, err := ioutil.ReadFile("../fixtures/root-ca.crt")
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("couldn't load fixture: %v", err)
 | 
						|
	}
 | 
						|
	var block *pem.Block
 | 
						|
	block, _ = pem.Decode(b)
 | 
						|
 | 
						|
	cert, err := x509.ParseCertificate(block.Bytes)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("couldn't parse certificate: %v", err)
 | 
						|
	}
 | 
						|
 | 
						|
	store := NewX509MemStore()
 | 
						|
	err = store.AddCert(cert)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("failed to load certificate from PEM: %v", err)
 | 
						|
	}
 | 
						|
 | 
						|
	certID, err := FingerprintCert(cert)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("failed to fingerprint the certificate: %v", err)
 | 
						|
	}
 | 
						|
 | 
						|
	// Tries to retrieve cert by Subject Key IDs
 | 
						|
	_, err = store.GetCertificateByCertID(certID)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("expected certificate in store: %s", certID)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestGetVerifyOpsErrorsWithoutCerts(t *testing.T) {
 | 
						|
	// Create empty Store
 | 
						|
	store := NewX509MemStore()
 | 
						|
 | 
						|
	// Try to get VerifyOptions without certs added
 | 
						|
	_, err := store.GetVerifyOptions("example.com")
 | 
						|
	if err == nil {
 | 
						|
		t.Fatalf("expecting an error when getting empty VerifyOptions")
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestVerifyLeafCertFromIntermediate(t *testing.T) {
 | 
						|
	// Create a store and add a root
 | 
						|
	store := NewX509MemStore()
 | 
						|
	err := store.AddCertFromFile("../fixtures/intermediate-ca.crt")
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("failed to load certificate from file: %v", err)
 | 
						|
	}
 | 
						|
 | 
						|
	// Get the VerifyOptions from our Store
 | 
						|
	opts, err := store.GetVerifyOptions("secure.example.com")
 | 
						|
 | 
						|
	// Get leaf certificate
 | 
						|
	b, err := ioutil.ReadFile("../fixtures/secure.example.com.crt")
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("couldn't load fixture: %v", err)
 | 
						|
	}
 | 
						|
	var block *pem.Block
 | 
						|
	block, _ = pem.Decode(b)
 | 
						|
 | 
						|
	cert, err := x509.ParseCertificate(block.Bytes)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("couldn't parse certificate: %v", err)
 | 
						|
	}
 | 
						|
 | 
						|
	// Try to find a valid chain for cert
 | 
						|
	_, err = cert.Verify(opts)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("couldn't find a valid chain for this certificate: %v", err)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestVerifyIntermediateFromRoot(t *testing.T) {
 | 
						|
	// Create a store and add a root
 | 
						|
	store := NewX509MemStore()
 | 
						|
	err := store.AddCertFromFile("../fixtures/root-ca.crt")
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("failed to load certificate from file: %v", err)
 | 
						|
	}
 | 
						|
 | 
						|
	// Get the VerifyOptions from our Store
 | 
						|
	opts, err := store.GetVerifyOptions("Notary Testing CA")
 | 
						|
 | 
						|
	// Get leaf certificate
 | 
						|
	b, err := ioutil.ReadFile("../fixtures/intermediate-ca.crt")
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("couldn't load fixture: %v", err)
 | 
						|
	}
 | 
						|
	var block *pem.Block
 | 
						|
	block, _ = pem.Decode(b)
 | 
						|
 | 
						|
	cert, err := x509.ParseCertificate(block.Bytes)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("couldn't parse certificate: %v", err)
 | 
						|
	}
 | 
						|
 | 
						|
	// Try to find a valid chain for cert
 | 
						|
	_, err = cert.Verify(opts)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("couldn't find a valid chain for this certificate: %v", err)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestNewX509FilteredMemStore(t *testing.T) {
 | 
						|
	store := NewX509FilteredMemStore(func(cert *x509.Certificate) bool {
 | 
						|
		return cert.IsCA
 | 
						|
	})
 | 
						|
 | 
						|
	// AddCert should succeed because this is a CA being added
 | 
						|
	err := store.AddCertFromFile("../fixtures/root-ca.crt")
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("failed to load certificate from file: %v", err)
 | 
						|
	}
 | 
						|
	numCerts := len(store.GetCertificates())
 | 
						|
	if numCerts != 1 {
 | 
						|
		t.Fatalf("unexpected number of certificates in store: %d", numCerts)
 | 
						|
	}
 | 
						|
 | 
						|
	// AddCert should fail because this is a leaf cert being added
 | 
						|
	err = store.AddCertFromFile("../fixtures/secure.example.com.crt")
 | 
						|
	if err == nil {
 | 
						|
		t.Fatalf("was expecting non-CA certificate to be rejected")
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestGetCertificatePool(t *testing.T) {
 | 
						|
	// Create a store and add a root
 | 
						|
	store := NewX509MemStore()
 | 
						|
	err := store.AddCertFromFile("../fixtures/root-ca.crt")
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("failed to load certificate from file: %v", err)
 | 
						|
	}
 | 
						|
 | 
						|
	pool := store.GetCertificatePool()
 | 
						|
	numCerts := len(pool.Subjects())
 | 
						|
	if numCerts != 1 {
 | 
						|
		t.Fatalf("unexpected number of certificates in pool: %d", numCerts)
 | 
						|
	}
 | 
						|
}
 |