def test_verify_with_detached_bad(): ''' Если для `n`-го подписанта подпись под данными не бьется, функция `Signature.verify_data()` возвращает `False`. ''' data = test_detached_sign() sgn = csp.Signature(data) for n in range(sgn.num_signers()): assert not sgn.verify_data(b'hUrblEwurBle', n)
def test_cert_from_detached(): ''' Конструктору хранилища сертификатов `CertStore(msg)` можно передать экземпляр класса `CryptMsg` или `Signature`. Через это хранилище можно извлекать хранящиеся в сообщении или подписи сертификаты. ''' data = test_detached_sign() sgn = csp.Signature(data) cs = csp.CertStore(sgn) assert len(list(cs))
def test_verify_with_detached(): ''' Поле `Signature.num_signers`, также как и `CryptMsg.num_signers` содержит количество подписантов сообщения. Метод `Signature.verify_data(d, n)` проверяет для отсоединенных данных `d` подпись `n`-го подписанта. ''' data = test_detached_sign2() sgn = csp.Signature(data) for n in range(sgn.num_signers()): assert sgn.verify_data(b'hurblewurble', n)
def test_verify_file(): ''' Проверка отсоединенной подписи, созданной через командную строку. ''' names = ('data1', 'data2') for name in names: with open(case_path('{0}.bin'.format(name)), 'rb') as f: data = f.read() with open(case_path('{0}.p7s'.format(name)), 'rb') as f: sigdata = f.read() sign = csp.Signature(sigdata) print(name, sign.num_signers()) if sign.num_signers() <= 0: continue for c in csp.CertStore(sign): print(b64encode(c.thumbprint())) assert all(sign.verify_data(data, n) for n in range(sign.num_signers()))
def main(): global ctxname try: ctx = csp.Crypt(b'{0}'.format(ctxname), csp.PROV_GOST_2001_DH, 0 | silent, provider) except: ctx = None if ctx is None: ctx = csp.Crypt( b'{0}'.format(ctxname), csp.PROV_GOST_2001_DH, csp.CRYPT_NEWKEYSET | silent, provider) msg = csp.CryptMsg(ctx) cs = csp.CertStore(ctx, b"My") rec_c = list(cs.find_by_name(b'123456789abcdef'))[0] ci = csp.CertInfo(rec_c) print(ci.name(), ci.issuer(), hexlify(ci.serial())) print(ci.not_before(), ci.not_after()) msg.add_recipient(rec_c) data = msg.encrypt_data(b'Test byte string') print(len(data)) #rec_c = list(cs.find_by_name(b'test'))[0] cs2 = csp.CertStore() cs2.add_cert(rec_c) encrypted = csp.CryptMsg(data) print('type:', encrypted.get_type()) print('data:', encrypted.get_data()) return_data = encrypted.decrypt(cs2) print(return_data) signed = msg.sign_data(b'Test signed data', rec_c) print(len(signed)) msg2 = csp.CryptMsg(signed, ctx) info = csp.CertInfo(msg2, 0) print('version:', info.version()) print('type:', msg2.get_type()) print(msg2.verify(0)) detached = msg.sign_data(b'Test signed data', rec_c, True) print(len(detached)) sig = csp.Signature(detached, ctx) print(sig.verify_data(b'Test signed data', 0)) print(sig.verify_data(b'Test zigned Data', 0)) sig2 = csp.CryptMsg(open('tests/data1.p7s', 'rb').read()) print('sig type:', sig2.get_type()) print('sig data:', sig2.get_data())
def test_detached_sign2(): ''' Класс `Signature` наследует всю функциональность `CryptMsg`, но ориентирован на работу с отсоединенными подписями. Поэтому метод `Signature.sign_data()` по умолчанию возвращает отсоединенную подпись. ''' ctx = csp.Crypt( test_container, PROV_GOST, 0, test_provider ) assert ctx cs = csp.CertStore(ctx, b"MY") cert = list(cs.find_by_name(test_cn))[0] # создание новой (пустой) отсоединенной подписи sgn = csp.Signature(ctx) # подписывание данных экземпляром `Signature` по умолчанию дает # отсоединенную подпись. data = sgn.sign_data(b'hurblewurble', cert) assert len(data) return data