| Total Complexity | 66 |
| Total Lines | 275 |
| Duplicated Lines | 0 % |
| Changes | 1 | ||
| Bugs | 0 | Features | 0 |
Complex classes like EncryptionUtil often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use EncryptionUtil, and based on these observations, apply Extract Interface, too.
| 1 | <?php |
||
| 2 | class EncryptionUtil{ |
||
| 3 | public static $INSTRUCTION_SUFFIX = ".instruction"; |
||
| 4 | public static function genereateOnceUsedKey($length=32){ |
||
| 5 | $randpwd = ""; |
||
| 6 | for ($i = 0; $i < $length; $i++) |
||
| 7 | { |
||
| 8 | $randpwd .= chr(mt_rand(33, 126)); |
||
| 9 | } |
||
| 10 | return $randpwd; |
||
| 11 | } |
||
| 12 | public static function encode_AES_ECB($data,$secret_key){ |
||
| 13 | $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128,'',MCRYPT_MODE_ECB,''); |
||
| 14 | |||
| 15 | $blocksize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_ECB); |
||
| 16 | $pad = $blocksize - (strlen($data) % $blocksize); |
||
| 17 | $data = $data . str_repeat(chr($pad), $pad); |
||
| 18 | |||
| 19 | $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND); |
||
| 20 | mcrypt_generic_init($td,$secret_key,$iv); |
||
| 21 | $encrypted = mcrypt_generic($td,$data); |
||
| 22 | mcrypt_generic_deinit($td); |
||
| 23 | return $encrypted; |
||
| 24 | } |
||
| 25 | public static function decode_AES_ECB($data,$secret_key){ |
||
| 26 | $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128,'',MCRYPT_MODE_ECB,''); |
||
| 27 | $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND); |
||
| 28 | mcrypt_generic_init($td,$secret_key,$iv); |
||
| 29 | $data = mdecrypt_generic($td,$data); |
||
| 30 | mcrypt_generic_deinit($td); |
||
| 31 | mcrypt_module_close($td); |
||
| 32 | |||
| 33 | $dec_s = strlen($data); |
||
| 34 | $padding = ord($data[$dec_s-1]); |
||
| 35 | $data = substr($data, 0, -$padding); |
||
| 36 | |||
| 37 | return trim($data); |
||
| 38 | } |
||
| 39 | public static function getKeyEncryptionAlgm($encryptionMaterials){ |
||
| 40 | if(is_array($encryptionMaterials)){ |
||
| 41 | return "RSA"; |
||
| 42 | }else{ |
||
| 43 | return "AES"; |
||
| 44 | } |
||
| 45 | } |
||
| 46 | public static function getAdjustedRange($range,$blocksize){ |
||
| 47 | $a = $range["start"]; |
||
| 48 | $b = $range["end"]; |
||
| 49 | $a = $a - ($a%$blocksize)-$blocksize; |
||
| 50 | if($a < 0) |
||
| 51 | $a = 0; |
||
| 52 | |||
| 53 | $b = $b+$blocksize-$b%$blocksize+$blocksize; |
||
| 54 | |||
| 55 | return array("start"=>$a,"end"=>$b); |
||
| 56 | } |
||
| 57 | public static function encodeCek($encryptionMaterials,$cek){ |
||
| 58 | $encrypKeyAlg = EncryptionUtil::getKeyEncryptionAlgm($encryptionMaterials); |
||
| 59 | if($encrypKeyAlg === "AES"){ |
||
| 60 | $secretKey = $encryptionMaterials; |
||
| 61 | $encryptedSek = EncryptionUtil::encode_AES_ECB($cek,$secretKey); |
||
| 62 | if(empty($encryptedSek)) |
||
| 63 | throw new Ks3ClientException("can not encode cek useing AES"); |
||
| 64 | }else if($encrypKeyAlg === "RSA"){ |
||
| 65 | $encryptedSek = ""; |
||
| 66 | openssl_public_encrypt($cek,$encryptedSek, $encryptionMaterials[0]); |
||
| 67 | if(empty($encryptedSek)) |
||
| 68 | throw new Ks3ClientException("can not encode cek useing RSA"); |
||
| 69 | } |
||
| 70 | return $encryptedSek; |
||
|
|
|||
| 71 | } |
||
| 72 | public static function decodeCek($encryptionMaterials,$cekEncrypted){ |
||
| 73 | $encrypKeyAlg = EncryptionUtil::getKeyEncryptionAlgm($encryptionMaterials); |
||
| 74 | if($encrypKeyAlg === "AES"){ |
||
| 75 | $secretKey = $encryptionMaterials; |
||
| 76 | $cek = EncryptionUtil::decode_AES_ECB($cekEncrypted,$secretKey); |
||
| 77 | if(empty($cek)) |
||
| 78 | throw new Ks3ClientException("can not decode cek useing AES,secret key maybe not correct"); |
||
| 79 | }else if($encrypKeyAlg === "RSA"){ |
||
| 80 | $cek = ""; |
||
| 81 | openssl_private_decrypt($cekEncrypted,$cek, $encryptionMaterials[1]); |
||
| 82 | if(empty($cek)) |
||
| 83 | throw new Ks3ClientException("can not decode cek useing RSA,public/private key pair maybe not correct"); |
||
| 84 | } |
||
| 85 | return $cek; |
||
| 86 | } |
||
| 87 | public static function getPKCS5EncrypedLength($length,$blocksize){ |
||
| 88 | $pad = $blocksize - $length%$blocksize; |
||
| 89 | return $length+$pad; |
||
| 90 | } |
||
| 91 | //pkcs5填充 |
||
| 92 | public static function PKCS5Padding($data,$blocksize){ |
||
| 93 | $pad = $blocksize - strlen($data)%$blocksize; |
||
| 94 | for($i = 0;$i < $pad;$i++){ |
||
| 95 | $data.= chr($pad); |
||
| 96 | } |
||
| 97 | return $data; |
||
| 98 | } |
||
| 99 | public static function updateContentMD5Header($req){ |
||
| 100 | if(!is_array($req)) |
||
| 101 | return $req; |
||
| 102 | if(isset($req["ObjectMeta"])){ |
||
| 103 | $meta = $req["ObjectMeta"]; |
||
| 104 | }else{ |
||
| 105 | return $req; |
||
| 106 | } |
||
| 107 | if(is_array($meta) && isset($meta["Content-MD5"])){ |
||
| 108 | $md5 = $meta["Content-MD5"]; |
||
| 109 | }else{ |
||
| 110 | return $req; |
||
| 111 | } |
||
| 112 | if(empty($md5)){ |
||
| 113 | return $req; |
||
| 114 | }else{ |
||
| 115 | $req["ObjectMeta"]["Content-MD5"] = NULL; |
||
| 116 | $req["UserMeta"]["x-kss-meta-x-kss-unencrypted-content-md5"] = $md5; |
||
| 117 | } |
||
| 118 | return $req; |
||
| 119 | } |
||
| 120 | public static function metaTextLength($req){ |
||
| 121 | if(!is_array($req)) |
||
| 122 | return -1; |
||
| 123 | if(isset($req["ObjectMeta"])){ |
||
| 124 | $meta = $req["ObjectMeta"]; |
||
| 125 | }else{ |
||
| 126 | return -1; |
||
| 127 | } |
||
| 128 | if(is_array($meta) && isset($meta["Content-Length"])){ |
||
| 129 | $length = $meta["Content-Length"]; |
||
| 130 | return $length; |
||
| 131 | }else |
||
| 132 | return -1; |
||
| 133 | } |
||
| 134 | public static function plainTextLength($args){ |
||
| 135 | if(isset($args["Content"])){ |
||
| 136 | if(is_array($args["Content"])){ |
||
| 137 | $content = $args["Content"]["content"]; |
||
| 138 | $seek_position = 0; |
||
| 139 | $resourceLength = 0; |
||
| 140 | $length = -1; |
||
| 141 | $isFile = FALSE; |
||
| 142 | |||
| 143 | if (!is_resource($content)){ |
||
| 144 | $isFile = TRUE; |
||
| 145 | //如果之前用户已经转化为GBK则不转换 |
||
| 146 | if(Utils::chk_chinese($content)&&!Utils::check_char($content)){ |
||
| 147 | $content = iconv('utf-8','gbk',$content); |
||
| 148 | } |
||
| 149 | if(!file_exists($content)) |
||
| 150 | throw new Ks3ClientException("the specified file does not exist "); |
||
| 151 | $length = Utils::getFileSize($content); |
||
| 152 | $content = fopen($content,"r"); |
||
| 153 | }else{ |
||
| 154 | $stats = fstat($content); |
||
| 155 | if ($stats && $stats["size"] >= 0){ |
||
| 156 | $length = $stats["size"]; |
||
| 157 | } |
||
| 158 | } |
||
| 159 | $resourceLength = $length; |
||
| 160 | //优先取用户设置seek_position,没有的话取ftell |
||
| 161 | if(isset($args["Content"]["seek_position"])&&$args["Content"]["seek_position"]>0){ |
||
| 162 | $seek_position = $args["Content"]["seek_position"]; |
||
| 163 | }else if(!$isFile){ |
||
| 164 | $seek_position = ftell($content); |
||
| 165 | if($seek_position<0) |
||
| 166 | $seek_position = 0; |
||
| 167 | fseek($content,0); |
||
| 168 | } |
||
| 169 | |||
| 170 | $lengthInMeta = -1; |
||
| 171 | if(isset($args["ObjectMeta"]["Content-Length"])){ |
||
| 172 | $lengthInMeta = $args["ObjectMeta"]["Content-Length"]; |
||
| 173 | } |
||
| 174 | if($lengthInMeta > 0){ |
||
| 175 | $length = $lengthInMeta; |
||
| 176 | }else if($resourceLength > 0){ |
||
| 177 | //根据seek_position计算实际长度 |
||
| 178 | $length = $resourceLength - $seek_position; |
||
| 179 | } |
||
| 180 | if($length <= 0) |
||
| 181 | throw new Ks3ClientException("calculate content length failed,unexpected contetn length ".$length); |
||
| 182 | return $length; |
||
| 183 | }else{ |
||
| 184 | $content = $args["Content"]; |
||
| 185 | $lengthInMeta = EncryptionUtil::metaTextLength($args); |
||
| 186 | $length = strlen($content); |
||
| 187 | if($length<$lengthInMeta||$lengthInMeta <= 0) |
||
| 188 | return $length; |
||
| 189 | else |
||
| 190 | return $lengthInMeta; |
||
| 191 | } |
||
| 192 | } |
||
| 193 | return -1; |
||
| 194 | } |
||
| 195 | public static function initMultipartUploadContext($initResult,$iv,$cek,$encryptedCek,$matdesc="{}"){ |
||
| 196 | $cacheDir = KS3_API_PATH.DIRECTORY_SEPARATOR."cache".DIRECTORY_SEPARATOR; |
||
| 197 | $encryptionDir = KS3_API_PATH.DIRECTORY_SEPARATOR."cache".DIRECTORY_SEPARATOR."encryption".DIRECTORY_SEPARATOR; |
||
| 198 | if(!is_dir($cacheDir)) |
||
| 199 | mkdir($cacheDir); |
||
| 200 | if(!is_dir($encryptionDir)) |
||
| 201 | mkdir($encryptionDir); |
||
| 202 | if(is_array($matdesc)){ |
||
| 203 | $matdesc = json_encode($matdesc); |
||
| 204 | } |
||
| 205 | $initResult["firstIv"] = base64_encode($iv); |
||
| 206 | $initResult["nextIv"] = base64_encode($iv); |
||
| 207 | $initResult["cek"] = base64_encode($cek); |
||
| 208 | $initResult["encryptedCek"] = base64_encode($encryptedCek); |
||
| 209 | $initResult["lastPart"] = FALSE; |
||
| 210 | $initResult["matdesc"] = $matdesc; |
||
| 211 | $json = json_encode($initResult); |
||
| 212 | $file = EncryptionUtil::openfile($encryptionDir.$initResult["UploadId"], "w"); |
||
| 213 | fwrite($file, $json); |
||
| 214 | fclose($file); |
||
| 215 | } |
||
| 216 | public static function updateMultipartUploadContext($UploadId,$iv,$lastPart = FALSE){ |
||
| 217 | $encryptionDir = KS3_API_PATH.DIRECTORY_SEPARATOR."cache".DIRECTORY_SEPARATOR."encryption".DIRECTORY_SEPARATOR; |
||
| 218 | $content = EncryptionUtil::getMultipartUploadContext($UploadId); |
||
| 219 | $content["nextIv"] = base64_encode($iv); |
||
| 220 | $content["lastPart"] = $lastPart; |
||
| 221 | $json = json_encode($content); |
||
| 222 | $file = EncryptionUtil::openfile($encryptionDir.$UploadId, "w"); |
||
| 223 | fwrite($file, $json); |
||
| 224 | fclose($file); |
||
| 225 | } |
||
| 226 | public static function getMultipartUploadContext($UploadId){ |
||
| 227 | $encryptionDir = KS3_API_PATH.DIRECTORY_SEPARATOR."cache".DIRECTORY_SEPARATOR."encryption".DIRECTORY_SEPARATOR; |
||
| 228 | if(!EncryptionUtil::multipartUploadContextExists($UploadId)) |
||
| 229 | throw new Ks3ClientException("can not found multipart upload context in cache dir"); |
||
| 230 | $jsonString = file_get_contents($encryptionDir.$UploadId); |
||
| 231 | $arry = json_decode($jsonString,TRUE); |
||
| 232 | return $arry; |
||
| 233 | } |
||
| 234 | public static function deleteMultipartUploadContext($UploadId){ |
||
| 235 | $encryptionDir = KS3_API_PATH.DIRECTORY_SEPARATOR."cache".DIRECTORY_SEPARATOR."encryption".DIRECTORY_SEPARATOR; |
||
| 236 | @unlink($encryptionDir.$UploadId); |
||
| 237 | } |
||
| 238 | public static function multipartUploadContextExists($UploadId){ |
||
| 239 | $encryptionDir = KS3_API_PATH.DIRECTORY_SEPARATOR."cache".DIRECTORY_SEPARATOR."encryption".DIRECTORY_SEPARATOR; |
||
| 240 | return file_exists($encryptionDir.$UploadId); |
||
| 241 | } |
||
| 242 | public static function openfile($path,$mode){ |
||
| 248 | } |
||
| 249 | //matdesc为字符串或array数据类型。 |
||
| 250 | public static function createInstructionFile($bucket,$key,$cek,$iv,$matdesc="{}"){ |
||
| 251 | if(is_array($matdesc)){ |
||
| 252 | $matdesc = json_encode($matdesc); |
||
| 253 | } |
||
| 254 | $key = $key.EncryptionUtil::$INSTRUCTION_SUFFIX; |
||
| 255 | |||
| 256 | $instruction = json_encode(array( |
||
| 257 | "x-kss-key"=>$cek, |
||
| 258 | "x-kss-iv"=>$iv, |
||
| 259 | "x-kss-matdesc"=>$matdesc |
||
| 260 | )); |
||
| 261 | |||
| 262 | $req = array( |
||
| 263 | "Bucket"=>$bucket, |
||
| 264 | "Key"=>$key, |
||
| 265 | "Content"=>$instruction, |
||
| 266 | "UserMeta"=>array( |
||
| 267 | "x-kss-meta-x-kss-crypto-instr-file"=>base64_encode($key) |
||
| 268 | ) |
||
| 269 | ); |
||
| 270 | return $req; |
||
| 271 | } |
||
| 272 | public static function isInstructionFile($s3Object){ |
||
| 277 | } |
||
| 278 | } |
||
| 279 | ?> |
||