@ -7,10 +7,12 @@ import (
"crypto/x509"
"encoding/base64"
"encoding/pem"
"errors"
"fmt"
"strings"
"github.com/hashicorp/errwrap"
"golang.org/x/crypto/ssh"
"strings"
)
type PrivateKeySigner struct {
@ -27,23 +29,23 @@ func NewPrivateKeySigner(keyFingerprint string, privateKeyMaterial []byte, accou
block , _ := pem . Decode ( privateKeyMaterial )
if block == nil {
return nil , fmt. Errorf ( "Error PEM-decoding private key material: nil block received" )
return nil , errors. New ( "Error PEM-decoding private key material: nil block received" )
}
rsakey , err := x509 . ParsePKCS1PrivateKey ( block . Bytes )
if err != nil {
return nil , errwrap . Wrapf ( "Error parsing private key: %s ", err )
return nil , errwrap . Wrapf ( "Error parsing private key: {{err}} ", err )
}
sshPublicKey , err := ssh . NewPublicKey ( rsakey . Public ( ) )
if err != nil {
return nil , errwrap . Wrapf ( "Error parsing SSH key from private key: %s ", err )
return nil , errwrap . Wrapf ( "Error parsing SSH key from private key: {{err}} ", err )
}
matchKeyFingerprint := formatPublicKeyFingerprint ( sshPublicKey , false )
displayKeyFingerprint := formatPublicKeyFingerprint ( sshPublicKey , true )
if matchKeyFingerprint != keyFingerprintMD5 {
return nil , fmt. Errorf ( "Private key file does not match public key fingerprint" )
return nil , errors. New ( "Private key file does not match public key fingerprint" )
}
return & PrivateKeySigner {
@ -69,5 +71,6 @@ func (s *PrivateKeySigner) Sign(dateHeader string) (string, error) {
}
signedBase64 := base64 . StdEncoding . EncodeToString ( signed )
return fmt . Sprintf ( authorizationHeaderFormat , s . formattedKeyFingerprint , "rsa-sha1" , headerName , signedBase64 ) , nil
keyID := fmt . Sprintf ( "/%s/keys/%s" , s . accountName , s . formattedKeyFingerprint )
return fmt . Sprintf ( authorizationHeaderFormat , keyID , "rsa-sha1" , headerName , signedBase64 ) , nil
}