2015-02-04 2 views
2

Я хочу, чтобы создать файл .tsq как OpenSSL с командой:отметка времени запроса с питоном

OpenSSL ц -query -data <file> -no_nonce -sha512 -out <out.tsq>

Я хочу осуществить это с питоном, Кто-нибудь знает, как это сделать, любой модуль или что-то в этом роде?

+0

связанные с: [RFC3161 сервера Отметки генерация маркера ответа в Python] (http://stackoverflow.com/q/2858282/4279). Существует пакет '' rfc3161' Python неизвестного качества '(https://pypi.python.org/pypi/rfc3161/) – jfs

ответ

2

Прямо сейчас я могу думать о трех различных подходов:

  1. Использование некоторых Premade питона модуль неизвестного качества, как python-rfc3161 упоминает @ J.F.Sebastian в своем комментарии.
  2. Используйте hashlib module для вычисления SHA512 хэша данных, которые вы хотите присвоить отметке времени, а затем используйте pyasn1 module для конструирования и кодирования структуры запроса TimeStampReq, определенной в RFC3161.
  3. Используйте hashlib module для вычисления SHA512 хэша данных, которые вы хотите присвоить отметке времени и предварительно отложите эти байты 0x30 0x56 0x02 0x01 0x01 0x30 0x51 0x30 0x0D 0x06 0x09 0x60 0x86 0x48 0x01 0x65 0x03 0x04 0x02 0x03 0x05 0x00 0x04 0x40 на значение хэша. Это должно работать для вас, потому что команда OpenSSL, которую вы предоставили, создает запрос TS, который не содержит какой-либо переменной (например, nonce или OID политики), поэтому первая часть структуры запроса не изменится независимо от того, какие входные данные вы будете использовать.
1

Вот реализация Python 3 из 3 идей от @jariq's answer:

#!/usr/bin/env python3 
"""Emulate `openssl ts -query -data <file> -no_nonce -sha512 -out <out.tsq>` 

    Usage: %(prog)s <file> [<out.tsq>] 

If <out.tsq> is not given; use <file> name and append '.tsq' suffix 
""" 
import hashlib 
import sys 
from functools import partial 

def hash_file(filename, hashtype, chunksize=2**15, bufsize=-1): 
    h = hashtype() 
    with open(filename, 'rb', bufsize) as file: 
     for chunk in iter(partial(file.read, chunksize), b''): 
      h.update(chunk) 
    return h 

try: # parse command-line arguments 
    filename, *out_filename = sys.argv[1:] 
    out_filename.append(filename + '.tsq') 
except ValueError: 
    sys.exit(__doc__ % dict(prog=sys.argv[0])) 

h = hash_file(filename, hashlib.sha512) # find hash of the input file 
with open(out_filename[0], 'wb') as file: # write timestamp query 
    file.write(b'0V\x02\x01\x010Q0\r\x06\t`\x86H\x01' 
       b'e\x03\x04\x02\x03\x05\x00\[email protected]') 
    file.write(h.digest()) 
0

Чтобы расширить на @j-f-sebastian's answer, если вы хотите, чтобы хэш с помощью SHA-256 (или любой 256 битной хэш-функцию), используйте следующая константа:

b'06\x02\x01\x01010\r\x06\t`\x86H\x01e\x03\x04\x02\x01\x05\x00\x04 ' 

(да, последний символ пустого пространства)