first commit 2
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
|
||||
class CreateIdModule {
|
||||
|
||||
function makeTid($payMetod, $mid, $mobileType) {
|
||||
date_default_timezone_set('Asia/Seoul');
|
||||
$date = new DateTime();
|
||||
|
||||
$prefix = "";
|
||||
|
||||
if ($mobileType) {
|
||||
$prefix = "StdMX_";
|
||||
} else {
|
||||
$prefix = "Stdpay";
|
||||
}
|
||||
|
||||
|
||||
/////////////
|
||||
list($usec, $sec) = explode(" ", microtime());
|
||||
$time = date("YmdHis", $sec) . intval(round($usec * 1000));
|
||||
if (strlen($time) == 17) {
|
||||
|
||||
} elseif (strlen($time) == 16) {
|
||||
$time = $time . "0";
|
||||
} else {
|
||||
$time = $time . "00";
|
||||
}
|
||||
/////////////
|
||||
|
||||
$tid = $prefix . $this->getPGID($payMetod) . $mid . $time . $this->makeRandNum();
|
||||
|
||||
|
||||
return $tid;
|
||||
}
|
||||
|
||||
function getPGID($payMethod) {
|
||||
$pgid = "";
|
||||
|
||||
if ($payMethod == "Card") {
|
||||
$pgid = "CARD";
|
||||
} elseif ($payMethod == "Account") {
|
||||
$pgid = "ACCT";
|
||||
} elseif ($payMethod == "DirectBank") {
|
||||
$pgid = "DBNK";
|
||||
} elseif ($payMethod == "OCBPoint") {
|
||||
$pgid = "OCBP";
|
||||
} elseif ($payMethod == "VCard") {
|
||||
$pgid = "ISP_";
|
||||
} elseif ($payMethod == "HPP") {
|
||||
$pgid = "HPP_";
|
||||
} elseif ($payMethod == "Nemo") {
|
||||
$pgid = "NEMO";
|
||||
} elseif ($payMethod == "ArsBill") {
|
||||
$pgid = "ARSB";
|
||||
} elseif ($payMethod == "PhoneBill") {
|
||||
$pgid = "PHNB";
|
||||
} elseif ($payMethod == "Ars1588Bill") {
|
||||
$pgid = "1588";
|
||||
} elseif ($payMethod == "VBank") {
|
||||
$pgid = "VBNK";
|
||||
} elseif ($payMethod == "Culture") {
|
||||
$pgid = "CULT";
|
||||
} elseif ($payMethod == "CMS") {
|
||||
$pgid = "CMS_";
|
||||
} elseif ($payMethod == "AUTH") {
|
||||
$pgid = "AUTH";
|
||||
} elseif ($payMethod == "INIcard") {
|
||||
$pgid = "INIC";
|
||||
} elseif ($payMethod == "MDX") {
|
||||
$pgid = "MDX_";
|
||||
} elseif ($payMethod == "CASH") {
|
||||
$pgid = "CASH";
|
||||
} elseif (strlen($payMethod) > 4) {
|
||||
$pgid = strtoupper($payMethod);
|
||||
$pgid = substr($pgid, 0, 4);
|
||||
} else {
|
||||
$pgid = trim($pgid);
|
||||
}
|
||||
|
||||
return $pgid;
|
||||
}
|
||||
|
||||
//랜덤 숫자 생성
|
||||
function makeRandNum() {
|
||||
$strNum = "";
|
||||
$randNum = rand(0, 300);
|
||||
|
||||
if ($randNum < 10) {
|
||||
$strNum = $strNum . "00" . $randNum;
|
||||
} elseif ($randNum < 100) {
|
||||
$strNum = $strNum . "0" . $randNum;
|
||||
} else {
|
||||
$strNum = $randNum;
|
||||
}
|
||||
|
||||
return $strNum;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,154 @@
|
||||
<?php
|
||||
|
||||
define("CONNECT_TIMEOUT", 5);
|
||||
define("READ_TIMEOUT", 15);
|
||||
//$explode_data = explode('/', $P_REQ_URL);
|
||||
//$host = $explode_data[2];
|
||||
//$path = "/" . $explode_data[3] . "/" . $explode_data[4];
|
||||
|
||||
class HttpClient {
|
||||
|
||||
var $sock = 0;
|
||||
var $ssl;
|
||||
var $host;
|
||||
var $port;
|
||||
var $path;
|
||||
var $status;
|
||||
var $headers = "";
|
||||
var $body = "";
|
||||
var $reqeust;
|
||||
var $errorcode;
|
||||
var $errormsg;
|
||||
|
||||
function processHTTP($url, $param) {
|
||||
|
||||
$data = "";
|
||||
foreach ($param as $key => $value) {
|
||||
$key2 = urlencode($key);
|
||||
$value2 = urlencode($value);
|
||||
$data .= "&$key2=$value2";
|
||||
}
|
||||
|
||||
$data = substr($data, 1); // remove leading "&"
|
||||
$url_data = parse_url($url);
|
||||
|
||||
// host 가 .inicis.com 의 주소가 아니라면 false 반환
|
||||
// [scheme] => https
|
||||
// [host] => fcstdpay.inicis.com || stdpay.inicis.com || ksstdpay.inicis.com
|
||||
// [path] => /api/payAuth
|
||||
if (! is_inicis_url_return($url)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($url_data["scheme"] == "https") {
|
||||
$this->ssl = "ssl://";
|
||||
$this->port = 443;
|
||||
}
|
||||
|
||||
$this->host = $url_data["host"];
|
||||
/*
|
||||
|
||||
if (is_null($url_data["port"])) {
|
||||
$this->port = "80";
|
||||
} else {
|
||||
$this->port = $url_data["port"];
|
||||
}
|
||||
*/
|
||||
|
||||
$this->path = $url_data["path"];
|
||||
|
||||
if (!$this->sock = @fsockopen($this->ssl . $this->host, $this->port, $errno, $errstr, CONNECT_TIMEOUT)) {
|
||||
|
||||
switch ($errno) {
|
||||
case -3:
|
||||
$this->errormsg = 'Socket creation failed (-3)';
|
||||
case -4:
|
||||
$this->errormsg = 'DNS lookup failure (-4)';
|
||||
case -5:
|
||||
$this->errormsg = 'Connection refused or timed out (-5)';
|
||||
default:
|
||||
$this->errormsg = 'Connection failed (' . $errno . ')';
|
||||
$this->errormsg .= ' ' . $errstr;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->headers = "";
|
||||
$this->body = "";
|
||||
|
||||
/* Write */
|
||||
$request = "POST " . $this->path . " HTTP/1.0\r\n";
|
||||
$request .= "Connection: close\r\n";
|
||||
$request .= "Host: " . $this->host . "\r\n";
|
||||
$request .= "Content-type: application/x-www-form-urlencoded\r\n";
|
||||
$request .= "Content-length: " . strlen($data) . "\r\n";
|
||||
$request .= "Accept: */*\r\n";
|
||||
$request .= "\r\n";
|
||||
$request .= $data . "\r\n";
|
||||
$request .= "\r\n";
|
||||
fwrite($this->sock, $request);
|
||||
|
||||
/* Read */
|
||||
stream_set_blocking($this->sock, FALSE);
|
||||
$atStart = true;
|
||||
$IsHeader = true;
|
||||
$timeout = false;
|
||||
$start_time = time();
|
||||
while (!feof($this->sock) && !$timeout) {
|
||||
$line = fgets($this->sock, 4096);
|
||||
$diff = time() - $start_time;
|
||||
if ($diff >= READ_TIMEOUT) {
|
||||
$timeout = true;
|
||||
}
|
||||
if ($IsHeader) {
|
||||
if ($line == "") {
|
||||
continue;
|
||||
}
|
||||
if (substr($line, 0, 2) == "\r\n") {
|
||||
$IsHeader = false;
|
||||
continue;
|
||||
}
|
||||
$this->headers .= $line;
|
||||
if ($atStart) {
|
||||
$atStart = false;
|
||||
if (!preg_match('/HTTP\/(\\d\\.\\d)\\s*(\\d+)\\s*(.*)/', $line, $m)) {
|
||||
$this->errormsg = "Status code line invalid: " . htmlentities($line) . $m[1] . $m[2] . $m[3];
|
||||
fclose($this->sock);
|
||||
return false;
|
||||
}
|
||||
$http_version = $m[1];
|
||||
$this->status = $m[2];
|
||||
$status_string = $m[3];
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
$this->body .= $line;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fclose($this->sock);
|
||||
|
||||
if ($timeout) {
|
||||
$this->errorcode = READ_TIMEOUT_ERR;
|
||||
$this->errormsg = "Socket Timeout(" . $diff . "SEC)";
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
// return false;
|
||||
}
|
||||
|
||||
function getErrorCode() {
|
||||
return $this->errorcode;
|
||||
}
|
||||
|
||||
function getErrorMsg() {
|
||||
return $this->errormsg;
|
||||
}
|
||||
|
||||
function getBody() {
|
||||
return $this->body;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
<?php
|
||||
|
||||
class INIStdPayUtil {
|
||||
|
||||
function getTimestamp() {
|
||||
// timezone 을 설정하지 않으면 getTimestapme() 실행시 오류가 발생한다.
|
||||
// php.ini 에 timezone 설정이 되어 잇으면 아래 코드가 필요없다.
|
||||
// php 5.3 이후로는 반드시 timezone 설정을 해야하기 때문에 아래 코드가 필요없을 수 있음. 나중에 확인 후 수정필요.
|
||||
// 이니시스 플로우에서 timestamp 값이 중요하게 사용되는 것으로 보이기 때문에 정확한 timezone 설정후 timestamp 값이 필요하지 않을까 함.
|
||||
|
||||
/**********php5
|
||||
date_default_timezone_set('Asia/Seoul');
|
||||
$date = new DateTime();
|
||||
*/
|
||||
|
||||
putenv('TZ=Asia/Seoul');
|
||||
|
||||
$milliseconds = round(microtime(true) * 1000);
|
||||
$tempValue1 = round($milliseconds / 1000); //max integer 자릿수가 9이므로 뒤 3자리를 뺀다
|
||||
$tempValue2 = round((float) microtime(false) * 1000); //뒤 3자리를 저장
|
||||
switch (strlen($tempValue2)) {
|
||||
case '3':
|
||||
break;
|
||||
case '2':
|
||||
$tempValue2 = "0" . $tempValue2;
|
||||
break;
|
||||
case '1':
|
||||
$tempValue2 = "00" . $tempValue2;
|
||||
break;
|
||||
default:
|
||||
$tempValue2 = "000";
|
||||
break;
|
||||
}
|
||||
|
||||
return "" . $tempValue1 . $tempValue2;
|
||||
}
|
||||
|
||||
/*
|
||||
//*** 위변조 방지체크를 signature 생성 ***
|
||||
|
||||
mid, price, timestamp 3개의 키와 값을
|
||||
key=value 형식으로 하여 '&'로 연결한 하여 SHA-256 Hash로 생성 된값
|
||||
ex) mid=INIpayTest&price=819000×tamp=2012-02-01 09:19:04.004
|
||||
|
||||
* key기준 알파벳 정렬
|
||||
* timestamp는 반드시 signature생성에 사용한 timestamp 값을 timestamp input에 그데로 사용하여야함
|
||||
*/
|
||||
|
||||
function makeSignature($signParam) {
|
||||
ksort($signParam);
|
||||
$string = "";
|
||||
foreach ($signParam as $key => $value) {
|
||||
$string .= "&$key=$value";
|
||||
}
|
||||
$string = substr($string, 1); // remove leading "&"
|
||||
|
||||
$sign = hash( "sha256", $string);
|
||||
|
||||
return $sign;
|
||||
}
|
||||
|
||||
function makeHash($data, $alg) {
|
||||
// $s = hash_hmac('sha256', $data, 'secret', true);
|
||||
// return base64_encode($s);
|
||||
|
||||
///$ret = openssl_digest($data, $alg);
|
||||
$ret = hash($alg, $data);
|
||||
return $ret;
|
||||
}
|
||||
|
||||
//
|
||||
function makeSignatureAuth($parameters) {
|
||||
|
||||
if ($parameters == null || sizeof($parameters) == 0) {
|
||||
throw new Exception("<p>Parameters can not be empty.</P>");
|
||||
}
|
||||
|
||||
$stringToSign = ""; //반환용 text
|
||||
$mid = $parameters["mid"]; //mid
|
||||
$tstamp = $parameters["tstamp"]; //auth timestamp
|
||||
$MOID = $parameters["MOID"]; //OID
|
||||
$TotPrice = $parameters["TotPrice"]; //total price
|
||||
$tstampKey = substr($parameters["tstamp"], strlen($parameters["tstamp"]) - 1); // timestamp 마지막 자리 1자리 숫자
|
||||
|
||||
switch (intval($tstampKey)){
|
||||
case 1 :
|
||||
$stringToSign = "MOID=" . $MOID . "&mid=" . $mid . "&tstamp=" . $tstamp ;
|
||||
break;
|
||||
case 2 :
|
||||
$stringToSign = "MOID=" . $MOID . "&tstamp=" . $tstamp . "&mid=" . $mid ;
|
||||
break;
|
||||
case 3 :
|
||||
$stringToSign = "mid=" . $mid . "&MOID=" . $MOID . "&tstamp=" . $tstamp ;
|
||||
break;
|
||||
case 4 :
|
||||
$stringToSign = "mid=" . $mid . "&tstamp=" . $tstamp . "&MOID=" . $MOID ;
|
||||
break;
|
||||
case 5 :
|
||||
$stringToSign = "tstamp=" . $tstamp . "&mid=" . $mid . "&MOID=" . $MOID ;
|
||||
break;
|
||||
case 6 :
|
||||
$stringToSign = "tstamp=" . $tstamp . "&MOID=" . $MOID . "&mid=" . $mid ;
|
||||
break;
|
||||
case 7 :
|
||||
$stringToSign = "TotPrice=" . $TotPrice . "&mid=" . $mid . "&tstamp=" . $tstamp ;
|
||||
break;
|
||||
case 8 :
|
||||
$stringToSign = "TotPrice=" . $TotPrice . "&tstamp=" . $tstamp . "&mid=" . $mid ;
|
||||
break;
|
||||
case 9 :
|
||||
$stringToSign = "TotPrice=" . $TotPrice . "&MOID=" . $MOID . "&tstamp=" . $tstamp ;
|
||||
break;
|
||||
case 0 :
|
||||
$stringToSign = "TotPrice=" . $TotPrice . "&tstamp=" . $tstamp . "&MOID=" . $MOID ;
|
||||
break;
|
||||
}
|
||||
|
||||
$signature = hash("sha256", $stringToSign); // sha256 처리하여 hash 암호화
|
||||
//$signature = $this->makeHash($stringToSign, "sha256"); // sha256 처리하여 hash 암호화
|
||||
|
||||
return $signature;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
require_once('../libs/INIStdPayUtil.php');
|
||||
|
||||
$SignatureUtil = new INIStdPayUtil();
|
||||
|
||||
$input = "oid=" . $_REQUEST["oid"] . "&price=" . $_REQUEST["price"] . "×tamp=" . $_REQUEST["timestamp"];
|
||||
|
||||
$output['signature'] = array(
|
||||
///'signature' => $SignatureUtil->makeHash($input, "sha256")
|
||||
'signature' => hash("sha256", $input)
|
||||
);
|
||||
|
||||
echo json_encode($output);
|
||||
@@ -0,0 +1,804 @@
|
||||
<?php
|
||||
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
|
||||
|
||||
/**
|
||||
* Converts to and from JSON format.
|
||||
*
|
||||
* JSON (JavaScript Object Notation) is a lightweight data-interchange
|
||||
* format. It is easy for humans to read and write. It is easy for machines
|
||||
* to parse and generate. It is based on a subset of the JavaScript
|
||||
* Programming Language, Standard ECMA-262 3rd Edition - December 1999.
|
||||
* This feature can also be found in Python. JSON is a text format that is
|
||||
* completely language independent but uses conventions that are familiar
|
||||
* to programmers of the C-family of languages, including C, C++, C#, Java,
|
||||
* JavaScript, Perl, TCL, and many others. These properties make JSON an
|
||||
* ideal data-interchange language.
|
||||
*
|
||||
* This package provides a simple encoder and decoder for JSON notation. It
|
||||
* is intended for use with client-side Javascript applications that make
|
||||
* use of HTTPRequest to perform server communication functions - data can
|
||||
* be encoded into JSON notation for use in a client-side javascript, or
|
||||
* decoded from incoming Javascript requests. JSON format is native to
|
||||
* Javascript, and can be directly eval()'ed with no further parsing
|
||||
* overhead
|
||||
*
|
||||
* All strings should be in ASCII or UTF-8 format!
|
||||
*
|
||||
* LICENSE: Redistribution and use in source and binary forms, with or
|
||||
* without modification, are permitted provided that the following
|
||||
* conditions are met: Redistributions of source code must retain the
|
||||
* above copyright notice, this list of conditions and the following
|
||||
* disclaimer. Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
|
||||
* NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
||||
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
||||
* DAMAGE.
|
||||
*
|
||||
* @category
|
||||
* @package Services_JSON
|
||||
* @author Michal Migurski <mike-json@teczno.com>
|
||||
* @author Matt Knapp <mdknapp[at]gmail[dot]com>
|
||||
* @author Brett Stimmerman <brettstimmerman[at]gmail[dot]com>
|
||||
* @copyright 2005 Michal Migurski
|
||||
* @version CVS: $Id: JSON.php,v 1.31 2006/06/28 05:54:17 migurski Exp $
|
||||
* @license http://www.opensource.org/licenses/bsd-license.php
|
||||
* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198
|
||||
*/
|
||||
|
||||
/**
|
||||
* Marker constant for Services_JSON::decode(), used to flag stack state
|
||||
*/
|
||||
define('SERVICES_JSON_SLICE', 1);
|
||||
|
||||
/**
|
||||
* Marker constant for Services_JSON::decode(), used to flag stack state
|
||||
*/
|
||||
define('SERVICES_JSON_IN_STR', 2);
|
||||
|
||||
/**
|
||||
* Marker constant for Services_JSON::decode(), used to flag stack state
|
||||
*/
|
||||
define('SERVICES_JSON_IN_ARR', 3);
|
||||
|
||||
/**
|
||||
* Marker constant for Services_JSON::decode(), used to flag stack state
|
||||
*/
|
||||
define('SERVICES_JSON_IN_OBJ', 4);
|
||||
|
||||
/**
|
||||
* Marker constant for Services_JSON::decode(), used to flag stack state
|
||||
*/
|
||||
define('SERVICES_JSON_IN_CMT', 5);
|
||||
|
||||
/**
|
||||
* Behavior switch for Services_JSON::decode()
|
||||
*/
|
||||
define('SERVICES_JSON_LOOSE_TYPE', 16);
|
||||
|
||||
/**
|
||||
* Behavior switch for Services_JSON::decode()
|
||||
*/
|
||||
define('SERVICES_JSON_SUPPRESS_ERRORS', 32);
|
||||
|
||||
/**
|
||||
* Converts to and from JSON format.
|
||||
*
|
||||
* Brief example of use:
|
||||
*
|
||||
* <code>
|
||||
* // create a new instance of Services_JSON
|
||||
* $json = new Services_JSON();
|
||||
*
|
||||
* // convert a complexe value to JSON notation, and send it to the browser
|
||||
* $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4)));
|
||||
* $output = $json->encode($value);
|
||||
*
|
||||
* print($output);
|
||||
* // prints: ["foo","bar",[1,2,"baz"],[3,[4]]]
|
||||
*
|
||||
* // accept incoming POST data, assumed to be in JSON notation
|
||||
* $input = file_get_contents('php://input', 1000000);
|
||||
* $value = $json->decode($input);
|
||||
* </code>
|
||||
*/
|
||||
class Services_JSON
|
||||
{
|
||||
/**
|
||||
* constructs a new JSON instance
|
||||
*
|
||||
* @param int $use object behavior flags; combine with boolean-OR
|
||||
*
|
||||
* possible values:
|
||||
* - SERVICES_JSON_LOOSE_TYPE: loose typing.
|
||||
* "{...}" syntax creates associative arrays
|
||||
* instead of objects in decode().
|
||||
* - SERVICES_JSON_SUPPRESS_ERRORS: error suppression.
|
||||
* Values which can't be encoded (e.g. resources)
|
||||
* appear as NULL instead of throwing errors.
|
||||
* By default, a deeply-nested resource will
|
||||
* bubble up with an error, so all return values
|
||||
* from encode() should be checked with isError()
|
||||
*/
|
||||
function Services_JSON($use = 0)
|
||||
{
|
||||
$this->use = $use;
|
||||
}
|
||||
|
||||
/**
|
||||
* convert a string from one UTF-16 char to one UTF-8 char
|
||||
*
|
||||
* Normally should be handled by mb_convert_encoding, but
|
||||
* provides a slower PHP-only method for installations
|
||||
* that lack the multibye string extension.
|
||||
*
|
||||
* @param string $utf16 UTF-16 character
|
||||
* @return string UTF-8 character
|
||||
* @access private
|
||||
*/
|
||||
function utf162utf8($utf16)
|
||||
{
|
||||
// oh please oh please oh please oh please oh please
|
||||
if(function_exists('mb_convert_encoding')) {
|
||||
return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');
|
||||
}
|
||||
|
||||
$bytes = (ord($utf16[0]) << 8) | ord($utf16[1]);
|
||||
|
||||
switch(true) {
|
||||
case ((0x7F & $bytes) == $bytes):
|
||||
// this case should never be reached, because we are in ASCII range
|
||||
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
return chr(0x7F & $bytes);
|
||||
|
||||
case (0x07FF & $bytes) == $bytes:
|
||||
// return a 2-byte UTF-8 character
|
||||
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
return chr(0xC0 | (($bytes >> 6) & 0x1F))
|
||||
. chr(0x80 | ($bytes & 0x3F));
|
||||
|
||||
case (0xFFFF & $bytes) == $bytes:
|
||||
// return a 3-byte UTF-8 character
|
||||
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
return chr(0xE0 | (($bytes >> 12) & 0x0F))
|
||||
. chr(0x80 | (($bytes >> 6) & 0x3F))
|
||||
. chr(0x80 | ($bytes & 0x3F));
|
||||
}
|
||||
|
||||
// ignoring UTF-32 for now, sorry
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* convert a string from one UTF-8 char to one UTF-16 char
|
||||
*
|
||||
* Normally should be handled by mb_convert_encoding, but
|
||||
* provides a slower PHP-only method for installations
|
||||
* that lack the multibye string extension.
|
||||
*
|
||||
* @param string $utf8 UTF-8 character
|
||||
* @return string UTF-16 character
|
||||
* @access private
|
||||
*/
|
||||
function utf82utf16($utf8)
|
||||
{
|
||||
// oh please oh please oh please oh please oh please
|
||||
if(function_exists('mb_convert_encoding')) {
|
||||
return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
|
||||
}
|
||||
|
||||
switch(strlen($utf8)) {
|
||||
case 1:
|
||||
// this case should never be reached, because we are in ASCII range
|
||||
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
return $utf8;
|
||||
|
||||
case 2:
|
||||
// return a UTF-16 character from a 2-byte UTF-8 char
|
||||
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
return chr(0x07 & (ord($utf8[0]) >> 2))
|
||||
. chr((0xC0 & (ord($utf8[0]) << 6))
|
||||
| (0x3F & ord($utf8[1])));
|
||||
|
||||
case 3:
|
||||
// return a UTF-16 character from a 3-byte UTF-8 char
|
||||
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
return chr((0xF0 & (ord($utf8[0]) << 4))
|
||||
| (0x0F & (ord($utf8[1]) >> 2)))
|
||||
. chr((0xC0 & (ord($utf8[1]) << 6))
|
||||
| (0x7F & ord($utf8[2])));
|
||||
}
|
||||
|
||||
// ignoring UTF-32 for now, sorry
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* encodes an arbitrary variable into JSON format
|
||||
*
|
||||
* @param mixed $var any number, boolean, string, array, or object to be encoded.
|
||||
* see argument 1 to Services_JSON() above for array-parsing behavior.
|
||||
* if var is a strng, note that encode() always expects it
|
||||
* to be in ASCII or UTF-8 format!
|
||||
*
|
||||
* @return mixed JSON string representation of input var or an error if a problem occurs
|
||||
* @access public
|
||||
*/
|
||||
function encode($var)
|
||||
{
|
||||
switch (gettype($var)) {
|
||||
case 'boolean':
|
||||
return $var ? 'true' : 'false';
|
||||
|
||||
case 'NULL':
|
||||
return 'null';
|
||||
|
||||
case 'integer':
|
||||
return (int) $var;
|
||||
|
||||
case 'double':
|
||||
case 'float':
|
||||
return (float) $var;
|
||||
|
||||
case 'string':
|
||||
// STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
|
||||
$ascii = '';
|
||||
$strlen_var = strlen($var);
|
||||
|
||||
/*
|
||||
* Iterate over every character in the string,
|
||||
* escaping with a slash or encoding to UTF-8 where necessary
|
||||
*/
|
||||
for ($c = 0; $c < $strlen_var; ++$c) {
|
||||
|
||||
$ord_var_c = ord($var[$c]);
|
||||
|
||||
switch (true) {
|
||||
case $ord_var_c == 0x08:
|
||||
$ascii .= '\b';
|
||||
break;
|
||||
case $ord_var_c == 0x09:
|
||||
$ascii .= '\t';
|
||||
break;
|
||||
case $ord_var_c == 0x0A:
|
||||
$ascii .= '\n';
|
||||
break;
|
||||
case $ord_var_c == 0x0C:
|
||||
$ascii .= '\f';
|
||||
break;
|
||||
case $ord_var_c == 0x0D:
|
||||
$ascii .= '\r';
|
||||
break;
|
||||
|
||||
case $ord_var_c == 0x22:
|
||||
case $ord_var_c == 0x2F:
|
||||
case $ord_var_c == 0x5C:
|
||||
// double quote, slash, slosh
|
||||
$ascii .= '\\'.$var[$c];
|
||||
break;
|
||||
|
||||
case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
|
||||
// characters U-00000000 - U-0000007F (same as ASCII)
|
||||
$ascii .= $var[$c];
|
||||
break;
|
||||
|
||||
case (($ord_var_c & 0xE0) == 0xC0):
|
||||
// characters U-00000080 - U-000007FF, mask 110XXXXX
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$char = pack('C*', $ord_var_c, ord($var[$c + 1]));
|
||||
$c += 1;
|
||||
$utf16 = $this->utf82utf16($char);
|
||||
$ascii .= sprintf('\u%04s', bin2hex($utf16));
|
||||
break;
|
||||
|
||||
case (($ord_var_c & 0xF0) == 0xE0):
|
||||
// characters U-00000800 - U-0000FFFF, mask 1110XXXX
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$char = pack('C*', $ord_var_c,
|
||||
ord($var[$c + 1]),
|
||||
ord($var[$c + 2]));
|
||||
$c += 2;
|
||||
$utf16 = $this->utf82utf16($char);
|
||||
$ascii .= sprintf('\u%04s', bin2hex($utf16));
|
||||
break;
|
||||
|
||||
case (($ord_var_c & 0xF8) == 0xF0):
|
||||
// characters U-00010000 - U-001FFFFF, mask 11110XXX
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$char = pack('C*', $ord_var_c,
|
||||
ord($var[$c + 1]),
|
||||
ord($var[$c + 2]),
|
||||
ord($var[$c + 3]));
|
||||
$c += 3;
|
||||
$utf16 = $this->utf82utf16($char);
|
||||
$ascii .= sprintf('\u%04s', bin2hex($utf16));
|
||||
break;
|
||||
|
||||
case (($ord_var_c & 0xFC) == 0xF8):
|
||||
// characters U-00200000 - U-03FFFFFF, mask 111110XX
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$char = pack('C*', $ord_var_c,
|
||||
ord($var[$c + 1]),
|
||||
ord($var[$c + 2]),
|
||||
ord($var[$c + 3]),
|
||||
ord($var[$c + 4]));
|
||||
$c += 4;
|
||||
$utf16 = $this->utf82utf16($char);
|
||||
$ascii .= sprintf('\u%04s', bin2hex($utf16));
|
||||
break;
|
||||
|
||||
case (($ord_var_c & 0xFE) == 0xFC):
|
||||
// characters U-04000000 - U-7FFFFFFF, mask 1111110X
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$char = pack('C*', $ord_var_c,
|
||||
ord($var[$c + 1]),
|
||||
ord($var[$c + 2]),
|
||||
ord($var[$c + 3]),
|
||||
ord($var[$c + 4]),
|
||||
ord($var[$c + 5]));
|
||||
$c += 5;
|
||||
$utf16 = $this->utf82utf16($char);
|
||||
$ascii .= sprintf('\u%04s', bin2hex($utf16));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return '"'.$ascii.'"';
|
||||
|
||||
case 'array':
|
||||
/*
|
||||
* As per JSON spec if any array key is not an integer
|
||||
* we must treat the the whole array as an object. We
|
||||
* also try to catch a sparsely populated associative
|
||||
* array with numeric keys here because some JS engines
|
||||
* will create an array with empty indexes up to
|
||||
* max_index which can cause memory issues and because
|
||||
* the keys, which may be relevant, will be remapped
|
||||
* otherwise.
|
||||
*
|
||||
* As per the ECMA and JSON specification an object may
|
||||
* have any string as a property. Unfortunately due to
|
||||
* a hole in the ECMA specification if the key is a
|
||||
* ECMA reserved word or starts with a digit the
|
||||
* parameter is only accessible using ECMAScript's
|
||||
* bracket notation.
|
||||
*/
|
||||
|
||||
// treat as a JSON object
|
||||
if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
|
||||
$properties = array_map(array($this, 'name_value'),
|
||||
array_keys($var),
|
||||
array_values($var));
|
||||
|
||||
foreach($properties as $property) {
|
||||
if(Services_JSON::isError($property)) {
|
||||
return $property;
|
||||
}
|
||||
}
|
||||
|
||||
return '{' . join(',', $properties) . '}';
|
||||
}
|
||||
|
||||
// treat it like a regular array
|
||||
$elements = array_map(array($this, 'encode'), $var);
|
||||
|
||||
foreach($elements as $element) {
|
||||
if(Services_JSON::isError($element)) {
|
||||
return $element;
|
||||
}
|
||||
}
|
||||
|
||||
return '[' . join(',', $elements) . ']';
|
||||
|
||||
case 'object':
|
||||
$vars = get_object_vars($var);
|
||||
|
||||
$properties = array_map(array($this, 'name_value'),
|
||||
array_keys($vars),
|
||||
array_values($vars));
|
||||
|
||||
foreach($properties as $property) {
|
||||
if(Services_JSON::isError($property)) {
|
||||
return $property;
|
||||
}
|
||||
}
|
||||
|
||||
return '{' . join(',', $properties) . '}';
|
||||
|
||||
default:
|
||||
return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS)
|
||||
? 'null'
|
||||
: new Services_JSON_Error(gettype($var)." can not be encoded as JSON string");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* array-walking function for use in generating JSON-formatted name-value pairs
|
||||
*
|
||||
* @param string $name name of key to use
|
||||
* @param mixed $value reference to an array element to be encoded
|
||||
*
|
||||
* @return string JSON-formatted name-value pair, like '"name":value'
|
||||
* @access private
|
||||
*/
|
||||
function name_value($name, $value)
|
||||
{
|
||||
$encoded_value = $this->encode($value);
|
||||
|
||||
if(Services_JSON::isError($encoded_value)) {
|
||||
return $encoded_value;
|
||||
}
|
||||
|
||||
return $this->encode(strval($name)) . ':' . $encoded_value;
|
||||
}
|
||||
|
||||
/**
|
||||
* reduce a string by removing leading and trailing comments and whitespace
|
||||
*
|
||||
* @param $str string string value to strip of comments and whitespace
|
||||
*
|
||||
* @return string string value stripped of comments and whitespace
|
||||
* @access private
|
||||
*/
|
||||
function reduce_string($str)
|
||||
{
|
||||
$str = preg_replace(array(
|
||||
|
||||
// eliminate single line comments in '// ...' form
|
||||
'#^\s*//(.+)$#m',
|
||||
|
||||
// eliminate multi-line comments in '/* ... */' form, at start of string
|
||||
'#^\s*/\*(.+)\*/#Us',
|
||||
|
||||
// eliminate multi-line comments in '/* ... */' form, at end of string
|
||||
'#/\*(.+)\*/\s*$#Us'
|
||||
|
||||
), '', $str);
|
||||
|
||||
// eliminate extraneous space
|
||||
return trim($str);
|
||||
}
|
||||
|
||||
/**
|
||||
* decodes a JSON string into appropriate variable
|
||||
*
|
||||
* @param string $str JSON-formatted string
|
||||
*
|
||||
* @return mixed number, boolean, string, array, or object
|
||||
* corresponding to given JSON input string.
|
||||
* See argument 1 to Services_JSON() above for object-output behavior.
|
||||
* Note that decode() always returns strings
|
||||
* in ASCII or UTF-8 format!
|
||||
* @access public
|
||||
*/
|
||||
function decode($str)
|
||||
{
|
||||
$str = $this->reduce_string($str);
|
||||
|
||||
switch (strtolower($str)) {
|
||||
case 'true':
|
||||
return true;
|
||||
|
||||
case 'false':
|
||||
return false;
|
||||
|
||||
case 'null':
|
||||
return null;
|
||||
|
||||
default:
|
||||
$m = array();
|
||||
|
||||
if (is_numeric($str)) {
|
||||
// Lookie-loo, it's a number
|
||||
|
||||
// This would work on its own, but I'm trying to be
|
||||
// good about returning integers where appropriate:
|
||||
// return (float)$str;
|
||||
|
||||
// Return float or int, as appropriate
|
||||
return ((float)$str == (integer)$str)
|
||||
? (integer)$str
|
||||
: (float)$str;
|
||||
|
||||
} elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) {
|
||||
// STRINGS RETURNED IN UTF-8 FORMAT
|
||||
$delim = substr($str, 0, 1);
|
||||
$chrs = substr($str, 1, -1);
|
||||
$utf8 = '';
|
||||
$strlen_chrs = strlen($chrs);
|
||||
|
||||
for ($c = 0; $c < $strlen_chrs; ++$c) {
|
||||
|
||||
$substr_chrs_c_2 = substr($chrs, $c, 2);
|
||||
$ord_chrs_c = ord($chrs[$c]);
|
||||
|
||||
switch (true) {
|
||||
case $substr_chrs_c_2 == '\b':
|
||||
$utf8 .= chr(0x08);
|
||||
++$c;
|
||||
break;
|
||||
case $substr_chrs_c_2 == '\t':
|
||||
$utf8 .= chr(0x09);
|
||||
++$c;
|
||||
break;
|
||||
case $substr_chrs_c_2 == '\n':
|
||||
$utf8 .= chr(0x0A);
|
||||
++$c;
|
||||
break;
|
||||
case $substr_chrs_c_2 == '\f':
|
||||
$utf8 .= chr(0x0C);
|
||||
++$c;
|
||||
break;
|
||||
case $substr_chrs_c_2 == '\r':
|
||||
$utf8 .= chr(0x0D);
|
||||
++$c;
|
||||
break;
|
||||
|
||||
case $substr_chrs_c_2 == '\\"':
|
||||
case $substr_chrs_c_2 == '\\\'':
|
||||
case $substr_chrs_c_2 == '\\\\':
|
||||
case $substr_chrs_c_2 == '\\/':
|
||||
if (($delim == '"' && $substr_chrs_c_2 != '\\\'') ||
|
||||
($delim == "'" && $substr_chrs_c_2 != '\\"')) {
|
||||
$utf8 .= $chrs[++$c];
|
||||
}
|
||||
break;
|
||||
|
||||
case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)):
|
||||
// single, escaped unicode character
|
||||
$utf16 = chr(hexdec(substr($chrs, ($c + 2), 2)))
|
||||
. chr(hexdec(substr($chrs, ($c + 4), 2)));
|
||||
$utf8 .= $this->utf162utf8($utf16);
|
||||
$c += 5;
|
||||
break;
|
||||
|
||||
case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F):
|
||||
$utf8 .= $chrs[$c];
|
||||
break;
|
||||
|
||||
case ($ord_chrs_c & 0xE0) == 0xC0:
|
||||
// characters U-00000080 - U-000007FF, mask 110XXXXX
|
||||
//see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$utf8 .= substr($chrs, $c, 2);
|
||||
++$c;
|
||||
break;
|
||||
|
||||
case ($ord_chrs_c & 0xF0) == 0xE0:
|
||||
// characters U-00000800 - U-0000FFFF, mask 1110XXXX
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$utf8 .= substr($chrs, $c, 3);
|
||||
$c += 2;
|
||||
break;
|
||||
|
||||
case ($ord_chrs_c & 0xF8) == 0xF0:
|
||||
// characters U-00010000 - U-001FFFFF, mask 11110XXX
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$utf8 .= substr($chrs, $c, 4);
|
||||
$c += 3;
|
||||
break;
|
||||
|
||||
case ($ord_chrs_c & 0xFC) == 0xF8:
|
||||
// characters U-00200000 - U-03FFFFFF, mask 111110XX
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$utf8 .= substr($chrs, $c, 5);
|
||||
$c += 4;
|
||||
break;
|
||||
|
||||
case ($ord_chrs_c & 0xFE) == 0xFC:
|
||||
// characters U-04000000 - U-7FFFFFFF, mask 1111110X
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$utf8 .= substr($chrs, $c, 6);
|
||||
$c += 5;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return $utf8;
|
||||
|
||||
} elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) {
|
||||
// array, or object notation
|
||||
|
||||
if ($str[0] == '[') {
|
||||
$stk = array(SERVICES_JSON_IN_ARR);
|
||||
$arr = array();
|
||||
} else {
|
||||
if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
|
||||
$stk = array(SERVICES_JSON_IN_OBJ);
|
||||
$obj = array();
|
||||
} else {
|
||||
$stk = array(SERVICES_JSON_IN_OBJ);
|
||||
$obj = new stdClass();
|
||||
}
|
||||
}
|
||||
|
||||
array_push($stk, array('what' => SERVICES_JSON_SLICE,
|
||||
'where' => 0,
|
||||
'delim' => false));
|
||||
|
||||
$chrs = substr($str, 1, -1);
|
||||
$chrs = $this->reduce_string($chrs);
|
||||
|
||||
if ($chrs == '') {
|
||||
if (reset($stk) == SERVICES_JSON_IN_ARR) {
|
||||
return $arr;
|
||||
|
||||
} else {
|
||||
return $obj;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//print("\nparsing {$chrs}\n");
|
||||
|
||||
$strlen_chrs = strlen($chrs);
|
||||
|
||||
for ($c = 0; $c <= $strlen_chrs; ++$c) {
|
||||
|
||||
$top = end($stk);
|
||||
$substr_chrs_c_2 = substr($chrs, $c, 2);
|
||||
|
||||
if (($c == $strlen_chrs) || (($chrs[$c] == ',') && ($top['what'] == SERVICES_JSON_SLICE))) {
|
||||
// found a comma that is not inside a string, array, etc.,
|
||||
// OR we've reached the end of the character list
|
||||
$slice = substr($chrs, $top['where'], ($c - $top['where']));
|
||||
array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false));
|
||||
//print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
|
||||
|
||||
if (reset($stk) == SERVICES_JSON_IN_ARR) {
|
||||
// we are in an array, so just push an element onto the stack
|
||||
array_push($arr, $this->decode($slice));
|
||||
|
||||
} elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
|
||||
// we are in an object, so figure
|
||||
// out the property name and set an
|
||||
// element in an associative array,
|
||||
// for now
|
||||
$parts = array();
|
||||
|
||||
if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
|
||||
// "name":value pair
|
||||
$key = $this->decode($parts[1]);
|
||||
$val = $this->decode($parts[2]);
|
||||
|
||||
if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
|
||||
$obj[$key] = $val;
|
||||
} else {
|
||||
$obj->$key = $val;
|
||||
}
|
||||
} elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
|
||||
// name:value pair, where name is unquoted
|
||||
$key = $parts[1];
|
||||
$val = $this->decode($parts[2]);
|
||||
|
||||
if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
|
||||
$obj[$key] = $val;
|
||||
} else {
|
||||
$obj->$key = $val;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} elseif ((($chrs[$c] == '"') || ($chrs[$c] == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) {
|
||||
// found a quote, and we are not inside a string
|
||||
array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs[$c]));
|
||||
//print("Found start of string at {$c}\n");
|
||||
|
||||
} elseif (($chrs[$c] == $top['delim']) &&
|
||||
($top['what'] == SERVICES_JSON_IN_STR) &&
|
||||
((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1)) {
|
||||
// found a quote, we're in a string, and it's not escaped
|
||||
// we know that it's not escaped becase there is _not_ an
|
||||
// odd number of backslashes at the end of the string so far
|
||||
array_pop($stk);
|
||||
//print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n");
|
||||
|
||||
} elseif (($chrs[$c] == '[') &&
|
||||
in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
|
||||
// found a left-bracket, and we are in an array, object, or slice
|
||||
array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false));
|
||||
//print("Found start of array at {$c}\n");
|
||||
|
||||
} elseif (($chrs[$c] == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) {
|
||||
// found a right-bracket, and we're in an array
|
||||
array_pop($stk);
|
||||
//print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
|
||||
|
||||
} elseif (($chrs[$c] == '{') &&
|
||||
in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
|
||||
// found a left-brace, and we are in an array, object, or slice
|
||||
array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false));
|
||||
//print("Found start of object at {$c}\n");
|
||||
|
||||
} elseif (($chrs[$c] == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) {
|
||||
// found a right-brace, and we're in an object
|
||||
array_pop($stk);
|
||||
//print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
|
||||
|
||||
} elseif (($substr_chrs_c_2 == '/*') &&
|
||||
in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
|
||||
// found a comment start, and we are in an array, object, or slice
|
||||
array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false));
|
||||
$c++;
|
||||
//print("Found start of comment at {$c}\n");
|
||||
|
||||
} elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) {
|
||||
// found a comment end, and we're in one now
|
||||
array_pop($stk);
|
||||
$c++;
|
||||
|
||||
for ($i = $top['where']; $i <= $c; ++$i)
|
||||
$chrs = substr_replace($chrs, ' ', $i, 1);
|
||||
|
||||
//print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (reset($stk) == SERVICES_JSON_IN_ARR) {
|
||||
return $arr;
|
||||
|
||||
} elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
|
||||
return $obj;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @todo Ultimately, this should just call PEAR::isError()
|
||||
*/
|
||||
function isError($data, $code = null)
|
||||
{
|
||||
if (class_exists('pear')) {
|
||||
return PEAR::isError($data, $code);
|
||||
} elseif (is_object($data) && (get_class($data) == 'services_json_error' ||
|
||||
is_subclass_of($data, 'services_json_error'))) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (class_exists('PEAR_Error')) {
|
||||
|
||||
class Services_JSON_Error extends PEAR_Error
|
||||
{
|
||||
function Services_JSON_Error($message = 'unknown error', $code = null,
|
||||
$mode = null, $options = null, $userinfo = null)
|
||||
{
|
||||
parent::PEAR_Error($message, $code, $mode, $options, $userinfo);
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
/**
|
||||
* @todo Ultimately, this class shall be descended from PEAR_Error
|
||||
*/
|
||||
class Services_JSON_Error
|
||||
{
|
||||
function Services_JSON_Error($message = 'unknown error', $code = null,
|
||||
$mode = null, $options = null, $userinfo = null)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,134 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit;
|
||||
|
||||
function get_inicis_iniapi_key() {
|
||||
global $default;
|
||||
|
||||
// iniapi_key 는 전체취소, 부분취소, 현금영수증, 에스크로 배송등록에 사용됨
|
||||
if ($default['de_card_test']) { // 테스트결제이면
|
||||
if ($default['de_inicis_mid'] === 'iniescrow0') { // 에스크로 테스트용 mid
|
||||
return 'yERbIlJ3NhTeObsA';
|
||||
} else if ($default['de_inicis_mid'] === 'INIpayTest'){ // 일반 테스트용 mid
|
||||
return 'ItEQKi3rY7uvDS8l';
|
||||
}
|
||||
}
|
||||
|
||||
return $default['de_inicis_iniapi_key'];
|
||||
}
|
||||
|
||||
function get_inicis_iniapi_iv() {
|
||||
global $default;
|
||||
|
||||
// iniapi_iv 는 현금영수증 발급에 사용됨
|
||||
if ($default['de_card_test']) { // 테스트결제이면
|
||||
if ($default['de_inicis_mid'] === 'iniescrow0') { // 에스크로 테스트용 mid
|
||||
return 'tOGDXbfoajk2DQ==';
|
||||
} else if ($default['de_inicis_mid'] === 'INIpayTest'){ // 일반 테스트용 mid
|
||||
return 'HYb3yQ4f65QL89==';
|
||||
}
|
||||
}
|
||||
|
||||
return $default['de_inicis_iniapi_iv'];
|
||||
}
|
||||
|
||||
// KG 이니시스 일반 주문 취소 함수
|
||||
// $args 변수의 타입은 array, $is_part 변수는 부분취소 구분 변수
|
||||
function inicis_tid_cancel($args, $is_part=false){
|
||||
global $default;
|
||||
|
||||
// step1. 요청을 위한 파라미터 설정
|
||||
// 가맹점관리자 > 상점정보 > 계약정보 > 부가정보 > INIAPI key 생성조회
|
||||
$key = isset($args['key']) ? $args['key'] : get_inicis_iniapi_key();
|
||||
$type = "Refund"; // 고정
|
||||
$paymethod = isset($args['paymethod']) ? $args['paymethod'] : "Card";
|
||||
$timestamp = isset($args['timestamp']) ? $args['timestamp'] : date("YmdHis");
|
||||
$clientIp = isset($args['clientIp']) ? $args['clientIp'] : $_SERVER['SERVER_ADDR'];
|
||||
$mid = isset($args['mid']) ? $args['mid'] : $default['de_inicis_mid'];
|
||||
$tid = $args['tid'];
|
||||
$msg = $args['msg'];
|
||||
|
||||
// 부분취소인 경우
|
||||
if ($is_part){
|
||||
$type = 'PartialRefund';
|
||||
$price = $args['price'];
|
||||
$confirmPrice = $args['confirmPrice'];
|
||||
|
||||
// INIAPIKey + type + paymethod + timestamp + clientIp + mid + tid + price + confirmPrice
|
||||
$hashData = hash("sha512",(string)$key.(string)$type.(string)$paymethod.(string)$timestamp.(string)$clientIp.(string)$mid.(string)$tid.(string)$price.(string)$confirmPrice); // hash 암호화
|
||||
|
||||
//step2. key=value 로 post 요청
|
||||
$data = array(
|
||||
'type' => $type,
|
||||
'paymethod' => $paymethod,
|
||||
'timestamp' => $timestamp,
|
||||
'clientIp' => $clientIp,
|
||||
'mid' => $mid,
|
||||
'tid' => $tid,
|
||||
'price' => $price,
|
||||
'confirmPrice' => $confirmPrice,
|
||||
'msg' => $msg,
|
||||
'hashData'=> $hashData
|
||||
);
|
||||
} else {
|
||||
// 전체취소인 경우
|
||||
// INIAPIKey + type + paymethod + timestamp + clientIp + mid + tid
|
||||
$hashData = hash("sha512", (string)$key.(string)$type.(string)$paymethod.(string)$timestamp.(string)$clientIp.(string)$mid.(string)$tid); // hash 암호화
|
||||
|
||||
//step2. key=value 로 post 요청
|
||||
$data = array(
|
||||
'type' => $type,
|
||||
'paymethod' => $paymethod,
|
||||
'timestamp' => $timestamp,
|
||||
'clientIp' => $clientIp,
|
||||
'mid' => $mid,
|
||||
'tid' => $tid,
|
||||
'msg' => $msg,
|
||||
'hashData'=> $hashData
|
||||
);
|
||||
}
|
||||
|
||||
$url = "https://iniapi.inicis.com/api/v1/refund";
|
||||
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, $url);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded; charset=utf-8'));
|
||||
curl_setopt($ch, CURLOPT_POST, 1);
|
||||
|
||||
$response = curl_exec($ch);
|
||||
curl_close($ch);
|
||||
|
||||
//step3. 요청 결과
|
||||
return $response;
|
||||
}
|
||||
|
||||
function get_type_inicis_paymethod($od_settle_case){
|
||||
$ini_paymethod = '';
|
||||
|
||||
switch ($od_settle_case) {
|
||||
case '신용카드':
|
||||
case '간편결제':
|
||||
$ini_paymethod = 'Card';
|
||||
break;
|
||||
case '가상계좌':
|
||||
$ini_paymethod = 'GVacct'; // 가상계좌 (입금전, 채번취소 시 사용)
|
||||
break;
|
||||
case '계좌이체':
|
||||
$ini_paymethod = 'Acct';
|
||||
break;
|
||||
case '휴대폰':
|
||||
$ini_paymethod = 'HPP';
|
||||
break;
|
||||
}
|
||||
|
||||
if (! $ini_paymethod) {
|
||||
if (is_inicis_order_pay($od_settle_case)) {
|
||||
$ini_paymethod = 'Card';
|
||||
}
|
||||
}
|
||||
|
||||
return $ini_paymethod;
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: Administrator
|
||||
* Date: 2015-11-05
|
||||
* Time: 오후 2:59
|
||||
*/
|
||||
|
||||
if (!function_exists('json_decode')) {
|
||||
function json_decode($content, $assoc=false) {
|
||||
require_once 'JSON.php';
|
||||
if ($assoc) {
|
||||
$json = new Services_JSON(SERVICES_JSON_LOOSE_TYPE);
|
||||
}
|
||||
else {
|
||||
$json = new Services_JSON;
|
||||
}
|
||||
return $json->decode($content);
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('json_encode')) {
|
||||
function json_encode($content) {
|
||||
require_once 'JSON.php';
|
||||
$json = new Services_JSON;
|
||||
return $json->encode($content);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
class properties {
|
||||
|
||||
function getAuthUrl($idc_name) {
|
||||
$url = "stdpay.inicis.com/api/payAuth";
|
||||
switch ($idc_name) {
|
||||
case 'fc':
|
||||
$authUrl = "https://fc".$url;
|
||||
break;
|
||||
case 'ks':
|
||||
$authUrl = "https://ks".$url;
|
||||
break;
|
||||
case 'stg':
|
||||
$authUrl = "https://stg".$url;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return $authUrl;
|
||||
}
|
||||
|
||||
function getNetCancel($idc_name) {
|
||||
$url = "stdpay.inicis.com/api/netCancel";
|
||||
switch ($idc_name) {
|
||||
case 'fc':
|
||||
$netCancel = "https://fc".$url;
|
||||
break;
|
||||
case 'ks':
|
||||
$netCancel = "https://ks".$url;
|
||||
break;
|
||||
case 'stg':
|
||||
$netCancel = "https://stg".$url;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return $netCancel;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,411 @@
|
||||
<?php
|
||||
/*
|
||||
* Transparent SHA-256 Implementation for PHP 4 and PHP 5
|
||||
*
|
||||
* Author: Perry McGee (pmcgee@nanolink.ca)
|
||||
* Website: http://www.nanolink.ca/pub/sha256
|
||||
*
|
||||
* Copyright (C) 2006,2007,2008,2009 Nanolink Solutions
|
||||
*
|
||||
* Created: Feb 11, 2006
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
* or see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Include:
|
||||
*
|
||||
* require_once("[path/]sha256.inc.php");
|
||||
*
|
||||
* Usage Options:
|
||||
*
|
||||
* 1) $shaStr = hash('sha256', $string_to_hash);
|
||||
*
|
||||
* 2) $shaStr = sha256($string_to_hash[, bool ignore_php5_hash = false]);
|
||||
*
|
||||
* 3) $obj = new nanoSha2([bool $upper_case_output = false]);
|
||||
* $shaStr = $obj->hash($string_to_hash[, bool $ignore_php5_hash = false]);
|
||||
*
|
||||
* Reference: http://csrc.nist.gov/groups/ST/toolkit/secure_hashing.html
|
||||
*
|
||||
* 2007-12-13: Cleaned up for initial public release
|
||||
* 2008-05-10: Moved all helper functions into a class. API access unchanged.
|
||||
* 2009-06-23: Created abstraction of hash() routine
|
||||
* 2009-07-23: Added detection of 32 vs 64bit platform, and patches.
|
||||
* Ability to define "_NANO_SHA2_UPPER" to yeild upper case hashes.
|
||||
* 2009-08-01: Added ability to attempt to use mhash() prior to running pure
|
||||
* php code.
|
||||
* 2022-05-19: PHP 8.1 부터 deprecate 되는 mhash() 삭제
|
||||
*
|
||||
* NOTE: Some sporadic versions of PHP do not handle integer overflows the
|
||||
* same as the majority of builds. If you get hash results of:
|
||||
* 7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff
|
||||
*
|
||||
* If you do not have permissions to change PHP versions (if you did
|
||||
* you'd probably upgrade to PHP 5 anyway) it is advised you install a
|
||||
* module that will allow you to use their hashing routines, examples are:
|
||||
* - mhash module : http://ca3.php.net/mhash
|
||||
* - Suhosin : http://www.hardened-php.net/suhosin/
|
||||
*
|
||||
* If you install the Suhosin module, this script will transparently
|
||||
* use their routine and define the PHP routine as _nano_sha256().
|
||||
*
|
||||
* If the mhash module is present, and $ignore_php5_hash = false the
|
||||
* script will attempt to use the output from mhash prior to running
|
||||
* the PHP code.
|
||||
*/
|
||||
if (!class_exists('nanoSha2'))
|
||||
{
|
||||
class nanoSha2
|
||||
{
|
||||
// php 4 - 5 compatable class properties
|
||||
var $toUpper;
|
||||
var $platform;
|
||||
|
||||
// Php 4 - 6 compatable constructor
|
||||
// PHP Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP
|
||||
// function nanoSha2($toUpper = false) {
|
||||
function __construct($toUpper = false) {
|
||||
// Determine if the caller wants upper case or not.
|
||||
$this->toUpper = is_bool($toUpper)
|
||||
? $toUpper
|
||||
: ((defined('_NANO_SHA2_UPPER')) ? true : false);
|
||||
|
||||
// Deteremine if the system is 32 or 64 bit.
|
||||
$tmpInt = (int)4294967295;
|
||||
$this->platform = ($tmpInt > 0) ? 64 : 32;
|
||||
}
|
||||
|
||||
// Do the SHA-256 Padding routine (make input a multiple of 512 bits)
|
||||
function char_pad($str)
|
||||
{
|
||||
$tmpStr = $str;
|
||||
|
||||
$l = strlen($tmpStr)*8; // # of bits from input string
|
||||
|
||||
$tmpStr .= "\x80"; // append the "1" bit followed by 7 0's
|
||||
|
||||
$k = (512 - (($l + 8 + 64) % 512)) / 8; // # of 0 bytes to append
|
||||
$k += 4; // PHP Strings will never exceed (2^31)-1, 1st 32bits of
|
||||
// the 64-bit value representing $l can be all 0's
|
||||
|
||||
for ($x = 0; $x < $k; $x++) {
|
||||
$tmpStr .= "\0";
|
||||
}
|
||||
|
||||
// append the 32-bits representing # of bits from input string ($l)
|
||||
$tmpStr .= chr((($l>>24) & 0xFF));
|
||||
$tmpStr .= chr((($l>>16) & 0xFF));
|
||||
$tmpStr .= chr((($l>>8) & 0xFF));
|
||||
$tmpStr .= chr(($l & 0xFF));
|
||||
|
||||
return $tmpStr;
|
||||
}
|
||||
|
||||
// Here are the bitwise and functions as defined in FIPS180-2 Standard
|
||||
function addmod2n($x, $y, $n = 4294967296) // Z = (X + Y) mod 2^32
|
||||
{
|
||||
$mask = 0x80000000;
|
||||
|
||||
if ($x < 0) {
|
||||
$x &= 0x7FFFFFFF;
|
||||
$x = (float)$x + $mask;
|
||||
}
|
||||
|
||||
if ($y < 0) {
|
||||
$y &= 0x7FFFFFFF;
|
||||
$y = (float)$y + $mask;
|
||||
}
|
||||
|
||||
$r = $x + $y;
|
||||
|
||||
if ($r >= $n) {
|
||||
while ($r >= $n) {
|
||||
$r -= $n;
|
||||
}
|
||||
}
|
||||
|
||||
return (int)$r;
|
||||
}
|
||||
|
||||
// Logical bitwise right shift (PHP default is arithmetic shift)
|
||||
function SHR($x, $n) // x >> n
|
||||
{
|
||||
if ($n >= 32) { // impose some limits to keep it 32-bit
|
||||
return (int)0;
|
||||
}
|
||||
|
||||
if ($n <= 0) {
|
||||
return (int)$x;
|
||||
}
|
||||
|
||||
$mask = 0x40000000;
|
||||
|
||||
if ($x < 0) {
|
||||
$x &= 0x7FFFFFFF;
|
||||
$mask = $mask >> ($n-1);
|
||||
return ($x >> $n) | $mask;
|
||||
}
|
||||
|
||||
return (int)$x >> (int)$n;
|
||||
}
|
||||
|
||||
function ROTR($x, $n) { return (int)(($this->SHR($x, $n) | ($x << (32-$n)) & 0xFFFFFFFF)); }
|
||||
function Ch($x, $y, $z) { return ($x & $y) ^ ((~$x) & $z); }
|
||||
function Maj($x, $y, $z) { return ($x & $y) ^ ($x & $z) ^ ($y & $z); }
|
||||
function Sigma0($x) { return (int) ($this->ROTR($x, 2)^$this->ROTR($x, 13)^$this->ROTR($x, 22)); }
|
||||
function Sigma1($x) { return (int) ($this->ROTR($x, 6)^$this->ROTR($x, 11)^$this->ROTR($x, 25)); }
|
||||
function sigma_0($x) { return (int) ($this->ROTR($x, 7)^$this->ROTR($x, 18)^$this->SHR($x, 3)); }
|
||||
function sigma_1($x) { return (int) ($this->ROTR($x, 17)^$this->ROTR($x, 19)^$this->SHR($x, 10)); }
|
||||
|
||||
/*
|
||||
* Custom functions to provide PHP support
|
||||
*/
|
||||
// split a byte-string into integer array values
|
||||
function int_split($input)
|
||||
{
|
||||
$l = strlen($input);
|
||||
|
||||
if ($l <= 0) {
|
||||
return (int)0;
|
||||
}
|
||||
|
||||
if (($l % 4) != 0) { // invalid input
|
||||
return false;
|
||||
}
|
||||
|
||||
for ($i = 0; $i < $l; $i += 4)
|
||||
{
|
||||
$int_build = (ord($input[$i]) << 24);
|
||||
$int_build += (ord($input[$i+1]) << 16);
|
||||
$int_build += (ord($input[$i+2]) << 8);
|
||||
$int_build += (ord($input[$i+3]));
|
||||
|
||||
$result[] = $int_build;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Process and return the hash.
|
||||
*
|
||||
* @param $str Input string to hash
|
||||
* @param $ig_func Option param to ignore checking for php > 5.1.2
|
||||
* @return string Hexadecimal representation of the message digest
|
||||
*/
|
||||
function hash($str, $ig_func = false)
|
||||
{
|
||||
unset($binStr); // binary representation of input string
|
||||
unset($hexStr); // 256-bit message digest in readable hex format
|
||||
|
||||
// check for php's internal sha256 function, ignore if ig_func==true
|
||||
if ($ig_func == false) {
|
||||
return hash("sha256", $str, false);
|
||||
}
|
||||
|
||||
/*
|
||||
* SHA-256 Constants
|
||||
* Sequence of sixty-four constant 32-bit words representing the
|
||||
* first thirty-two bits of the fractional parts of the cube roots
|
||||
* of the first sixtyfour prime numbers.
|
||||
*/
|
||||
$K = array((int)0x428a2f98, (int)0x71374491, (int)0xb5c0fbcf,
|
||||
(int)0xe9b5dba5, (int)0x3956c25b, (int)0x59f111f1,
|
||||
(int)0x923f82a4, (int)0xab1c5ed5, (int)0xd807aa98,
|
||||
(int)0x12835b01, (int)0x243185be, (int)0x550c7dc3,
|
||||
(int)0x72be5d74, (int)0x80deb1fe, (int)0x9bdc06a7,
|
||||
(int)0xc19bf174, (int)0xe49b69c1, (int)0xefbe4786,
|
||||
(int)0x0fc19dc6, (int)0x240ca1cc, (int)0x2de92c6f,
|
||||
(int)0x4a7484aa, (int)0x5cb0a9dc, (int)0x76f988da,
|
||||
(int)0x983e5152, (int)0xa831c66d, (int)0xb00327c8,
|
||||
(int)0xbf597fc7, (int)0xc6e00bf3, (int)0xd5a79147,
|
||||
(int)0x06ca6351, (int)0x14292967, (int)0x27b70a85,
|
||||
(int)0x2e1b2138, (int)0x4d2c6dfc, (int)0x53380d13,
|
||||
(int)0x650a7354, (int)0x766a0abb, (int)0x81c2c92e,
|
||||
(int)0x92722c85, (int)0xa2bfe8a1, (int)0xa81a664b,
|
||||
(int)0xc24b8b70, (int)0xc76c51a3, (int)0xd192e819,
|
||||
(int)0xd6990624, (int)0xf40e3585, (int)0x106aa070,
|
||||
(int)0x19a4c116, (int)0x1e376c08, (int)0x2748774c,
|
||||
(int)0x34b0bcb5, (int)0x391c0cb3, (int)0x4ed8aa4a,
|
||||
(int)0x5b9cca4f, (int)0x682e6ff3, (int)0x748f82ee,
|
||||
(int)0x78a5636f, (int)0x84c87814, (int)0x8cc70208,
|
||||
(int)0x90befffa, (int)0xa4506ceb, (int)0xbef9a3f7,
|
||||
(int)0xc67178f2);
|
||||
|
||||
// Pre-processing: Padding the string
|
||||
$binStr = $this->char_pad($str);
|
||||
|
||||
// Parsing the Padded Message (Break into N 512-bit blocks)
|
||||
$M = str_split($binStr, 64);
|
||||
|
||||
// Set the initial hash values
|
||||
$h[0] = (int)0x6a09e667;
|
||||
$h[1] = (int)0xbb67ae85;
|
||||
$h[2] = (int)0x3c6ef372;
|
||||
$h[3] = (int)0xa54ff53a;
|
||||
$h[4] = (int)0x510e527f;
|
||||
$h[5] = (int)0x9b05688c;
|
||||
$h[6] = (int)0x1f83d9ab;
|
||||
$h[7] = (int)0x5be0cd19;
|
||||
|
||||
// loop through message blocks and compute hash. ( For i=1 to N : )
|
||||
$N = count($M);
|
||||
for ($i = 0; $i < $N; $i++)
|
||||
{
|
||||
// Break input block into 16 32bit words (message schedule prep)
|
||||
$MI = $this->int_split($M[$i]);
|
||||
|
||||
// Initialize working variables
|
||||
$_a = (int)$h[0];
|
||||
$_b = (int)$h[1];
|
||||
$_c = (int)$h[2];
|
||||
$_d = (int)$h[3];
|
||||
$_e = (int)$h[4];
|
||||
$_f = (int)$h[5];
|
||||
$_g = (int)$h[6];
|
||||
$_h = (int)$h[7];
|
||||
unset($_s0);
|
||||
unset($_s1);
|
||||
unset($_T1);
|
||||
unset($_T2);
|
||||
$W = array();
|
||||
|
||||
// Compute the hash and update
|
||||
for ($t = 0; $t < 16; $t++)
|
||||
{
|
||||
// Prepare the first 16 message schedule values as we loop
|
||||
$W[$t] = $MI[$t];
|
||||
|
||||
// Compute hash
|
||||
$_T1 = $this->addmod2n($this->addmod2n($this->addmod2n($this->addmod2n($_h, $this->Sigma1($_e)), $this->Ch($_e, $_f, $_g)), $K[$t]), $W[$t]);
|
||||
$_T2 = $this->addmod2n($this->Sigma0($_a), $this->Maj($_a, $_b, $_c));
|
||||
|
||||
// Update working variables
|
||||
$_h = $_g; $_g = $_f; $_f = $_e; $_e = $this->addmod2n($_d, $_T1);
|
||||
$_d = $_c; $_c = $_b; $_b = $_a; $_a = $this->addmod2n($_T1, $_T2);
|
||||
}
|
||||
|
||||
for (; $t < 64; $t++)
|
||||
{
|
||||
// Continue building the message schedule as we loop
|
||||
$_s0 = $W[($t+1)&0x0F];
|
||||
$_s0 = $this->sigma_0($_s0);
|
||||
$_s1 = $W[($t+14)&0x0F];
|
||||
$_s1 = $this->sigma_1($_s1);
|
||||
|
||||
$W[$t&0xF] = $this->addmod2n($this->addmod2n($this->addmod2n($W[$t&0xF], $_s0), $_s1), $W[($t+9)&0x0F]);
|
||||
|
||||
// Compute hash
|
||||
$_T1 = $this->addmod2n($this->addmod2n($this->addmod2n($this->addmod2n($_h, $this->Sigma1($_e)), $this->Ch($_e, $_f, $_g)), $K[$t]), $W[$t&0xF]);
|
||||
$_T2 = $this->addmod2n($this->Sigma0($_a), $this->Maj($_a, $_b, $_c));
|
||||
|
||||
// Update working variables
|
||||
$_h = $_g; $_g = $_f; $_f = $_e; $_e = $this->addmod2n($_d, $_T1);
|
||||
$_d = $_c; $_c = $_b; $_b = $_a; $_a = $this->addmod2n($_T1, $_T2);
|
||||
}
|
||||
|
||||
$h[0] = $this->addmod2n($h[0], $_a);
|
||||
$h[1] = $this->addmod2n($h[1], $_b);
|
||||
$h[2] = $this->addmod2n($h[2], $_c);
|
||||
$h[3] = $this->addmod2n($h[3], $_d);
|
||||
$h[4] = $this->addmod2n($h[4], $_e);
|
||||
$h[5] = $this->addmod2n($h[5], $_f);
|
||||
$h[6] = $this->addmod2n($h[6], $_g);
|
||||
$h[7] = $this->addmod2n($h[7], $_h);
|
||||
}
|
||||
|
||||
// Convert the 32-bit words into human readable hexadecimal format.
|
||||
$hexStr = sprintf("%08x%08x%08x%08x%08x%08x%08x%08x", $h[0], $h[1], $h[2], $h[3], $h[4], $h[5], $h[6], $h[7]);
|
||||
|
||||
return ($this->toUpper) ? strtoupper($hexStr) : $hexStr;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('str_split'))
|
||||
{
|
||||
/**
|
||||
* Splits a string into an array of strings with specified length.
|
||||
* Compatability with older verions of PHP
|
||||
*/
|
||||
function str_split($string, $split_length = 1)
|
||||
{
|
||||
$sign = ($split_length < 0) ? -1 : 1;
|
||||
$strlen = strlen($string);
|
||||
$split_length = abs($split_length);
|
||||
|
||||
if (($split_length == 0) || ($strlen == 0)) {
|
||||
$result = false;
|
||||
} elseif ($split_length >= $strlen) {
|
||||
$result[] = $string;
|
||||
} else {
|
||||
$length = $split_length;
|
||||
|
||||
for ($i = 0; $i < $strlen; $i++)
|
||||
{
|
||||
$i = (($sign < 0) ? $i + $length : $i);
|
||||
$result[] = substr($string, $sign*$i, $length);
|
||||
$i--;
|
||||
$i = (($sign < 0) ? $i : $i + $length);
|
||||
|
||||
$length = (($i + $split_length) > $strlen)
|
||||
? ($strlen - ($i + 1))
|
||||
: $split_length;
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Main routine called from an application using this include.
|
||||
*
|
||||
* General usage:
|
||||
* require_once('sha256.inc.php');
|
||||
* $hashstr = sha256('abc');
|
||||
*
|
||||
* Note:
|
||||
* PHP Strings are limitd to (2^31)-1, so it is not worth it to
|
||||
* check for input strings > 2^64 as the FIPS180-2 defines.
|
||||
*/
|
||||
// 2009-07-23: Added check for function as the Suhosin plugin adds this routine.
|
||||
if (!function_exists('sha256')) {
|
||||
function sha256($str, $ig_func = false) {
|
||||
$obj = new nanoSha2((defined('_NANO_SHA2_UPPER')) ? true : false);
|
||||
return $obj->hash($str, $ig_func);
|
||||
}
|
||||
} else {
|
||||
function _nano_sha256($str, $ig_func = false) {
|
||||
$obj = new nanoSha2((defined('_NANO_SHA2_UPPER')) ? true : false);
|
||||
return $obj->hash($str, $ig_func);
|
||||
}
|
||||
}
|
||||
|
||||
// support to give php4 the hash() routine which abstracts this code.
|
||||
if (!function_exists('hash'))
|
||||
{
|
||||
function hash($algo, $data)
|
||||
{
|
||||
if (empty($algo) || !is_string($algo) || !is_string($data)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (function_exists($algo)) {
|
||||
return $algo($data);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user