Subversion Repositories oidplus

Rev

Blame | Last modification | View Log | RSS feed

  1. <?php
  2. /**
  3.  * JWS-RSA example
  4.  * Usage:
  5.  *  1. Generate two key/certificate pairs - run from examples/cert dir:
  6.  *     $ ./create-cert.sh one 365
  7.  *     $ ./create-cert.sh two 365
  8.  *     This will create "prv-one.key"/"pub-one.crt" and "prv-two.key"/"pub-two.crt" pairs in examples/cert dir.
  9.  *  2. Run from examples dir:
  10.  *     $ php ./jws-rsa.php
  11.  */
  12.  
  13. use SBrook\JWS\JwsRsa;
  14. use SBrook\JWS\Exception\JwsException;
  15.  
  16. // Stand-alone:
  17. require_once("../src/autoload.php");
  18. // Composer:
  19. //require_once("../vendor/autoload.php");
  20.  
  21. $exitCode = 0;
  22.  
  23. $prvOne = "file://./cert/prv-one.key";
  24. $prvOnePass = "password";
  25.  
  26. $pubOne = "file://./cert/pub-one.crt";
  27. $pubTwo = "file://./cert/pub-two.crt";
  28.  
  29. // For JWS registered header parameter names see (RFC 7515, Section 4.1)
  30. $header = [
  31.         "typ" => "TXT",
  32.         "ts0" => "",
  33.         "ts1" => 0,
  34.         "ts2" => false,
  35.         "ts3" => null,
  36.         "ts4" => chr(32),
  37.         "ts5" => chr(7)
  38. ];
  39.  
  40. $payloadOne = "Original message content";
  41. $payloadTwo = "Fake message content";
  42.  
  43. try {
  44.         // Create JwsRsa instance:
  45.         $jws = new JwsRsa();
  46.  
  47.  
  48.         // Create original message from $payloadOne and sign with private key $prvOne:
  49.         $jws->setPrivateKey($prvOne, $prvOnePass);
  50.         $message = $jws->sign($payloadOne, $header);
  51.         echo "\nOriginal message:\n";
  52.         echo "--- BEGIN JWS ---\n$message\n---- END JWS ----\n";
  53.  
  54.         // Get original message header:
  55.         $h = $jws->getHeader($message);
  56.         // JSON encode just to more clearly show the values:
  57.         echo "\nHeader => " . json_encode($h) . "\n";
  58.  
  59.         // Get original message payload:
  60.         $p = $jws->getPayload($message);
  61.         echo "\nPayload => \"$p\"\n";
  62.  
  63.         // Verify original message with right public key $pubOne:
  64.         $jws->setPublicKey($pubOne);
  65.         $v = $jws->verify($message);
  66.         echo "\nVerifying original message with right public key:\n";
  67.         echo "Message is " . ($v ? "VALID" : "INVALID") . "\n";
  68.  
  69.         // Verify original message with wrong public key $pubTwo:
  70.         $jws->setPublicKey($pubTwo);
  71.         $v = $jws->verify($message);
  72.         echo "\nVerifying original message with wrong public key:\n";
  73.         echo "Message is " . ($v ? "VALID" : "INVALID") . "\n";
  74.  
  75.  
  76.         echo "\n" . str_repeat("=", 80) . "\n";
  77.         // Now, let's manipulate original message by putting a fake content into it:
  78.  
  79.         // Get header and signature from original message:
  80.         list($h, , $s) = explode(".", $message);
  81.         // Rebuild message with fake payload $payloadTwo:
  82.         $fakeMessage = $h . "." . base64_encode($payloadTwo) . "." . $s;
  83.         echo "\nFake message:\n";
  84.         echo "--- BEGIN JWS ---\n$fakeMessage\n---- END JWS ----\n";
  85.  
  86.         // Get fake message payload:
  87.         $p = $jws->getPayload($fakeMessage);
  88.         echo "\nPayload => \"$p\"\n";
  89.  
  90.         // Verify fake message with right public key $pubOne:
  91.         $jws->setPublicKey($pubOne);
  92.         $v = $jws->verify($fakeMessage);
  93.         echo "\nVerifying fake message with right public key:\n";
  94.         echo "Message is " . ($v ? "VALID" : "INVALID") . "\n";
  95.  
  96. } catch (JwsException $e) {
  97.         $exitCode = 1;
  98.  
  99.         do {
  100.                 echo "Error (".$e->getCode()."): ".$e->getMessage()."\n\tIn file: ".$e->getFile()." line: ".$e->getLine()."\n";
  101.         } while ($e = $e->getPrevious());
  102. }
  103.  
  104. exit($exitCode);
  105.  
  106.