1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
<?php
namespace Eher\OAuth\SignatureMethod;
/** * The RSA-SHA1 signature method uses the RSASSA-PKCS1-v1_5 signature algorithm as defined in * [RFC3447] section 8.2 (more simply known as PKCS#1), using SHA-1 as the hash function for * EMSA-PKCS1-v1_5. It is assumed that the Consumer has provided its RSA public key in a * verified way to the Service Provider, in a manner which is beyond the scope of this * specification. * - Chapter 9.3 ("RSA-SHA1") */ abstract class RsaSha1 extends SignatureMethod { public function get_name() { return "RSA-SHA1"; }
// Up to the SP to implement this lookup of keys. Possible ideas are: // (1) do a lookup in a table of trusted certs keyed off of consumer // (2) fetch via http using a url provided by the requester // (3) some sort of specific discovery code based on request // // Either way should return a string representation of the certificate protected abstract function fetch_public_cert(&$request);
// Up to the SP to implement this lookup of keys. Possible ideas are: // (1) do a lookup in a table of trusted certs keyed off of consumer // // Either way should return a string representation of the certificate protected abstract function fetch_private_cert(&$request);
public function build_signature($request, $consumer, $token) { $base_string = $request->get_signature_base_string(); $request->base_string = $base_string;
// Fetch the private key cert based on the request $cert = $this->fetch_private_cert($request);
// Pull the private key ID from the certificate $privatekeyid = openssl_get_privatekey($cert);
// Sign using the key $ok = openssl_sign($base_string, $signature, $privatekeyid);
// Release the key resource openssl_free_key($privatekeyid);
return base64_encode($signature); }
public function check_signature($request, $consumer, $token, $signature) { $decoded_sig = base64_decode($signature);
$base_string = $request->get_signature_base_string();
// Fetch the public key cert based on the request $cert = $this->fetch_public_cert($request);
// Pull the public key ID from the certificate $publickeyid = openssl_get_publickey($cert);
// Check the computed signature against the one passed in the query $ok = openssl_verify($base_string, $decoded_sig, $publickeyid);
// Release the key resource openssl_free_key($publickeyid);
return $ok == 1; } }
|