| @ -0,0 +1,50 @@ | |||
| <?php | |||
| namespace p3k\XRay; | |||
| trait HTTPSig { | |||
| protected function _headersToSigningString($headers) { | |||
| return implode("\n", array_map(function($k, $v){ | |||
| return strtolower($k).': '.$v; | |||
| }, array_keys($headers), $headers)); | |||
| } | |||
| protected function _headersToCurlArray($headers) { | |||
| return array_map(function($k, $v){ | |||
| return "$k: $v"; | |||
| }, array_keys($headers), $headers); | |||
| } | |||
| protected function _digest($payload) { | |||
| return base64_encode(hash('sha256', $payload, true)); | |||
| } | |||
| protected function _headersToSign($target, $date) { | |||
| $headers = [ | |||
| '(request-target)' => 'get '.parse_url($target, PHP_URL_PATH), | |||
| 'Date' => $date, | |||
| 'Host' => parse_url($target, PHP_URL_HOST), | |||
| 'Content-Type' => 'application/activity+json', | |||
| ]; | |||
| return $headers; | |||
| } | |||
| protected function _httpSign(&$headers, $key) { | |||
| $stringToSign = $this->_headersToSigningString($headers); | |||
| $signedHeaders = implode(' ', array_map('strtolower', array_keys($headers))); | |||
| $privateKey = openssl_pkey_get_private('file://'.$key['key']); | |||
| openssl_sign($stringToSign, $signature, $privateKey, OPENSSL_ALGO_SHA256); | |||
| $signature = base64_encode($signature); | |||
| $signatureHeader = 'keyId="'.$key['keyId'].'",headers="'.$signedHeaders.'",algorithm="rsa-sha256",signature="'.$signature.'"'; | |||
| unset($headers['(request-target)']); | |||
| $headers['Signature'] = $signatureHeader; | |||
| } | |||
| } | |||