Add a utility function to return a public key ID from a certificate.

Signed-off-by: Ying Li <ying.li@docker.com>
This commit is contained in:
Ying Li
2015-10-20 19:38:39 -07:00
parent f417279d0d
commit ea7d621705
2 changed files with 55 additions and 0 deletions

View File

@@ -495,3 +495,26 @@ func NewCertificate(gun string) (*x509.Certificate, error) {
BasicConstraintsValid: true,
}, nil
}
// X509PublickeyID returns a public key ID as a string, given a
// data.PublicKey that contains an X509 Certificate
func X509PublickeyID(certPubKey data.PublicKey) (string, error) {
cert, err := LoadCertFromPEM(certPubKey.Public())
if err != nil {
return "", err
}
var finalAlgorithm data.KeyAlgorithm
switch certPubKey.Algorithm() {
case data.ECDSAx509Key:
finalAlgorithm = data.ECDSAKey
case data.RSAx509Key:
finalAlgorithm = data.RSAKey
}
pubKeyBytes, err := x509.MarshalPKIXPublicKey(cert.PublicKey)
if err != nil {
return "", err
}
return data.NewPublicKey(finalAlgorithm, pubKeyBytes).ID(), nil
}

View File

@@ -3,10 +3,12 @@ package trustmanager
import (
"crypto/rand"
"crypto/x509"
"io/ioutil"
"strings"
"testing"
"time"
"github.com/endophage/gotuf/data"
"github.com/stretchr/testify/assert"
)
@@ -144,3 +146,33 @@ func TestKeyOperations(t *testing.T) {
assert.Equal(t, rsaKey.Private(), decryptedRSAKey.Private())
}
// X509PublickeyID returns the public key ID of a cert rather than the cert ID
func TestRSAX509PublickeyID(t *testing.T) {
fileBytes, err := ioutil.ReadFile("../fixtures/notary-server.key")
assert.NoError(t, err)
privKey, err := ParsePEMPrivateKey(fileBytes, "")
assert.NoError(t, err)
expectedTufID := privKey.ID()
cert, err := LoadCertFromFile("../fixtures/notary-server.crt")
assert.NoError(t, err)
rsaKeyBytes, err := x509.MarshalPKIXPublicKey(cert.PublicKey)
assert.NoError(t, err)
sameWayTufID := data.NewPublicKey(data.RSAKey, rsaKeyBytes).ID()
actualTufKeyMap := CertsToKeys([]*x509.Certificate{cert})
assert.Len(t, actualTufKeyMap, 1)
var actualTufKey data.PublicKey
for _, v := range actualTufKeyMap {
actualTufKey = v
}
actualTufID, err := X509PublickeyID(actualTufKey)
assert.Equal(t, sameWayTufID, actualTufID)
assert.Equal(t, expectedTufID, actualTufID)
}