rsa_utils.go (2418B)
1 package jwt 2 3 import ( 4 "crypto/rsa" 5 "crypto/x509" 6 "encoding/pem" 7 "errors" 8 ) 9 10 var ( 11 ErrKeyMustBePEMEncoded = errors.New("Invalid Key: Key must be a PEM encoded PKCS1 or PKCS8 key") 12 ErrNotRSAPrivateKey = errors.New("Key is not a valid RSA private key") 13 ErrNotRSAPublicKey = errors.New("Key is not a valid RSA public key") 14 ) 15 16 // Parse PEM encoded PKCS1 or PKCS8 private key 17 func ParseRSAPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error) { 18 var err error 19 20 // Parse PEM block 21 var block *pem.Block 22 if block, _ = pem.Decode(key); block == nil { 23 return nil, ErrKeyMustBePEMEncoded 24 } 25 26 var parsedKey interface{} 27 if parsedKey, err = x509.ParsePKCS1PrivateKey(block.Bytes); err != nil { 28 if parsedKey, err = x509.ParsePKCS8PrivateKey(block.Bytes); err != nil { 29 return nil, err 30 } 31 } 32 33 var pkey *rsa.PrivateKey 34 var ok bool 35 if pkey, ok = parsedKey.(*rsa.PrivateKey); !ok { 36 return nil, ErrNotRSAPrivateKey 37 } 38 39 return pkey, nil 40 } 41 42 // Parse PEM encoded PKCS1 or PKCS8 private key protected with password 43 func ParseRSAPrivateKeyFromPEMWithPassword(key []byte, password string) (*rsa.PrivateKey, error) { 44 var err error 45 46 // Parse PEM block 47 var block *pem.Block 48 if block, _ = pem.Decode(key); block == nil { 49 return nil, ErrKeyMustBePEMEncoded 50 } 51 52 var parsedKey interface{} 53 54 var blockDecrypted []byte 55 if blockDecrypted, err = x509.DecryptPEMBlock(block, []byte(password)); err != nil { 56 return nil, err 57 } 58 59 if parsedKey, err = x509.ParsePKCS1PrivateKey(blockDecrypted); err != nil { 60 if parsedKey, err = x509.ParsePKCS8PrivateKey(blockDecrypted); err != nil { 61 return nil, err 62 } 63 } 64 65 var pkey *rsa.PrivateKey 66 var ok bool 67 if pkey, ok = parsedKey.(*rsa.PrivateKey); !ok { 68 return nil, ErrNotRSAPrivateKey 69 } 70 71 return pkey, nil 72 } 73 74 // Parse PEM encoded PKCS1 or PKCS8 public key 75 func ParseRSAPublicKeyFromPEM(key []byte) (*rsa.PublicKey, error) { 76 var err error 77 78 // Parse PEM block 79 var block *pem.Block 80 if block, _ = pem.Decode(key); block == nil { 81 return nil, ErrKeyMustBePEMEncoded 82 } 83 84 // Parse the key 85 var parsedKey interface{} 86 if parsedKey, err = x509.ParsePKIXPublicKey(block.Bytes); err != nil { 87 if cert, err := x509.ParseCertificate(block.Bytes); err == nil { 88 parsedKey = cert.PublicKey 89 } else { 90 return nil, err 91 } 92 } 93 94 var pkey *rsa.PublicKey 95 var ok bool 96 if pkey, ok = parsedKey.(*rsa.PublicKey); !ok { 97 return nil, ErrNotRSAPublicKey 98 } 99 100 return pkey, nil 101 }