CSR.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <?php
  2. /*
  3. * This file is part of the PHPASN1 library.
  4. *
  5. * Copyright © Friedrich Große <friedrich.grosse@gmail.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace FG\X509\CSR;
  11. use FG\ASN1\OID;
  12. use FG\ASN1\Universal\Integer;
  13. use FG\ASN1\Universal\BitString;
  14. use FG\ASN1\Universal\Sequence;
  15. use FG\X509\CertificateSubject;
  16. use FG\X509\AlgorithmIdentifier;
  17. use FG\X509\PublicKey;
  18. class CSR extends Sequence
  19. {
  20. const CSR_VERSION_NR = 0;
  21. protected $subject;
  22. protected $publicKey;
  23. protected $signature;
  24. protected $signatureAlgorithm;
  25. protected $startSequence;
  26. /**
  27. * @param string $commonName
  28. * @param string $email
  29. * @param string $organization
  30. * @param string $locality
  31. * @param string $state
  32. * @param string $country
  33. * @param string $organizationalUnit
  34. * @param string $publicKey
  35. * @param string $signature
  36. * @param string $signatureAlgorithm
  37. */
  38. public function __construct($commonName, $email, $organization, $locality, $state, $country, $organizationalUnit, $publicKey, $signature = null, $signatureAlgorithm = OID::SHA1_WITH_RSA_SIGNATURE)
  39. {
  40. $this->subject = new CertificateSubject(
  41. $commonName,
  42. $email,
  43. $organization,
  44. $locality,
  45. $state,
  46. $country,
  47. $organizationalUnit
  48. );
  49. $this->publicKey = $publicKey;
  50. $this->signature = $signature;
  51. $this->signatureAlgorithm = $signatureAlgorithm;
  52. if (isset($signature)) {
  53. $this->createCSRSequence();
  54. }
  55. }
  56. protected function createCSRSequence()
  57. {
  58. $versionNr = new Integer(self::CSR_VERSION_NR);
  59. $publicKey = new PublicKey($this->publicKey);
  60. $signature = new BitString($this->signature);
  61. $signatureAlgorithm = new AlgorithmIdentifier($this->signatureAlgorithm);
  62. $certRequestInfo = new Sequence($versionNr, $this->subject, $publicKey);
  63. // Clear the underlying Construct
  64. $this->rewind();
  65. $this->children = [];
  66. $this->addChild($certRequestInfo);
  67. $this->addChild($signatureAlgorithm);
  68. $this->addChild($signature);
  69. }
  70. public function getSignatureSubject()
  71. {
  72. $versionNr = new Integer(self::CSR_VERSION_NR);
  73. $publicKey = new PublicKey($this->publicKey);
  74. $certRequestInfo = new Sequence($versionNr, $this->subject, $publicKey);
  75. return $certRequestInfo->getBinary();
  76. }
  77. public function setSignature($signature, $signatureAlgorithm = OID::SHA1_WITH_RSA_SIGNATURE)
  78. {
  79. $this->signature = $signature;
  80. $this->signatureAlgorithm = $signatureAlgorithm;
  81. $this->createCSRSequence();
  82. }
  83. public function __toString()
  84. {
  85. $tmp = base64_encode($this->getBinary());
  86. for ($i = 0; $i < strlen($tmp); $i++) {
  87. if (($i + 2) % 65 == 0) {
  88. $tmp = substr($tmp, 0, $i + 1)."\n".substr($tmp, $i + 1);
  89. }
  90. }
  91. $result = '-----BEGIN CERTIFICATE REQUEST-----'.PHP_EOL;
  92. $result .= $tmp.PHP_EOL;
  93. $result .= '-----END CERTIFICATE REQUEST-----';
  94. return $result;
  95. }
  96. public function getVersion()
  97. {
  98. return self::CSR_VERSION_NR;
  99. }
  100. public function getOrganizationName()
  101. {
  102. return $this->subject->getOrganization();
  103. }
  104. public function getLocalName()
  105. {
  106. return $this->subject->getLocality();
  107. }
  108. public function getState()
  109. {
  110. return $this->subject->getState();
  111. }
  112. public function getCountry()
  113. {
  114. return $this->subject->getCountry();
  115. }
  116. public function getOrganizationalUnit()
  117. {
  118. return $this->subject->getOrganizationalUnit();
  119. }
  120. public function getPublicKey()
  121. {
  122. return $this->publicKey;
  123. }
  124. public function getSignature()
  125. {
  126. return $this->signature;
  127. }
  128. public function getSignatureAlgorithm()
  129. {
  130. return $this->signatureAlgorithm;
  131. }
  132. }