Subversion Repositories cheapmusic

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
25 - 1
<?php
2
/*
3
 * Copyright 2011 Google Inc.
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at
8
 *
9
 *     http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 */
17
 
18
/**
19
 * Signs data.
20
 *
21
 * Only used for testing.
22
 *
23
 * @author Brian Eaton <beaton@google.com>
24
 */
25
class Google_P12Signer extends Google_Signer {
26
  // OpenSSL private key resource
27
  private $privateKey;
28
 
29
  // Creates a new signer from a .p12 file.
30
  function __construct($p12, $password) {
31
    if (!function_exists('openssl_x509_read')) {
32
      throw new Exception(
33
          'The Google PHP API library needs the openssl PHP extension');
34
    }
35
 
36
    // This throws on error
37
    $certs = array();
38
    if (!openssl_pkcs12_read($p12, $certs, $password)) {
39
      throw new Google_AuthException("Unable to parse the p12 file.  " .
40
          "Is this a .p12 file?  Is the password correct?  OpenSSL error: " .
41
          openssl_error_string());
42
    }
43
    // TODO(beaton): is this part of the contract for the openssl_pkcs12_read
44
    // method?  What happens if there are multiple private keys?  Do we care?
45
    if (!array_key_exists("pkey", $certs) || !$certs["pkey"]) {
46
      throw new Google_AuthException("No private key found in p12 file.");
47
    }
48
    $this->privateKey = openssl_pkey_get_private($certs["pkey"]);
49
    if (!$this->privateKey) {
50
      throw new Google_AuthException("Unable to load private key in ");
51
    }
52
  }
53
 
54
  function __destruct() {
55
    if ($this->privateKey) {
56
      openssl_pkey_free($this->privateKey);
57
    }
58
  }
59
 
60
  function sign($data) {
61
    if(version_compare(PHP_VERSION, '5.3.0') < 0) {
62
      throw new Google_AuthException(
63
        "PHP 5.3.0 or higher is required to use service accounts.");
64
    }
65
    if (!openssl_sign($data, $signature, $this->privateKey, "sha256")) {
66
      throw new Google_AuthException("Unable to sign data");
67
    }
68
    return $signature;
69
  }
70
}