in client/clientutil.go [186:216]
func PrivateKeyForRSAFingerprint(kek *configpb.KekInfo, keys *configpb.AsymmetricKeys) (*rsa.PrivateKey, error) {
for _, path := range keys.GetPrivateKeyFiles() {
keyBytes, err := os.ReadFile(path)
if err != nil {
return nil, fmt.Errorf("failed to open private key file: %w", err)
}
block, _ := pem.Decode(keyBytes)
if block == nil || block.Type != "RSA PRIVATE KEY" {
return nil, fmt.Errorf("failed to decode PEM block containing RSA private key")
}
key, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return nil, fmt.Errorf("failed to parse PKCS1 private key from PEM: %v", err)
}
// Compute SHA-256 digest of the DER-encoded public key.
der, err := x509.MarshalPKIXPublicKey(&key.PublicKey)
if err != nil {
return nil, fmt.Errorf("failed to marshal public key from private key: %w", err)
}
sha := sha256.Sum256(der)
fingerprint := base64.StdEncoding.EncodeToString(sha[:])
if fingerprint == kek.GetRsaFingerprint() {
return key, nil
}
}
return nil, fmt.Errorf("no RSA private key found for fingerprint: %s", kek.GetRsaFingerprint())
}