github.com/aliyun/aliyun-oss-go-sdk@v3.0.2+incompatible/oss/crypto/master_rsa_cipher.go (about) 1 package osscrypto 2 3 import ( 4 "crypto/rand" 5 "crypto/rsa" 6 "crypto/x509" 7 "encoding/asn1" 8 "encoding/json" 9 "encoding/pem" 10 "fmt" 11 ) 12 13 // CreateMasterRsa Create master key interface implemented by rsa 14 // matDesc will be converted to json string 15 func CreateMasterRsa(matDesc map[string]string, publicKey string, privateKey string) (MasterCipher, error) { 16 var masterCipher MasterRsaCipher 17 var jsonDesc string 18 if len(matDesc) > 0 { 19 b, err := json.Marshal(matDesc) 20 if err != nil { 21 return masterCipher, err 22 } 23 jsonDesc = string(b) 24 } 25 masterCipher.MatDesc = jsonDesc 26 masterCipher.PublicKey = publicKey 27 masterCipher.PrivateKey = privateKey 28 return masterCipher, nil 29 } 30 31 // MasterRsaCipher rsa master key interface 32 type MasterRsaCipher struct { 33 MatDesc string 34 PublicKey string 35 PrivateKey string 36 } 37 38 // GetWrapAlgorithm get master key wrap algorithm 39 func (mrc MasterRsaCipher) GetWrapAlgorithm() string { 40 return RsaCryptoWrap 41 } 42 43 // GetMatDesc get master key describe 44 func (mrc MasterRsaCipher) GetMatDesc() string { 45 return mrc.MatDesc 46 } 47 48 // Encrypt encrypt data by rsa public key 49 // Mainly used to encrypt object's symmetric secret key and iv 50 func (mrc MasterRsaCipher) Encrypt(plainData []byte) ([]byte, error) { 51 block, _ := pem.Decode([]byte(mrc.PublicKey)) 52 if block == nil { 53 return nil, fmt.Errorf("pem.Decode public key error") 54 } 55 56 var pub *rsa.PublicKey 57 if block.Type == "PUBLIC KEY" { 58 // pks8 format 59 pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes) 60 if err != nil { 61 return nil, err 62 } 63 pub = pubInterface.(*rsa.PublicKey) 64 } else if block.Type == "RSA PUBLIC KEY" { 65 // pks1 format 66 pub = &rsa.PublicKey{} 67 _, err := asn1.Unmarshal(block.Bytes, pub) 68 if err != nil { 69 return nil, err 70 } 71 } else { 72 return nil, fmt.Errorf("not supported public key,type:%s", block.Type) 73 } 74 return rsa.EncryptPKCS1v15(rand.Reader, pub, plainData) 75 } 76 77 // Decrypt Decrypt data by rsa private key 78 // Mainly used to decrypt object's symmetric secret key and iv 79 func (mrc MasterRsaCipher) Decrypt(cryptoData []byte) ([]byte, error) { 80 block, _ := pem.Decode([]byte(mrc.PrivateKey)) 81 if block == nil { 82 return nil, fmt.Errorf("pem.Decode private key error") 83 } 84 85 if block.Type == "PRIVATE KEY" { 86 // pks8 format 87 privInterface, err := x509.ParsePKCS8PrivateKey(block.Bytes) 88 if err != nil { 89 return nil, err 90 } 91 return rsa.DecryptPKCS1v15(rand.Reader, privInterface.(*rsa.PrivateKey), cryptoData) 92 } else if block.Type == "RSA PRIVATE KEY" { 93 // pks1 format 94 priv, err := x509.ParsePKCS1PrivateKey(block.Bytes) 95 if err != nil { 96 return nil, err 97 } 98 return rsa.DecryptPKCS1v15(rand.Reader, priv, cryptoData) 99 } else { 100 return nil, fmt.Errorf("not supported private key,type:%s", block.Type) 101 } 102 }