diff --git a/src/BeSimple/SoapCommon/WsSecurityKey.php b/src/BeSimple/SoapCommon/WsSecurityKey.php new file mode 100644 index 0000000..6eaf908 --- /dev/null +++ b/src/BeSimple/SoapCommon/WsSecurityKey.php @@ -0,0 +1,114 @@ + + * (c) Francis Besset + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace BeSimple\SoapCommon; + +use ass\XmlSecurity\Key as XmlSecurityKey; + +/** + * This class represents a security key for WS-Security (WSS). + * + * @author Andreas Schamberger + */ +class WsSecurityKey +{ + /** + * Private key. + * + * @var \ass\XmlSecurity\Key + */ + protected $privateKey = null; + + /** + * Public key. + * + * @var \ass\XmlSecurity\Key + */ + protected $publicKey = null; + + /** + * Add private key. + * + * @param string $encryptionType Encryption type + * @param string $key Private key + * @param boolean $keyIsFile Given key parameter is path to key file + * @param string $passphrase Passphrase for key + * @return void + */ + public function addPrivateKey($encryptionType, $key = null, $keyIsFile = true, $passphrase = null) + { + $this->privateKey = XmlSecurityKey::factory($encryptionType, $key, $keyIsFile, XmlSecurityKey::TYPE_PRIVATE, $passphrase); + } + + /** + * Add public key. + * + * @param string $encryptionType Encryption type + * @param string $key Public key + * @param boolean $keyIsFile Given key parameter is path to key file + * @return void + */ + public function addPublicKey($encryptionType, $key = null, $keyIsFile = true) + { + $this->publicKey = XmlSecurityKey::factory($encryptionType, $key, $keyIsFile, XmlSecurityKey::TYPE_PUBLIC); + } + + /** + * Get private key. + * + * @return \ass\XmlSecurity\Key + */ + public function getPrivateKey() + { + return $this->privateKey; + } + + /** + * Get public key. + * + * @return \ass\XmlSecurity\Key + */ + public function getPublicKey() + { + return $this->publicKey; + } + + /** + * Has private and public key? + * + * @return boolean + */ + public function hasKeys() + { + return !is_null($this->privateKey) && !is_null($this->publicKey); + } + + /** + * Has private key? + * + * @return boolean + */ + public function hasPrivateKey() + { + return !is_null($this->privateKey); + } + + /** + * Has public key? + * + * @return boolean + */ + public function hasPublicKey() + { + return !is_null($this->publicKey); + } +} \ No newline at end of file diff --git a/tests/BeSimple/Tests/SoapCommon/Fixtures/clientcert.pem b/tests/BeSimple/Tests/SoapCommon/Fixtures/clientcert.pem new file mode 100644 index 0000000..f433d48 --- /dev/null +++ b/tests/BeSimple/Tests/SoapCommon/Fixtures/clientcert.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICoDCCAgkCBEnhw2IwDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNVBAYTAk5aMRMw +EQYDVQQIEwpXZWxsaW5ndG9uMRowGAYDVQQHExFQYXJhcGFyYXVtdSBCZWFjaDEq +MCgGA1UEChMhU29zbm9za2kgU29mdHdhcmUgQXNzb2NpYXRlcyBMdGQuMRAwDgYD +VQQLEwdVbmtub3duMRgwFgYDVQQDEw9EZW5uaXMgU29zbm9za2kwHhcNMDkwNDEy +MTAzMzA2WhcNMzYwODI3MTAzMzA2WjCBljELMAkGA1UEBhMCTloxEzARBgNVBAgT +CldlbGxpbmd0b24xGjAYBgNVBAcTEVBhcmFwYXJhdW11IEJlYWNoMSowKAYDVQQK +EyFTb3Nub3NraSBTb2Z0d2FyZSBBc3NvY2lhdGVzIEx0ZC4xEDAOBgNVBAsTB1Vu +a25vd24xGDAWBgNVBAMTD0Rlbm5pcyBTb3Nub3NraTCBnzANBgkqhkiG9w0BAQEF +AAOBjQAwgYkCgYEAhOVyNK8xyxtb4DnKtU6mF9KoiFqCk7eKoLE26+9h410CtTkx +zWAfgnR+8i+LPbdsPY+yXAo6NYpCCKolXfDLe+AG2GwnMZGrIl6+BLF3hqTmIXBF +TLGUmC7A7uBTivaWgdH1w3hb33rASoVU67BVtQ3QQi99juZX4vU9o9pScocCAwEA +ATANBgkqhkiG9w0BAQUFAAOBgQBMNPo1KAGbz8Jl6HGbtAcetieSJ3bEAXmv1tcj +ysBS67AXzdu1Ac+onHh2EpzBM7kuGbw+trU+AhulooPpewIQRApXP1F0KHRDcbqW +jwvknS6HnomN9572giLGKn2601bHiRUj35hiA8aLmMUBppIRPFFAoQ0QUBCPx+m8 +/0n33w== +-----END CERTIFICATE----- diff --git a/tests/BeSimple/Tests/SoapCommon/Fixtures/clientkey.pem b/tests/BeSimple/Tests/SoapCommon/Fixtures/clientkey.pem new file mode 100644 index 0000000..a47f923 --- /dev/null +++ b/tests/BeSimple/Tests/SoapCommon/Fixtures/clientkey.pem @@ -0,0 +1,14 @@ +-----BEGIN PRIVATE KEY----- +MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAITlcjSvMcsbW+A5yrVOphfSqIha +gpO3iqCxNuvvYeNdArU5Mc1gH4J0fvIviz23bD2PslwKOjWKQgiqJV3wy3vgBthsJzGRqyJevgSx +d4ak5iFwRUyxlJguwO7gU4r2loHR9cN4W996wEqFVOuwVbUN0EIvfY7mV+L1PaPaUnKHAgMBAAEC +gYAZ6UqtLwN8YGc3fs0hMKZ9upsViuAuwPiMgED/G3twgzAF+ZLWQkmie+hMfCyf6eV200+pVm0n +Bz/8xH/oowxpX0Kk3szoB4vFghjU84GKUcrbhu/NRIm7l3drnfbzqhQkHDCx6n1CotI4Gs49cDWu +4uEAuxJkEIVY553unZjZgQJBAOJVIallNKmD0iQlvtWRmRzpmYDjt9vhNY6WBTIOx6SDn9SRaoSA +fkipQ2HXo04r78TQ674+zfZ1lRTkFG7px6ECQQCWUPHp3pSZOM1oGzJrNvNaw+MizZAZjq34npHm +9GRquFLG7BlCaI9QNGE7pN2ryYsYCRUMaM2e4GR0tUXxVGknAkAgrxqFU9AfCqI2Bh1gyf3KZxF7 +w2axofwR8ygc6nV6FGfoUneHWubhp0/LuVAj4cRmL6Vbe8ZSaPh2Y9lviuMBAkEAicP8Q+1E4j1m +PPEYP51oYprANOiUFmhnWEL00+jPk+QFsd03tV6hYs/vAbwzkjuwqMHCMdJoCiH8z95IEUvc5wJA +MvLOuZdu4dmhOXg/YKsbMSPjFNEVskLQNSXqw6O2wIrpPg1NQvBBAOTbiuZj3vind4VPos1wc4vB +QocvdUC6dA== +-----END PRIVATE KEY----- diff --git a/tests/BeSimple/Tests/SoapCommon/Fixtures/servercert.pem b/tests/BeSimple/Tests/SoapCommon/Fixtures/servercert.pem new file mode 100644 index 0000000..040b22c --- /dev/null +++ b/tests/BeSimple/Tests/SoapCommon/Fixtures/servercert.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICoDCCAgkCBEnhwzMwDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNVBAYTAk5aMRMw +EQYDVQQIEwpXZWxsaW5ndG9uMRowGAYDVQQHExFQYXJhcGFyYXVtdSBCZWFjaDEq +MCgGA1UEChMhU29zbm9za2kgU29mdHdhcmUgQXNzb2NpYXRlcyBMdGQuMRAwDgYD +VQQLEwdVbmtub3duMRgwFgYDVQQDEw9EZW5uaXMgU29zbm9za2kwHhcNMDkwNDEy +MTAzMjE5WhcNMzYwODI3MTAzMjE5WjCBljELMAkGA1UEBhMCTloxEzARBgNVBAgT +CldlbGxpbmd0b24xGjAYBgNVBAcTEVBhcmFwYXJhdW11IEJlYWNoMSowKAYDVQQK +EyFTb3Nub3NraSBTb2Z0d2FyZSBBc3NvY2lhdGVzIEx0ZC4xEDAOBgNVBAsTB1Vu +a25vd24xGDAWBgNVBAMTD0Rlbm5pcyBTb3Nub3NraTCBnzANBgkqhkiG9w0BAQEF +AAOBjQAwgYkCgYEA1H3mjQCF9uce2jmm/Yq9kE4ytfvkp4c8G90cDfJXJvOiGQds +p2vDZXKuCkHQ7vsBBXPNTt8J/d8ZbEwyuB9Ccz5pJqi6Ig6Y2/mEsPthDyh5SrJV +yQ/wxUGwmfSuwdrIMnplMTq+OR9BOfT3CvjSvuy9d6BQNo4wOMkDvmZTtI8CAwEA +ATANBgkqhkiG9w0BAQUFAAOBgQCqv4475QaqlKcN2QCZJbLVKZEX+76XLQurGkgf +2fCgesRHjfUfOHyTTlhWQdEKTcBB2XviUyyW6I//fmKfXUIiQqvgh4LHdXRPEXDf +Y9nr89MjyQpDlnl6AlrvSej30a9iwVRUeVk4d6gxWHMRonKBFgh+TGexxUXHtPkf +B1Pdtg== +-----END CERTIFICATE----- diff --git a/tests/BeSimple/Tests/SoapCommon/WsSecurityKeyTest.php b/tests/BeSimple/Tests/SoapCommon/WsSecurityKeyTest.php new file mode 100644 index 0000000..3571d3c --- /dev/null +++ b/tests/BeSimple/Tests/SoapCommon/WsSecurityKeyTest.php @@ -0,0 +1,119 @@ + + * (c) Francis Besset + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace BeSimple\Tests\SoapCommon\Soap; + +use BeSimple\SoapCommon\WsSecurityKey; +use ass\XmlSecurity\Key as XmlSecurityKey; + +class WsSecurityKeyTest extends \PHPUnit_Framework_TestCase +{ + public function testHasKeys() + { + $wsk = new WsSecurityKey(); + + $filename = __DIR__.DIRECTORY_SEPARATOR.'Fixtures/clientkey.pem'; + $wsk->addPrivateKey(\ass\XmlSecurity\Key::RSA_SHA1, $filename); + $filename = __DIR__.DIRECTORY_SEPARATOR.'Fixtures/clientcert.pem'; + $wsk->addPublicKey(\ass\XmlSecurity\Key::RSA_SHA1, $filename); + + $this->assertTrue($wsk->hasKeys()); + $this->assertTrue($wsk->hasPrivateKey()); + $this->assertTrue($wsk->hasPublicKey()); + } + + public function testHasKeysNone() + { + $wsk = new WsSecurityKey(); + + $this->assertFalse($wsk->hasKeys()); + $this->assertFalse($wsk->hasPrivateKey()); + $this->assertFalse($wsk->hasPublicKey()); + } + + public function testHasPrivateKey() + { + $wsk = new WsSecurityKey(); + + $filename = __DIR__.DIRECTORY_SEPARATOR.'Fixtures/clientkey.pem'; + $wsk->addPrivateKey(\ass\XmlSecurity\Key::RSA_SHA1, $filename); + + $this->assertFalse($wsk->hasKeys()); + $this->assertTrue($wsk->hasPrivateKey()); + } + + public function testHasPublicKey() + { + $wsk = new WsSecurityKey(); + + $filename = __DIR__.DIRECTORY_SEPARATOR.'Fixtures/clientcert.pem'; + $wsk->addPublicKey(\ass\XmlSecurity\Key::RSA_SHA1, $filename); + + $this->assertFalse($wsk->hasKeys()); + $this->assertTrue($wsk->hasPublicKey()); + } + + public function testAddPrivateKey() + { + $wsk = new WsSecurityKey(); + + $filename = __DIR__.DIRECTORY_SEPARATOR.'Fixtures/clientkey.pem'; + $wsk->addPrivateKey(\ass\XmlSecurity\Key::RSA_SHA1, $filename); + + $this->assertTrue($wsk->hasPrivateKey()); + $this->assertInstanceOf('ass\XmlSecurity\Key', $wsk->getPrivateKey()); + } + + public function testAddPrivateKeySessionKey() + { + $wsk = new WsSecurityKey(); + + $filename = __DIR__.DIRECTORY_SEPARATOR.'Fixtures/clientkey.pem'; + $wsk->addPrivateKey(\ass\XmlSecurity\Key::TRIPLEDES_CBC); + + $this->assertTrue($wsk->hasPrivateKey()); + $this->assertInstanceOf('ass\XmlSecurity\Key', $wsk->getPrivateKey()); + } + + public function testAddPrivateKeyNoFile() + { + $wsk = new WsSecurityKey(); + + $filename = __DIR__.DIRECTORY_SEPARATOR.'Fixtures/clientkey.pem'; + $wsk->addPrivateKey(\ass\XmlSecurity\Key::RSA_SHA1, file_get_contents($filename), false); + + $this->assertTrue($wsk->hasPrivateKey()); + $this->assertInstanceOf('ass\XmlSecurity\Key', $wsk->getPrivateKey()); + } + + public function testAddPublicKey() + { + $wsk = new WsSecurityKey(); + + $filename = __DIR__.DIRECTORY_SEPARATOR.'Fixtures/clientcert.pem'; + $wsk->addPublicKey(\ass\XmlSecurity\Key::RSA_SHA1, $filename); + + $this->assertTrue($wsk->hasPublicKey()); + $this->assertInstanceOf('ass\XmlSecurity\Key', $wsk->getPublicKey()); + } + + public function testAddPublicKeyNoFile() + { + $wsk = new WsSecurityKey(); + + $filename = __DIR__.DIRECTORY_SEPARATOR.'Fixtures/clientcert.pem'; + $wsk->addPublicKey(\ass\XmlSecurity\Key::RSA_SHA1, file_get_contents($filename), false); + + $this->assertTrue($wsk->hasPublicKey()); + $this->assertInstanceOf('ass\XmlSecurity\Key', $wsk->getPublicKey()); + } +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 69c30f0..f2d913c 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -12,7 +12,14 @@ spl_autoload_register(function($class) { return true; } } elseif (0 === strpos($class, 'BeSimple\SoapCommon\\')) { - $path = __DIR__.'/../src/'.($class = strtr($class, '\\', '/')).'.php'; + $path = __DIR__.'/../src/'.strtr($class, '\\', '/').'.php'; + if (file_exists($path) && is_readable($path)) { + require_once $path; + + return true; + } + } elseif (0 === strpos($class, 'ass\XmlSecurity\\')) { + $path = __DIR__.'/../vendor/XmlSecurity/src/'.strtr($class, '\\', '/').'.php'; if (file_exists($path) && is_readable($path)) { require_once $path; diff --git a/vendors.php b/vendors.php old mode 100755 new mode 100644 index 7f127b0..6180e27 --- a/vendors.php +++ b/vendors.php @@ -25,6 +25,7 @@ if (!is_dir($vendorDir = dirname(__FILE__).'/vendor')) { $deps = array( array('vfsStream', 'https://github.com/mikey179/vfsStream.git', 'RELEASE-0.10.1'), + array('XmlSecurity', 'https://github.com/aschamberger/XmlSecurity.git', 'origin/HEAD'), ); foreach ($deps as $dep) {