RsaTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. <?php
  2. require_once 'Zend/Crypt/Rsa.php';
  3. require_once 'PHPUnit/Framework/TestCase.php';
  4. class Zend_Crypt_RsaTest extends PHPUnit_Framework_TestCase
  5. {
  6. protected $_testPemString = null;
  7. protected $_testPemPath = null;
  8. public function setup()
  9. {
  10. $this->_testPemString = <<<RSAKEY
  11. -----BEGIN RSA PRIVATE KEY-----
  12. MIIBOgIBAAJBANDiE2+Xi/WnO+s120NiiJhNyIButVu6zxqlVzz0wy2j4kQVUC4Z
  13. RZD80IY+4wIiX2YxKBZKGnd2TtPkcJ/ljkUCAwEAAQJAL151ZeMKHEU2c1qdRKS9
  14. sTxCcc2pVwoAGVzRccNX16tfmCf8FjxuM3WmLdsPxYoHrwb1LFNxiNk1MXrxjH3R
  15. 6QIhAPB7edmcjH4bhMaJBztcbNE1VRCEi/bisAwiPPMq9/2nAiEA3lyc5+f6DEIJ
  16. h1y6BWkdVULDSM+jpi1XiV/DevxuijMCIQCAEPGqHsF+4v7Jj+3HAgh9PU6otj2n
  17. Y79nJtCYmvhoHwIgNDePaS4inApN7omp7WdXyhPZhBmulnGDYvEoGJN66d0CIHra
  18. I2SvDkQ5CmrzkW5qPaE2oO7BSqAhRZxiYpZFb5CI
  19. -----END RSA PRIVATE KEY-----
  20. RSAKEY;
  21. $this->_testPemStringPublic = <<<RSAKEY
  22. -----BEGIN PUBLIC KEY-----
  23. MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANDiE2+Xi/WnO+s120NiiJhNyIButVu6
  24. zxqlVzz0wy2j4kQVUC4ZRZD80IY+4wIiX2YxKBZKGnd2TtPkcJ/ljkUCAwEAAQ==
  25. -----END PUBLIC KEY-----
  26. RSAKEY;
  27. $this->_testCertificateString = <<<CERT
  28. -----BEGIN CERTIFICATE-----
  29. MIIC6TCCApOgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBhzELMAkGA1UEBhMCSUUx
  30. DzANBgNVBAgTBkR1YmxpbjEPMA0GA1UEBxMGRHVibGluMQ4wDAYDVQQKEwVHcm91
  31. cDERMA8GA1UECxMIU3ViZ3JvdXAxEzARBgNVBAMTCkpvZSBCbG9nZ3MxHjAcBgkq
  32. hkiG9w0BCQEWD2pvZUBleGFtcGxlLmNvbTAeFw0wODA2MTMwOTQ4NDlaFw0xMTA2
  33. MTMwOTQ4NDlaMIGHMQswCQYDVQQGEwJJRTEPMA0GA1UECBMGRHVibGluMQ8wDQYD
  34. VQQHEwZEdWJsaW4xDjAMBgNVBAoTBUdyb3VwMREwDwYDVQQLEwhTdWJncm91cDET
  35. MBEGA1UEAxMKSm9lIEJsb2dnczEeMBwGCSqGSIb3DQEJARYPam9lQGV4YW1wbGUu
  36. Y29tMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANDiE2+Xi/WnO+s120NiiJhNyIBu
  37. tVu6zxqlVzz0wy2j4kQVUC4ZRZD80IY+4wIiX2YxKBZKGnd2TtPkcJ/ljkUCAwEA
  38. AaOB5zCB5DAdBgNVHQ4EFgQUxpguR0f4g+502IxAp3aMZvJ6asMwgbQGA1UdIwSB
  39. rDCBqYAUxpguR0f4g+502IxAp3aMZvJ6asOhgY2kgYowgYcxCzAJBgNVBAYTAklF
  40. MQ8wDQYDVQQIEwZEdWJsaW4xDzANBgNVBAcTBkR1YmxpbjEOMAwGA1UEChMFR3Jv
  41. dXAxETAPBgNVBAsTCFN1Ymdyb3VwMRMwEQYDVQQDEwpKb2UgQmxvZ2dzMR4wHAYJ
  42. KoZIhvcNAQkBFg9qb2VAZXhhbXBsZS5jb22CAQAwDAYDVR0TBAUwAwEB/zANBgkq
  43. hkiG9w0BAQQFAANBAE4M7ZXJTDLHEFguGaP5g64lbmLmLtYX22ZaNY891FmxhtKm
  44. l9Nwj3KnPKFdqzJchujP2TLNwSYoQnxgyoMxdho=
  45. -----END CERTIFICATE-----
  46. CERT;
  47. $this->_testPemPath = dirname(__FILE__) . '/_files/test.pem';
  48. $this->_testCertificatePath = dirname(__FILE__) . '/_files/test.cert';
  49. }
  50. public function testConstructorSetsPemString()
  51. {
  52. $rsa = new Zend_Crypt_Rsa(array('pemString'=>$this->_testPemString));
  53. $this->assertEquals($this->_testPemString, $rsa->getPemString());
  54. }
  55. public function testConstructorSetsPemPath()
  56. {
  57. $rsa = new Zend_Crypt_Rsa(array('pemPath'=>$this->_testPemPath));
  58. $this->assertEquals($this->_testPemPath, $rsa->getPemPath());
  59. }
  60. public function testSetPemPathLoadsPemString()
  61. {
  62. $rsa = new Zend_Crypt_Rsa(array('pemPath'=>$this->_testPemPath));
  63. $this->assertEquals($this->_testPemString, $rsa->getPemString());
  64. }
  65. public function testConstructorSetsCertificateString()
  66. {
  67. $rsa = new Zend_Crypt_Rsa(array('certificateString'=>$this->_testCertificateString));
  68. $this->assertEquals($this->_testCertificateString, $rsa->getCertificateString());
  69. }
  70. public function testConstructorSetsCertificatePath()
  71. {
  72. $rsa = new Zend_Crypt_Rsa(array('certificatePath'=>$this->_testCertificatePath));
  73. $this->assertEquals($this->_testCertificatePath, $rsa->getCertificatePath());
  74. }
  75. public function testSetCertificatePathLoadsCertificateString()
  76. {
  77. $rsa = new Zend_Crypt_Rsa(array('certificatePath'=>$this->_testCertificatePath));
  78. $this->assertEquals($this->_testCertificateString, $rsa->getCertificateString());
  79. }
  80. public function testConstructorSetsHashOption()
  81. {
  82. $rsa = new Zend_Crypt_Rsa(array('hashAlgorithm'=>'md2'));
  83. $this->assertEquals(OPENSSL_ALGO_MD2, $rsa->getHashAlgorithm());
  84. }
  85. public function testSetPemStringParsesPemForPrivateKey()
  86. {
  87. $rsa = new Zend_Crypt_Rsa(array('pemString'=>$this->_testPemString));
  88. $this->assertType('Zend_Crypt_Rsa_Key_Private', $rsa->getPrivateKey());
  89. }
  90. public function testSetPemStringParsesPemForPublicKey()
  91. {
  92. $rsa = new Zend_Crypt_Rsa(array('pemString'=>$this->_testPemString));
  93. $this->assertType('Zend_Crypt_Rsa_Key_Public', $rsa->getPublicKey());
  94. }
  95. public function testSetCertificateStringParsesCertificateForNullPrivateKey()
  96. {
  97. $rsa = new Zend_Crypt_Rsa(array('certificateString'=>$this->_testCertificateString));
  98. $this->assertEquals(null, $rsa->getPrivateKey());
  99. }
  100. public function testSetCertificateStringParsesCertificateForPublicKey()
  101. {
  102. $rsa = new Zend_Crypt_Rsa(array('certificateString'=>$this->_testCertificateString));
  103. $this->assertType('Zend_Crypt_Rsa_Key_Public', $rsa->getPublicKey());
  104. }
  105. public function testSignGeneratesExpectedBinarySignature()
  106. {
  107. $rsa = new Zend_Crypt_Rsa(array('pemString'=>$this->_testPemString));
  108. $signature = $rsa->sign('1234567890');
  109. $this->assertEquals(
  110. 'sMHpp3u6DNecIm5RIkDD3xyKaH6qqP8roUWDs215iOGHehfK1ypqwoETKNP7NaksGS2C1Up813ixlGXkipPVbQ==',
  111. base64_encode($signature));
  112. }
  113. public function testSignGeneratesExpectedBinarySignatureUsingExternalKey()
  114. {
  115. $privateKey = new Zend_Crypt_Rsa_Key_Private($this->_testPemString);
  116. $rsa = new Zend_Crypt_Rsa(array('certificateString'=>$this->_testCertificateString));
  117. $signature = $rsa->sign('1234567890', $privateKey);
  118. $this->assertEquals(
  119. 'sMHpp3u6DNecIm5RIkDD3xyKaH6qqP8roUWDs215iOGHehfK1ypqwoETKNP7NaksGS2C1Up813ixlGXkipPVbQ==',
  120. base64_encode($signature));
  121. }
  122. public function testSignGeneratesExpectedBase64Signature()
  123. {
  124. $rsa = new Zend_Crypt_Rsa(array('pemString'=>$this->_testPemString));
  125. $signature = $rsa->sign('1234567890', null, Zend_Crypt_Rsa::BASE64);
  126. $this->assertEquals(
  127. 'sMHpp3u6DNecIm5RIkDD3xyKaH6qqP8roUWDs215iOGHehfK1ypqwoETKNP7NaksGS2C1Up813ixlGXkipPVbQ==',
  128. $signature);
  129. }
  130. public function testVerifyVerifiesBinarySignatures()
  131. {
  132. $rsa = new Zend_Crypt_Rsa(array('pemString'=>$this->_testPemString));
  133. $signature = $rsa->sign('1234567890');
  134. $result = $rsa->verifySignature('1234567890', $signature);
  135. $this->assertEquals(1, $result);
  136. }
  137. public function testVerifyVerifiesBinarySignaturesUsingCertificate()
  138. {
  139. $privateKey = new Zend_Crypt_Rsa_Key_Private($this->_testPemString);
  140. $rsa = new Zend_Crypt_Rsa(array('certificateString'=>$this->_testCertificateString));
  141. $signature = $rsa->sign('1234567890', $privateKey);
  142. $result = $rsa->verifySignature('1234567890', $signature);
  143. $this->assertEquals(1, $result);
  144. }
  145. public function testVerifyVerifiesBase64Signatures()
  146. {
  147. $rsa = new Zend_Crypt_Rsa(array('pemString'=>$this->_testPemString));
  148. $signature = $rsa->sign('1234567890', null, Zend_Crypt_Rsa::BASE64);
  149. $result = $rsa->verifySignature('1234567890', $signature, Zend_Crypt_Rsa::BASE64);
  150. $this->assertEquals(1, $result);
  151. }
  152. public function testEncryptionUsingPublicKeyEncryption()
  153. {
  154. $rsa = new Zend_Crypt_Rsa(array('pemString'=>$this->_testPemString));
  155. $encrypted = $rsa->encrypt('1234567890', $rsa->getPublicKey());
  156. $this->assertEquals(
  157. '1234567890',
  158. $rsa->decrypt($encrypted, $rsa->getPrivateKey())
  159. );
  160. }
  161. public function testEncryptionUsingPublicKeyBase64Encryption()
  162. {
  163. $rsa = new Zend_Crypt_Rsa(array('pemString'=>$this->_testPemString));
  164. $encrypted = $rsa->encrypt('1234567890', $rsa->getPublicKey(), Zend_Crypt_Rsa::BASE64);
  165. $this->assertEquals(
  166. '1234567890',
  167. $rsa->decrypt($encrypted, $rsa->getPrivateKey(), Zend_Crypt_Rsa::BASE64)
  168. );
  169. }
  170. public function testBase64EncryptionUsingCertificatePublicKeyEncryption()
  171. {
  172. $rsa = new Zend_Crypt_Rsa(array('certificateString'=>$this->_testCertificateString));
  173. $encrypted = $rsa->encrypt('1234567890', $rsa->getPublicKey(), Zend_Crypt_Rsa::BASE64);
  174. $rsa2 = new Zend_Crypt_Rsa(array('pemString'=>$this->_testPemString));
  175. $this->assertEquals(
  176. '1234567890',
  177. $rsa->decrypt($encrypted, $rsa2->getPrivateKey(), Zend_Crypt_Rsa::BASE64)
  178. );
  179. }
  180. public function testEncryptionUsingPrivateKeyEncryption()
  181. {
  182. $rsa = new Zend_Crypt_Rsa(array('pemString'=>$this->_testPemString));
  183. $encrypted = $rsa->encrypt('1234567890', $rsa->getPrivateKey());
  184. $this->assertEquals(
  185. '1234567890',
  186. $rsa->decrypt($encrypted, $rsa->getPublicKey())
  187. );
  188. }
  189. public function testEncryptionUsingPrivateKeyBase64Encryption()
  190. {
  191. $rsa = new Zend_Crypt_Rsa(array('pemString'=>$this->_testPemString));
  192. $encrypted = $rsa->encrypt('1234567890', $rsa->getPrivateKey(), Zend_Crypt_Rsa::BASE64);
  193. $this->assertEquals(
  194. '1234567890',
  195. $rsa->decrypt($encrypted, $rsa->getPublicKey(), Zend_Crypt_Rsa::BASE64)
  196. );
  197. }
  198. public function testKeyGenerationCreatesArrayObjectResult()
  199. {
  200. $rsa = new Zend_Crypt_Rsa;
  201. $keys = $rsa->generateKeys(array('private_key_bits'=>512));
  202. $this->assertType('ArrayObject', $keys);
  203. }
  204. public function testKeyGenerationCreatesPrivateKeyInArrayObject()
  205. {
  206. $rsa = new Zend_Crypt_Rsa;
  207. $keys = $rsa->generateKeys(array('private_key_bits'=>512));
  208. $this->assertType('Zend_Crypt_Rsa_Key_Private', $keys->privateKey);
  209. }
  210. public function testKeyGenerationCreatesPublicKeyInArrayObject()
  211. {
  212. $rsa = new Zend_Crypt_Rsa;
  213. $keys = $rsa->generateKeys(array('privateKeyBits'=>512));
  214. $this->assertType('Zend_Crypt_Rsa_Key_Public', $keys->publicKey);
  215. }
  216. public function testKeyGenerationCreatesPassphrasedPrivateKey()
  217. {
  218. $rsa = new Zend_Crypt_Rsa;
  219. $config = array(
  220. 'privateKeyBits' => 512,
  221. 'passPhrase' => '0987654321'
  222. );
  223. $keys = $rsa->generateKeys($config);
  224. try {
  225. $rsa = new Zend_Crypt_Rsa(array(
  226. 'passPhrase'=>'1234567890',
  227. 'pemString'=>$keys->privateKey->toString()
  228. ));
  229. $this->fail('Expected exception not thrown');
  230. } catch (Zend_Crypt_Exception $e) {
  231. }
  232. }
  233. public function testConstructorLoadsPassphrasedKeys()
  234. {
  235. $rsa = new Zend_Crypt_Rsa;
  236. $config = array(
  237. 'privateKeyBits' => 512,
  238. 'passPhrase' => '0987654321'
  239. );
  240. $keys = $rsa->generateKeys($config);
  241. try {
  242. $rsa = new Zend_Crypt_Rsa(array(
  243. 'passPhrase'=>'0987654321',
  244. 'pemString'=>$keys->privateKey->toString()
  245. ));
  246. } catch (Zend_Crypt_Exception $e) {
  247. $this->fail('Passphrase loading failed of a private key');
  248. }
  249. }
  250. }