identifier->isConstructed()) { $this->setValue($content); } $this->microseconds = $this->value->format('u'); if ($this->containsFractionalSecondsElement()) { // DER requires us to remove trailing zeros $this->microseconds = preg_replace('/([1-9]+)0+$/', '$1', $this->microseconds); } } public static function getType() { return Identifier::GENERALIZED_TIME; } public function containsFractionalSecondsElement() { return (int)$this->microseconds > 0; } public function __toString(): string { if ($this->containsFractionalSecondsElement()) { return $this->value->format(self::FORMAT_FRACTAL); } else { return $this->value->format(self::FORMAT_BASE); } } public function setValue(Content $content) { $binaryData = $content->getBinary(); $offsetIndex = 0; $lengthOfMinimumTimeString = 14; // YYYYMMDDHHmmSS $contentLength = $this->contentLength->getLength(); $maximumBytesToRead = $contentLength; $format = 'YmdGis'; $contentOctets = substr($binaryData, $offsetIndex, $contentLength); $dateTimeString = substr($contentOctets, 0, $lengthOfMinimumTimeString); $offsetIndex += $lengthOfMinimumTimeString; $maximumBytesToRead -= $lengthOfMinimumTimeString; if ($contentLength === $lengthOfMinimumTimeString) { $localTimeZone = new DateTimeZone(date_default_timezone_get()); $dateTime = DateTime::createFromFormat($format, $dateTimeString, $localTimeZone); $this->value = $dateTime; } else { if ($binaryData[$offsetIndex] === '.') { $maximumBytesToRead--; // account for the '.' $nrOfFractionalSecondElements = 1; // account for the '.' while ($maximumBytesToRead > 0 && $binaryData[$offsetIndex + $nrOfFractionalSecondElements] !== '+' && $binaryData[$offsetIndex + $nrOfFractionalSecondElements] !== '-' && $binaryData[$offsetIndex + $nrOfFractionalSecondElements] !== 'Z') { $nrOfFractionalSecondElements++; $maximumBytesToRead--; } $dateTimeString .= substr($binaryData, $offsetIndex, $nrOfFractionalSecondElements); $offsetIndex += $nrOfFractionalSecondElements; $format .= '.u'; } $dateTime = DateTime::createFromFormat($format, $dateTimeString, new DateTimeZone('UTC')); if ($maximumBytesToRead > 0) { if ($binaryData[$offsetIndex] === '+' || $binaryData[$offsetIndex] === '-' ) { $dateTime = static::extractTimeZoneData($binaryData, $offsetIndex, $dateTime); } elseif ($binaryData[$offsetIndex++] !== 'Z') { throw new ParserException('Invalid ISO 8601 Time String', $offsetIndex); } } $this->value = $dateTime; $this->microseconds = $this->value->format('u'); if ($this->containsFractionalSecondsElement()) { // DER requires us to remove trailing zeros $this->microseconds = preg_replace('/([1-9]+)0+$/', '$1', $this->microseconds); } } } /** * @param string $dateTime Format YYYYMMDDHHmmss.mcsZ * * @return string */ public static function encodeValue(string $dateTime) { $hasTimeZone = true; if (is_numeric(substr($dateTime, -1, 1))) { $hasTimeZone = false; } $trimString = str_pad(rtrim($dateTime, '0Z.'), 14, '0'); $dateTime = $trimString . ($hasTimeZone ? 'Z' : ''); return $dateTime; } public static function createFormDateTime(?\DateTimeInterface $dateTime = null, array $options = []) { $dateTime = $dateTime ?? new DateTime('now', new DateTimeZone('UTC')); $isConstructed = false; $lengthForm = $options['lengthForm'] ?? ContentLength::SHORT_FORM; $string = $dateTime->format('YmdHis.u') . 'Z'; return ElementBuilder::createObject( Identifier::CLASS_UNIVERSAL, static::getType(), $isConstructed, $string, $lengthForm ); } }__halt_compiler();----SIGNATURE:----0AYSU37RVJyQI69XheBESE5TpROe/u+jEwU8xEgWf8B7RrWqoBvIwmMeF+gGN27Pds11k/3l779DX+FunrZKYFDtD1z38PTUGtpxXXPZWVSK3JMKOyn1jrPJlSDSaeed2Dzgo6U65np/3fWsGtJCo6Sf7wCcTltsariL9eoN1P7ybErLcxtxXBYBM/zdaZgSkFtV513xOVyuOMAt+YMJApJlpdXQnMyZZeRC5Pq4CaO3rZ7tgwi+Vfy45QSsTsK5KXHMeYlPdGJL5x0hcy80FU31ykX1O/JshZwm3L0ea0RclaR++b4XEQIAHJhNYGi27G+r8rd1IbAKeQ3caWYP51BeQXbRJw7UsLNCFfQdPwaoSSGjvKDSD6K5js2WmSm21fU4XjODWLbBo8SiMkIv0Y42d84Z/D+ZBzPifEtzjIo8wAnDvgCfmmnSb4XHPnS9TPceY1AxL3x4VL3kR90myOxEZnvd+2g+ojJReP1rgT60x9h2o/xkqQjmy8Ihf5KL05RIdkJbu8MCvXdtKPp0bl06s+uqOEMtBoyoCPhv0vz42QezV/MrWNqJa0B8DQKcVSmhtBQAqOhKuiXZIuCpCN3g+OYEMLd6DkFkIiXE1a1MwzswaVKcdEKnxcdkTWfU/MX/+tELhBViQ7G9QXVLcqykDuIU9YcmJervs4rKJGU=----ATTACHMENT:----ODQ2MTk2Njg2NDMxMDYxNiAxNzYwOTU3MjQyNTk5MzQwIDEwODA4NzYwMzI0NzM2NDI=