Skip to content

Commit 51e2793

Browse files
committed
фикс парсинга поля "Субъект"
1 parent bc39e66 commit 51e2793

File tree

3 files changed

+46
-19
lines changed

3 files changed

+46
-19
lines changed

pycryptoprosdk/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def as_string(self):
4040

4141
def as_dict(self):
4242
data = {}
43-
for item in re.compile(r',(?<!^)\s+(?=[A-Z1-9])(?!.\s)').split(self.cert_name):
43+
for item in self.cert_name.split('\r\n'):
4444
try:
4545
k, v = item.split('=')
4646
data[k] = v

pycryptoprosdk/libpycades.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <stdlib.h>
77

88
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
9+
#define CERT_NAME_STR_TYPE (CERT_X500_NAME_STR | CERT_NAME_STR_CRLF_FLAG)
910

1011

1112
typedef struct {
@@ -72,15 +73,15 @@ CERTIFICATE_INFO GetCertInfo(PCCERT_CONTEXT pCertContext){
7273
CertNameToStr(
7374
X509_ASN_ENCODING,
7475
&pCertContext->pCertInfo->Subject,
75-
CERT_X500_NAME_STR,
76+
CERT_NAME_STR_TYPE,
7677
certInfo.subject,
7778
1024
7879
);
7980

8081
CertNameToStr(
8182
X509_ASN_ENCODING,
8283
&pCertContext->pCertInfo->Issuer,
83-
CERT_X500_NAME_STR,
84+
CERT_NAME_STR_TYPE,
8485
certInfo.issuer,
8586
1024
8687
);
@@ -168,7 +169,7 @@ CERTIFICATE_INFO GetCertInfo(PCCERT_CONTEXT pCertContext){
168169
CertNameToStr(
169170
X509_ASN_ENCODING,
170171
&directoryName,
171-
CERT_X500_NAME_STR,
172+
CERT_NAME_STR_TYPE,
172173
certInfo.altName,
173174
1024
174175
);

tests/test_main.py

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,23 @@ def test_get_cert_by_thumbprint(self):
7474
self.assertIsNotNone(cert)
7575
self.assertEqual(
7676
cert.subject.as_string(),
77-
'E=support@cryptopro.ru, C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2'
77+
'\r\n'.join([
78+
'E=support@cryptopro.ru',
79+
'C=RU',
80+
'L=Moscow',
81+
'O=CRYPTO-PRO LLC',
82+
'CN=CRYPTO-PRO Test Center 2'
83+
])
7884
)
7985
self.assertEqual(
8086
cert.issuer.as_string(),
81-
'E=support@cryptopro.ru, C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2'
87+
'\r\n'.join([
88+
'E=support@cryptopro.ru',
89+
'C=RU',
90+
'L=Moscow',
91+
'O=CRYPTO-PRO LLC',
92+
'CN=CRYPTO-PRO Test Center 2'
93+
])
8294
)
8395
self.assertEqual(
8496
cert.valid_from,
@@ -120,12 +132,24 @@ def test_get_signer_certificate_from_signature(self):
120132

121133
self.assertEqual(
122134
cert.issuer.as_string(),
123-
'E=support@cryptopro.ru, C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2'
135+
'\r\n'.join([
136+
'E=support@cryptopro.ru',
137+
'C=RU',
138+
'L=Moscow',
139+
'O=CRYPTO-PRO LLC',
140+
'CN=CRYPTO-PRO Test Center 2'
141+
])
124142
)
125143
self.assertEqual(
126144
cert.subject.as_string(),
127-
'CN=Иванов Иван Иванович, INN=123456789047, OGRN=1123300000053, SNILS=12345678901, STREET="Улица, дом", '
128-
'L=Город'
145+
'\r\n'.join([
146+
'CN=Иванов Иван Иванович',
147+
'INN=123456789047',
148+
'OGRN=1123300000053',
149+
'SNILS=12345678901',
150+
'STREET="Улица, дом"',
151+
'L=Город'
152+
])
129153
)
130154
subject_dict = cert.subject.as_dict()
131155
self.assertEqual(subject_dict['CN'], 'Иванов Иван Иванович')
@@ -143,32 +167,34 @@ def test_get_signer_certificate_from_signature(self):
143167
self.assertEqual(cert.subject.city, 'Город')
144168

145169
def test_inn_original(self):
146-
signature_content = self._get_content(os.path.join(files_dir, 'signatures', 'doc.txt.sgn'))
147-
cert = self.sdk.get_signer_cert_from_signature(signature_content)
148-
subject_list = cert.subject.cert_name.split(', ')
149-
subject_list[1] = 'INN=003456789047'
150-
subject_string = ', '.join(subject_list)
170+
subject_string = '\r\n'.join(['INN=003456789047'])
151171
subject = Subject(subject_string)
152172
self.assertEqual(subject.inn_original, '003456789047')
153173
self.assertEqual(subject.inn, '3456789047')
154174

155175
# def test_get_signer_alt_name_from_signature(self):
156-
# signature_content = self._get_content(os.path.join(files_dir, 'signatures', 'test.txt.sig'))
176+
# signature_content = self._get_content(os.path.join(files_dir, 'signatures', 'test_alt_name.txt.sig'))
157177
# cert = self.sdk.get_signer_cert_from_signature(signature_content)
158178
# self.assertDictEqual(cert.alt_name.as_dict(), {'OGRNIP': '123456789012345'})
159179

160180

161181
class TestCertName(unittest.TestCase):
162182
def test_subject_as_string(self):
163-
cert_name = CertName('CN=Иванов Иван Иванович, INN=1234567890, 2.5.4.5="#1303323739"')
183+
cert_name = CertName('\r\n'.join([
184+
'CN=Иванов Иван Иванович',
185+
'INN=1234567890',
186+
'STREET=ул. Горшкова, дом 4, 1',
187+
'2.5.4.5="#1303323739"'
188+
]))
164189
cert_name_dict = cert_name.as_dict()
165190
self.assertDictEqual(
166-
cert_name_dict,
167191
{
168192
'CN': 'Иванов Иван Иванович',
169193
'INN': '1234567890',
170-
'2.5.4.5': '"#1303323739"'
171-
}
194+
'2.5.4.5': '"#1303323739"',
195+
'STREET': 'ул. Горшкова, дом 4, 1',
196+
},
197+
cert_name_dict,
172198
)
173199

174200

0 commit comments

Comments
 (0)