From f872a68906daadb6e96a2621b940aafc888f2bf9 Mon Sep 17 00:00:00 2001 From: William Petit Date: Mon, 12 Sep 2022 17:46:59 +0200 Subject: [PATCH] Return wrapped errors --- cmd/keygen/create_key.go | 7 ++++--- cmd/keygen/create_token.go | 5 +++-- cmd/keygen/get_public_key.go | 5 +++-- cmd/keygen/util.go | 19 +++++++++---------- crypto/pem.go | 12 +++++------- crypto/rsa.go | 5 +++-- go.mod | 1 + go.sum | 2 ++ 8 files changed, 30 insertions(+), 26 deletions(-) diff --git a/cmd/keygen/create_key.go b/cmd/keygen/create_key.go index de542f4..a566248 100644 --- a/cmd/keygen/create_key.go +++ b/cmd/keygen/create_key.go @@ -4,20 +4,21 @@ import ( "fmt" "forge.cadoles.com/Cadoles/go-http-peering/crypto" + "github.com/pkg/errors" ) func createKey() { passphrase, err := getPassphrase() if err != nil { - handleError(err) + handleError(errors.WithStack(err)) } key, err := crypto.CreateRSAKey(keySize) if err != nil { - handleError(err) + handleError(errors.WithStack(err)) } privatePEM, err := crypto.EncodePrivateKeyToEncryptedPEM(key, passphrase) if err != nil { - handleError(err) + handleError(errors.WithStack(err)) } fmt.Print(string(privatePEM)) } diff --git a/cmd/keygen/create_token.go b/cmd/keygen/create_token.go index a6e9021..040279c 100644 --- a/cmd/keygen/create_token.go +++ b/cmd/keygen/create_token.go @@ -4,6 +4,7 @@ import ( "fmt" "forge.cadoles.com/Cadoles/go-http-peering/crypto" + "github.com/pkg/errors" peering "forge.cadoles.com/Cadoles/go-http-peering" ) @@ -11,11 +12,11 @@ import ( func createToken() { privateKey, err := loadPrivateKey() if err != nil { - handleError(err) + handleError(errors.WithStack(err)) } token, err := crypto.CreateServerToken(privateKey, tokenIssuer, peering.PeerID(tokenPeerID)) if err != nil { - handleError(err) + handleError(errors.WithStack(err)) } fmt.Println(token) } diff --git a/cmd/keygen/get_public_key.go b/cmd/keygen/get_public_key.go index 81e10db..d24fcbd 100644 --- a/cmd/keygen/get_public_key.go +++ b/cmd/keygen/get_public_key.go @@ -4,16 +4,17 @@ import ( "fmt" "forge.cadoles.com/Cadoles/go-http-peering/crypto" + "github.com/pkg/errors" ) func getPublicKey() { privateKey, err := loadPrivateKey() if err != nil { - handleError(err) + handleError(errors.WithStack(err)) } publicPEM, err := crypto.EncodePublicKeyToPEM(privateKey.Public()) if err != nil { - handleError(err) + handleError(errors.WithStack(err)) } fmt.Print(string(publicPEM)) } diff --git a/cmd/keygen/util.go b/cmd/keygen/util.go index 76eb280..af63fdc 100644 --- a/cmd/keygen/util.go +++ b/cmd/keygen/util.go @@ -6,13 +6,13 @@ import ( "crypto/rsa" "crypto/x509" "encoding/pem" - "errors" "fmt" "io/ioutil" "os" "syscall" "forge.cadoles.com/Cadoles/go-http-peering/crypto" + "github.com/pkg/errors" "golang.org/x/crypto/ssh/terminal" ) @@ -29,14 +29,14 @@ func askPassphrase() ([]byte, error) { fmt.Print("Passphrase: ") passphrase, err := terminal.ReadPassword(syscall.Stdin) if err != nil { - return nil, err + return nil, errors.WithStack(err) } fmt.Println() fmt.Print("Confirm passphrase: ") passphraseConfirmation, err := terminal.ReadPassword(syscall.Stdin) if err != nil { - return nil, err + return nil, errors.WithStack(err) } fmt.Println() @@ -48,7 +48,6 @@ func askPassphrase() ([]byte, error) { } func privateKeyToEncryptedPEM(key *rsa.PrivateKey, passphrase []byte) ([]byte, error) { - if passphrase == nil { return nil, errors.New("passphrase cannot be empty") } @@ -61,7 +60,7 @@ func privateKeyToEncryptedPEM(key *rsa.PrivateKey, passphrase []byte) ([]byte, e block, err := x509.EncryptPEMBlock(rand.Reader, block.Type, block.Bytes, passphrase, x509.PEMCipherAES256) if err != nil { - return nil, err + return nil, errors.WithStack(err) } return pem.EncodeToMemory(block), nil @@ -73,24 +72,24 @@ func loadPrivateKey() (*rsa.PrivateKey, error) { } pem, err := ioutil.ReadFile(keyFile) if err != nil { - return nil, err + return nil, errors.WithStack(err) } passphrase, err := getPassphrase() if err != nil { - return nil, err + return nil, errors.WithStack(err) } privateKey, err := crypto.DecodePEMEncryptedPrivateKey(pem, passphrase) if err != nil { - return nil, err + return nil, errors.WithStack(err) } return privateKey, nil } func handleError(err error) { if !debug { - fmt.Println(err) + fmt.Printf("%+v\n", errors.WithStack(err)) } else { - panic(err) + panic(fmt.Sprintf("%+v", errors.WithStack(err))) } os.Exit(1) } diff --git a/crypto/pem.go b/crypto/pem.go index 3ee19c2..48119f9 100644 --- a/crypto/pem.go +++ b/crypto/pem.go @@ -6,15 +6,15 @@ import ( "crypto/rsa" "crypto/x509" "encoding/pem" - "errors" jwt "github.com/dgrijalva/jwt-go" + "github.com/pkg/errors" ) func EncodePublicKeyToPEM(key crypto.PublicKey) ([]byte, error) { pub, err := x509.MarshalPKIXPublicKey(key) if err != nil { - return nil, err + return nil, errors.WithStack(err) } data := pem.EncodeToMemory(&pem.Block{ Type: "PUBLIC KEY", @@ -28,8 +28,6 @@ func DecodePEMToPublicKey(pem []byte) (crypto.PublicKey, error) { } func DecodePEMEncryptedPrivateKey(key []byte, passphrase []byte) (*rsa.PrivateKey, error) { - var err error - // Parse PEM block var block *pem.Block if block, _ = pem.Decode(key); block == nil { @@ -38,12 +36,12 @@ func DecodePEMEncryptedPrivateKey(key []byte, passphrase []byte) (*rsa.PrivateKe decryptedBlock, err := x509.DecryptPEMBlock(block, passphrase) if err != nil { - return nil, err + return nil, errors.WithStack(err) } var parsedKey interface{} if parsedKey, err = x509.ParsePKCS1PrivateKey(decryptedBlock); err != nil { - return nil, err + return nil, errors.WithStack(err) } var privateKey *rsa.PrivateKey @@ -70,7 +68,7 @@ func EncodePrivateKeyToEncryptedPEM(key *rsa.PrivateKey, passphrase []byte) ([]b block.Bytes, passphrase, x509.PEMCipherAES256, ) if err != nil { - return nil, err + return nil, errors.WithStack(err) } return pem.EncodeToMemory(block), nil diff --git a/crypto/rsa.go b/crypto/rsa.go index c54aa29..88e4fa7 100644 --- a/crypto/rsa.go +++ b/crypto/rsa.go @@ -8,12 +8,13 @@ import ( peering "forge.cadoles.com/Cadoles/go-http-peering" jwt "github.com/dgrijalva/jwt-go" + "github.com/pkg/errors" ) func CreateRSAKey(bits int) (*rsa.PrivateKey, error) { key, err := rsa.GenerateKey(rand.Reader, bits) if err != nil { - return nil, err + return nil, errors.WithStack(err) } return key, nil } @@ -28,7 +29,7 @@ func CreateServerToken(privateKey *rsa.PrivateKey, issuer string, peerID peering }) tokenStr, err := token.SignedString(privateKey) if err != nil { - return "", err + return "", errors.WithStack(err) } return tokenStr, nil } diff --git a/go.mod b/go.mod index 101583e..3f841e3 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,7 @@ require ( require ( github.com/google/uuid v1.0.0 // indirect + github.com/pkg/errors v0.9.1 golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 // indirect golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 // indirect ) diff --git a/go.sum b/go.sum index 42b8549..41e41b3 100644 --- a/go.sum +++ b/go.sum @@ -6,6 +6,8 @@ github.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM= golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 h1:v6hYoSR9T5oet+pMXwUWkbiVqx/63mlHjefrHmxwfeY=