class HmacUtil {
private $secret_key = 'test_secret_key';
private $algorithm = 'sha256';
public function __construct($params = array()) {}
public function signature($method, $uri, $hmac_datetime, $encoded_query_string, $payload) {
$sign_str = $this->string_to_sign($method, $uri, $hmac_datetime, $encoded_query_string, $payload);
$signature = $this->sign($sign_str);
return $signature;
}
public function hmac_datetime() {
$datetime = date('c');
return $datetime;
}
public function valid($method, $uri, $hmac_datetime, $encoded_query_string, $payload, $signature) {
$new_signature = $this->signature($method, $uri, $hmac_datetime, $encoded_query_string, $payload);
if($new_signature != $signature) return FALSE;
$two_minute_ago = date("c", strtotime("-2 minutes", strtotime(date("Y-m-d H:i:s"))));
if($two_minute_ago > $hmac_datetime) return FALSE;
return TRUE;
}
private function sorted_query_string($encoded_query_string) {
parse_str($encoded_query_string, $parse_uri_query_string);
sort($parse_uri_query_string);
$encoded_uri = str_replace('+', '%20', http_build_query($parse_uri_query_string));
return $encoded_uri;
}
private function sign($string_to_sign) {
$raw_hmac = hash_hmac($this->algorithm, $string_to_sign, $this->secret_key);
$signed = base64_encode($raw_hmac);
return $signed;
}
private function payload_hash($payload) {
$payload = hash('SHA256', $payload);
return $payload;
}
private function string_to_sign($method, $uri, $hmac_datetime, $encoded_query_string, $payload) {
$sign = $method."\n".$uri."\n".$hmac_datetime."\n".$this->sorted_query_string($encoded_query_string)."\n".$this->payload_hash($payload);
return $sign;
}
}