2015-02-26 3 views
0

Я пытаюсь реализовать пользовательский идентификатор объекта ASN1 в Python, это примеры тестовых примеров.Python. Преобразование идентификатора объекта ASN1

asn1_objectidentifier([1,2]) 
    asn1_objectidentifier([1,2,840]) 
    asn1_objectidentifier([1,2,840,5,1000000]) 
    asn1_objectidentifier([1,2,840,5,127,128,129]) 

, что мне не удалось сделать, кодирующая value3 ... значение п в базе 128 это мой код до сих пор

def asn1_objectidentifier(oid): 
    first_octet = 40 * oid[0] + oid[1] 
    rest = "" 
    length = 1 
    for v in range(2, len(oid)): 
     if oid[v] < 127: 
      rest += chr(oid[v]) 
      length += 1 
     else: 
      rem = oid[v]/128 
      first = (rem * 128)^1 
      second = (oid[v] - first) * 128^0 
      rest += int_to_bytestring(first) 
      rest += int_to_bytestring(second) 
      length += 2 
rest = chr(first_octet) + rest 
return chr(0x06) + chr(length) + rest 
+0

Для тех из нас, кто не знаком с ASN.1, что такое кодировка базы 128? – martineau

+1

@martineau Я также не мог узнать, что и в myselft я нашел один пример. это для идентификатора объекта 1.2.840, а 840 = 6 * 128^1 = 769 72 * 128^0 = 71 –

+0

В этой статье объясняется, как кодировать и декодировать дуги со значением 128 и более: https://msdn.microsoft .com/en-us/library/windows/desktop/bb540809 (v = vs.85) .aspx – Crypt32

ответ

1

Вот способ сделать основание 128 кодирования целого числа значения> -1:

def base128_encode(n): # int/long to byte string 
    if n > 0: 
     arr = [] 
     while n: 
      n, rem = divmod(n, 128) 
      arr.append(chr(rem)) 
     return ''.join(reversed(arr)) 
    elif n == 0: 
     return '\x00' 
    else: 
     raise ValueError 

print [ord(c) for c in base128_encode(840)] # --> [6, 72] 
+0

спасибо, это мне очень помогло :) –

+0

Илья: Это хорошая новость. Пожалуйста, подумайте, как помощь другим, добавив свое рабочее решение в конце вашего вопроса ... он может даже подняться. '' ;-) – martineau

2

отличная статья A Layman's Guide to a Subset of ASN.1, BER, and DER описывает это в деталях, и - самое ценно - дает ряд хороших тестовых случаев и реберных случаев.

К слову: у этого документа нет канонического дома в Интернете. Вышеупомянутая ссылка на справочную информацию CiteseerX; существуют другие PDF-файлы; и HTML versions.