PHPackages                             falseclock/advanced-cms - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. falseclock/advanced-cms

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

falseclock/advanced-cms
=======================

A PHP Library that allows you to decode and manipulate CAdES or in other words CMS Advanced Electronic Signatures described in ETSI standart TS 101 733.

0.3.1(4y ago)223.5k↓79.5%2[3 issues](https://github.com/Falseclock/AdvancedCMS/issues)MITPHPPHP &gt;=7.2

Since Aug 10Pushed 4y ago6 watchersCompare

[ Source](https://github.com/Falseclock/AdvancedCMS)[ Packagist](https://packagist.org/packages/falseclock/advanced-cms)[ Docs](https://github.com/Falseclock/AdvancedCMS)[ RSS](/packages/falseclock-advanced-cms/feed)WikiDiscussions master Synced 3d ago

READMEChangelog (8)Dependencies (4)Versions (10)Used By (0)

AdvancedCMS
===========

[](#advancedcms)

A PHP Library that allows you to decode and manipulate CAdES or in other words CMS Advanced Electronic Signatures described in ETSI standart TS 101 733.

Библиотека, которая позволит вам манипулировать CAdES или иначе стандартом электронной подписи, представляющий собой расширенную версию стандарта электронной подписи CMS (Cryptographic Message Syntax) и разработанный ETSI.

[![Build Status](https://camo.githubusercontent.com/046891b48788a01e9a9a0f1d971b592259ac3debed39182b42be8b36508034bb/68747470733a2f2f7472617669732d63692e6f72672f46616c7365636c6f636b2f416476616e636564434d532e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/Falseclock/AdvancedCMS)[![PHP 7 ready](https://camo.githubusercontent.com/63bb08f0bf4899ad7bf509e1cd77994b2c055306da9b41c955d1248887e06de9/68747470733a2f2f7068703772656164792e74696d6573706c696e7465722e63682f46616c7365636c6f636b2f416476616e636564434d532f6d61737465722f62616467652e737667)](https://travis-ci.org/Falseclock/AdvancedCMS)[![Coverage Status](https://camo.githubusercontent.com/c4cc4472ca2f64ab9307d84af4598f2def362129e68b791a0dcba34b97c67d9a/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f46616c7365636c6f636b2f416476616e636564434d532f62616467652e7376673f6272616e63683d6d617374657226763d32)](https://coveralls.io/github/Falseclock/AdvancedCMS?branch=master)

[![Latest Stable Version](https://camo.githubusercontent.com/dae0e33bf79cded567c22abc9fe537da4dccab641b55ee105b7bc9dff23038f4/68747470733a2f2f706f7365722e707567782e6f72672f66616c7365636c6f636b2f616476616e6365642d636d732f76)](//packagist.org/packages/falseclock/advanced-cms)[![Total Downloads](https://camo.githubusercontent.com/bcb39d37828980b17839cfa220f9af4e6bcb709ab2628c31e1f21e2c9365db9c/68747470733a2f2f706f7365722e707567782e6f72672f66616c7365636c6f636b2f616476616e6365642d636d732f646f776e6c6f616473)](//packagist.org/packages/falseclock/advanced-cms)[![Latest Unstable Version](https://camo.githubusercontent.com/942b74f1cfd63207fb1859c3170d12922331951bb65d58bc219624dfb191900f/68747470733a2f2f706f7365722e707567782e6f72672f66616c7365636c6f636b2f616476616e6365642d636d732f762f756e737461626c65)](//packagist.org/packages/falseclock/advanced-cms)[![License](https://camo.githubusercontent.com/46d35d07266e4bd7dda62e144642627971c4455561cc00de0c7add6ef41b3689/68747470733a2f2f706f7365722e707567782e6f72672f66616c7365636c6f636b2f616476616e6365642d636d732f6c6963656e7365)](//packagist.org/packages/falseclock/advanced-cms)

Установка
---------

[](#установка)

```
composer require falseclock/advanced-cms
```

Предыстория
-----------

[](#предыстория)

Когда в Казахстане и России стала активно внедряться Электронная цифровая подпись (ЭЦП), я, с большой для себя неожиданностью, обнаружил, что в PHP нет библиотек, позволяющих не только формализовать ASN.1 запись цифровой подписи в объект, но и тем более модифицировать её, путем добавления OCSP проверок или TSP меток, удалить электронный контент, чтобы оставить только подписи или просто объединить две разные подписи одних и тех же данных. Отправной точкой стала библиотека [adapik/cms](https://github.com/Adapik/CMS), в которой на тот момент не было детального описания всех возможных полей и данных в CAdES. Так начался долгий путь чтения RFC и написания [нескольких тысяч строк кода](https://github.com/Adapik/CMS/graphs/contributors) чтобы полностью и детально описать рекомендации в виде библиотеки. Но, по договоренности с [Александром Даниловым](https://github.com/Adapik), мы решили, что изначальная библиотека будет, как и раньше, работать исключительно в режиме чтения, а все остальное, если я того желаю, могу сделать в виде отдельного пакета. Что, собственно, и было сделано.

Человеку, не понимающему как работает ЭЦП, как проверяется легитимность и достоверность подписи будет довольно сложно понять суть и смысл этой библиотеки. Тем не менее я постарался сделать все возможные unit тесты и 100% покрыть код. Как работать с CMS файлами, изменять или создавать новые вы можете на основе тестов в папке [test](https://github.com/Falseclock/AdvancedCMS/tree/master/tests). В дальнейших планах реализация не только манипуляций с подписями, но и также формирование ЭЦП в виде CAdES. В этом смысле передача пароля или приватного ключа не всегда оказывается хорошей практикой, но раз уж на PHP до сих пор нет такой реализации, то почему бы и нет.

Манипуляторы
------------

[](#манипуляторы)

- [EncapsulatedContentInfo](#EncapsulatedContentInfo)
- [SignedData](#SignedData)
- [SignedDataContent](#SignedDataContent)
- [SignerInfo](#SignerInfo)
- [UnsignedAttributes](#UnsignedAttributes)

---

**EncapsulatedContentInfo**
===========================

[](#encapsulatedcontentinfo)

**EncapsulatedContentInfo** — Согласно [RFC5652](https://datatracker.ietf.org/doc/html/rfc5652#section-5.2) - место хранения подписанных данных. Хранить данные в слепке ЭЦП не обязательное условие, следовательно, их можно удалять или внедрять.

**Методы**
----------

[](#методы)

### **setEContent**

[](#setecontent)

setEContent — запись содержимого в виде простых последовательностей байт (октетов).

#### Описание

[](#описание)

```
public function setEContent(OctetString $octetString): self
```

В случае, если подписанные данные и сами подписи хранятся раздельно, но необходимо сформировать полный CMS файл, данный метод позволяет внедрить содержание в подпись. Следует учесть, что метод не проверяет хэш файла и хэш из подписи, так как алгоритм хеширования может не входить в стандартную поставку openssl.

---

### **unSetEContent**

[](#unsetecontent)

unSetEContent — удаление подписанных данных из ЭЦП.

#### Описание

[](#описание-1)

```
public function unSetEContent(): self
```

ЭЦП может содержать, а может и не содержать данные, так как цифровая подпись формируется на основе хэша данных. Чтобы можно было по отдельности хранить данные и подписи, вполне разумно их разделять, особенно, если данные очень большого объема, так как их всегда можно проверить по хэшу, который использовался в подписи.

---

**SignedData**
==============

[](#signeddata)

**SignedData** — объект, включающий в себя все данные цифровой подписи.

**Методы**
----------

[](#методы-1)

### **mergeCMS**

[](#mergecms)

mergeCMS — объединение дайджестов, публичных и отозванных сертификатов, а также самих подписей

#### Описание

[](#описание-2)

```
public function mergeCMS(SignedData $signedData): SignedData
```

Метод позволяет собрать несколько CMS файлов в единый, если один и тот же файл был подписан разными системами, либо если каждая подпись хранится отдельно.

---

**SignedDataContent**
=====================

[](#signeddatacontent)

**SignedDataContent** — согласно [RFC5652](https://datatracker.ietf.org/doc/html/rfc5652#section-5.1) это последовательность нескольких элементов, которая включает дайджест, подписанные данные, сертификаты, отзывы на сертификаты и данные по подписях.

**Методы**
----------

[](#методы-2)

### **appendDigestAlgorithmIdentifier**

[](#appenddigestalgorithmidentifier)

appendDigestAlgorithmIdentifier — добавление в список текущих хэш алгоритмов, дополнительного, используемого в одной из подписей

#### Описание

[](#описание-3)

```
public function appendDigestAlgorithmIdentifier(AlgorithmIdentifier $algorithmIdentifier): self
```

Неупорядоченный набор дайджестов (хэш алгоритмов) использованных в подписях. При этом, если в CMS находятся две или более подписи, с одним и тем же алгоритмом хеширования, наборы могут повторяться. Количество последовательностей алгоритмов в данном наборе соответствует количеству подписей.

---

### **appendCertificate**

[](#appendcertificate)

appendCertificate — добавление публичного сертификата как для одной из подписей, так и других вспомогательных.

#### Описание

[](#описание-4)

```
public function appendCertificate(Certificate $certificate): self
```

Следует учесть, что наличие публичных сертификатов в CMS не является обязательным условием, так как согласно RFC это поле опциональное. Согласно тому же [RFC5652](https://datatracker.ietf.org/doc/html/rfc5652#section-10.2.3) в этом наборе могут присутствовать как сертификаты самих подписей, так и промежуточные или же корневые сертификаты при необходимости.

---

### **appendSignerInfo**

[](#appendsignerinfo)

appendSignerInfo — добавление подписи в CMS, которая включает алгоритм хеширования, подпись, подписанные и неподписанные атрибуты.

#### Описание

[](#описание-5)

```
public function appendSignerInfo(Certificate $certificate): self
```

Это один из основных методов, ради которого и затеялась разработка данной библиотеки. Позволяет объединять несколько подписей в единый CMS файл.

---

**SignerInfo**
==============

[](#signerinfo)

**SignerInfo** — согласно [RFC5652](https://datatracker.ietf.org/doc/html/rfc5652#section-5.3) в подписи могут содержаться неподписанные данные. Например, OCSP проверка или TSP метка. Несмотря на то, что эти данные также могут находиться и в подписанных данных, не все средства подписания реализуют сохранение дополнительных атрибутов в блоке подписи. Для этого в SignerInfo предусмотрен блок UnsignedAttributes, куда важные данные для проверки легитимности подписи могут быть добавлены позднее. Более подробно об атрибутах можно найти информацию в [RFC5126](https://datatracker.ietf.org/doc/html/rfc5126).

**Методы**
----------

[](#методы-3)

### **addUnsignedAttribute**

[](#addunsignedattribute)

addUnsignedAttribute — добавление неподписанного атрибута

#### Описание

[](#описание-6)

```
public function addUnsignedAttribute(UnsignedAttribute $newAttribute): SignerInf
```

Как правило, это OCSP и TSP данные. На самом деле, атрибуты не ограничены только этими проверками и метками. Тем не менее одинаковые типы данных хранятся в неупорядоченном наборе последовательности, имеющий OID идентификатор, указывающий какой набор данных содержит та или иная последовательность. Иными словами, например OCSP метки будут храниться в SET поле SEQUENCE, которая имеет OID 1.2.840.113549.1.9.16.2.24 (revocationValues), а TSP метки будут храниться в наборе последовательности, которая имеет OID 1.2.840.113549.1.9.16.2.14 (timeStampToken)

---

### **createUnsignedAttributes**

[](#createunsignedattributes)

createUnsignedAttributes — создание набора неподписанных атрибутов

#### Описание

[](#описание-7)

```
protected function createUnsignedAttributes(): ?UnsignedAttributes
```

Электронная цифровая подпись необязательно должна иметь неподписанные данные, тем не менее, этот набор может быть добавлен в ЭЦП не нарушая целостность её данных.

---

### **deleteUnsignedAttributes**

[](#deleteunsignedattributes)

deleteUnsignedAttributes — удаление неподписанных атрибутов

#### Описание

[](#описание-8)

```
public function deleteUnsignedAttributes(): SignerInfo
```

Так же как и с добавлением дополнительных атрибутов, они могут быть легко удалены, при этом целостность и достоверность подписи не будет нарушена.

---

###  Health Score

29

—

LowBetter than 57% of packages

Maintenance17

Infrequent updates — may be unmaintained

Popularity31

Limited adoption so far

Community11

Small or concentrated contributor base

Maturity46

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~63 days

Recently: every ~81 days

Total

8

Last Release

1709d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/3299139?v=4)[Nurlan Mukhanov](/maintainers/Falseclock)[@Falseclock](https://github.com/Falseclock)

---

Top Contributors

[![Falseclock](https://avatars.githubusercontent.com/u/3299139?v=4)](https://github.com/Falseclock "Falseclock (76 commits)")

---

Tags

asn1cadescades-tcades-xcmscryptographicdigital-signatureetsiphppkcs7sslsignatureasn1encodingDERx690opensslcmsbinarydecodingberpkcs7gostcadeskalkanэцп

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/falseclock-advanced-cms/health.svg)

```
[![Health](https://phpackages.com/badges/falseclock-advanced-cms/health.svg)](https://phpackages.com/packages/falseclock-advanced-cms)
```

###  Alternatives

[adapik/cms

A PHP Library that allows you to decode ASN.1 CMS using Basic Encoding Rules (BER).

148.1k1](/packages/adapik-cms)[spomky-labs/pki-framework

A PHP framework for managing Public Key Infrastructures. It comprises X.509 public key certificates, attribute certificates, certification requests and certification path validation.

2735.6M23](/packages/spomky-labs-pki-framework)[freedsx/asn1

An ASN.1 library for PHP.

15245.4k13](/packages/freedsx-asn1)[sop/crypto-types

A PHP library of various ASN.1 types for cryptographic applications.

121.4M35](/packages/sop-crypto-types)[xobotyi/basen

Text and integers encoding utilities for PHP with no extensions dependencies. Base32, Base58, Base64 and much more!

1220.4k](/packages/xobotyi-basen)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
