def content(self):
     raw_name = self.name.encode('utf8', 'replace')
     if self.namespace:
         raw_name += b'@' + self.namespace.encode('utf8', 'replace')
     raw_value = self.value
     if self.human_readable:
         raw_value = raw_value.encode('utf8', 'replace')
     data = bytearray([0x80 if self.human_readable else 0, 0, 0, 0])
     data.extend(utils.int_to_2byte(len(raw_name)))
     data.extend(utils.int_to_2byte(len(raw_value)))
     data.extend(raw_name)
     data.extend(raw_value)
     return data
Esempio n. 2
0
 def content(self):
     raw_name = self.name.encode("utf8", "replace")
     if self.namespace:
         raw_name += b"@" + self.namespace.encode("utf8", "replace")
     raw_value = self.value
     if self.human_readable:
         raw_value = raw_value.encode("utf8", "replace")
     data = bytearray([0x80 if self.human_readable else 0, 0, 0, 0])
     data.extend(utils.int_to_2byte(len(raw_name)))
     data.extend(utils.int_to_2byte(len(raw_value)))
     data.extend(raw_name)
     data.extend(raw_value)
     return data
Esempio n. 3
0
def make_notation_subpacket(namespace,
                            name,
                            value,
                            is_text,
                            critical=False,
                            hashed=True):
    data = bytearray([0x80 if is_text else 0x00, 0x00, 0x00, 0x00])
    name_with_namespace = u'{0}@{1}'.format(name, namespace)
    value_bytes = value
    if is_text:
        value_bytes = value.encode('utf8')
    name_with_namespace_bytes = name_with_namespace.encode('utf8')
    data.extend(utils.int_to_2byte(len(name_with_namespace_bytes)))
    data.extend(utils.int_to_2byte(len(value_bytes)))
    data.extend(bytearray(name_with_namespace_bytes))
    data.extend(bytearray(value_bytes))
    return make_signature_subpacket(20, data, critical, hashed)
Esempio n. 4
0
def make_notation_subpacket(namespace, name, value, is_text, critical=False,
                            hashed=True):
    data = bytearray([
            0x80 if is_text else 0x00,
            0x00,
            0x00,
            0x00
            ])
    name_with_namespace = u'{0}@{1}'.format(name, namespace)
    value_bytes = value
    if is_text:
        value_bytes = value.encode('utf8')
    name_with_namespace_bytes = name_with_namespace.encode('utf8')
    data.extend(utils.int_to_2byte(len(name_with_namespace_bytes)))
    data.extend(utils.int_to_2byte(len(value_bytes)))
    data.extend(bytearray(name_with_namespace_bytes))
    data.extend(bytearray(value_bytes))
    return make_signature_subpacket(20, data, critical, hashed)
Esempio n. 5
0
def signature_to_bytes(signature):
    result = bytearray()
    sig_version = signature['sig_version']
    result.append(sig_version)
    if sig_version >= 4:
        result.append(signature['sig_type'])
        result.append(signature['pub_algorithm_type'])
        result.append(signature['hash_algorithm_type'])
        hashed_subpacket_data = bytearray()
        unhashed_subpacket_data = bytearray()
        for sp in signature['subpackets']:
            subpacket_data = subpacket_to_bytes(sp)
            if sp['hashed']:
                hashed_subpacket_data.extend(subpacket_data)
            else:
                unhashed_subpacket_data.extend(subpacket_data)

        result.extend(utils.int_to_2byte(len(hashed_subpacket_data)))
        result.extend(hashed_subpacket_data)
        result.extend(utils.int_to_2byte(len(unhashed_subpacket_data)))
        result.extend(unhashed_subpacket_data)

    elif sig_version in (2, 3):
        result.append(0x05)
        result.append(signature['sig_type'])
        result.extend(utils.int_to_4byte(signature['creation_time']))
        result.extend(signature['key_id'])
        result.append(signature['pub_algorithm_type'])
        result.append(signature['hash_algorithm_type'])

    result.extend(signature['hash2'])
    for value in signature['values']:
        if value is None:
            continue
        result.extend(utils.int_to_mpi(value))

    return result
Esempio n. 6
0
def signature_to_bytes(signature):
    result = bytearray()
    sig_version = signature['sig_version']
    result.append(sig_version)
    if sig_version >= 4:
        result.append(signature['sig_type'])
        result.append(signature['pub_algorithm_type'])
        result.append(signature['hash_algorithm_type'])
        hashed_subpacket_data = bytearray()
        unhashed_subpacket_data = bytearray()
        for sp in signature['subpackets']:
            subpacket_data = subpacket_to_bytes(sp)
            if sp['hashed']:
                hashed_subpacket_data.extend(subpacket_data)
            else:
                unhashed_subpacket_data.extend(subpacket_data)

        result.extend(utils.int_to_2byte(len(hashed_subpacket_data)))
        result.extend(hashed_subpacket_data)
        result.extend(utils.int_to_2byte(len(unhashed_subpacket_data)))
        result.extend(unhashed_subpacket_data)

    elif sig_version in (2, 3):
        result.append(0x05)
        result.append(signature['sig_type'])
        result.extend(utils.int_to_4byte(signature['creation_time']))
        result.extend(signature['key_id'])
        result.append(signature['pub_algorithm_type'])
        result.append(signature['hash_algorithm_type'])

    result.extend(signature['hash2'])
    for value in signature['values']:
        if value is None:
            continue
        result.extend(utils.int_to_mpi(value))

    return result
Esempio n. 7
0
def public_key_to_bytes(pubkey):
    result = bytearray([pubkey['version']])
    result.extend(utils.int_to_4byte(pubkey['creation_time']))
    if pubkey['version'] in (2, 3):
        result.extend(utils.int_to_2byte(pubkey['expiration_days']))
    result.append(pubkey['pub_algorithm_type'])
    if pubkey['pub_algorithm_type'] in (1, 2, 3):
        result.extend(utils.int_to_mpi(pubkey['modulus']))
        result.extend(utils.int_to_mpi(pubkey['exponent']))
    elif pubkey['pub_algorithm_type'] == 17:
        result.extend(utils.int_to_mpi(pubkey['prime']))
        result.extend(utils.int_to_mpi(pubkey['group_order']))
        result.extend(utils.int_to_mpi(pubkey['group_gen']))
        result.extend(utils.int_to_mpi(pubkey['key_value']))
    elif pubkey['pub_algorithm_type'] in (16, 20):
        result.extend(utils.int_to_mpi(pubkey['prime']))
        result.extend(utils.int_to_mpi(pubkey['group_gen']))
        result.extend(utils.int_to_mpi(pubkey['key_value']))

    return result
Esempio n. 8
0
def public_key_to_bytes(pubkey):
    result = bytearray([pubkey['version']])
    result.extend(utils.int_to_4byte(pubkey['creation_time']))
    if pubkey['version'] in (2, 3):
        result.extend(utils.int_to_2byte(pubkey['expiration_days']))
    result.append(pubkey['pub_algorithm_type'])
    if pubkey['pub_algorithm_type'] in (1, 2, 3):
        result.extend(utils.int_to_mpi(pubkey['modulus']))
        result.extend(utils.int_to_mpi(pubkey['exponent']))
    elif pubkey['pub_algorithm_type'] == 17:
        result.extend(utils.int_to_mpi(pubkey['prime']))
        result.extend(utils.int_to_mpi(pubkey['group_order']))
        result.extend(utils.int_to_mpi(pubkey['group_gen']))
        result.extend(utils.int_to_mpi(pubkey['key_value']))
    elif pubkey['pub_algorithm_type'] in (16, 20):
        result.extend(utils.int_to_mpi(pubkey['prime']))
        result.extend(utils.int_to_mpi(pubkey['group_gen']))
        result.extend(utils.int_to_mpi(pubkey['key_value']))

    return result
Esempio n. 9
0
 def to_signable_data(self, signature_type, signature_version=3):
     result = bytearray()
     if self.version >= 4:
         result.append(self.version)
     result.append(self.signature_type)
     if self.version < 4:
         result.extend(
             utils.int_to_4byte(time.mktime(
                 self.creation_time.timetuple())))
     else:
         result.append(self.public_key_algorithm)
         result.append(self.hash_algorithm)
         hashed_subpacket_data = b''.join(map(bytes,
                                              self.hashed_subpackets))
         hashed_subpacket_length = len(hashed_subpacket_data)
         result.extend(utils.int_to_2byte(hashed_subpacket_length))
         result.extend(hashed_subpacket_data)
         result.append(self.version)
         result.append(255)
         result.extend(utils.int_to_4byte(hashed_subpacket_length + 6))
     return result
Esempio n. 10
0
 def to_signable_data(self, signature_type, signature_version=3):
     result = bytearray()
     if self.version >= 4:
         result.append(self.version)
     result.append(self.signature_type)
     if self.version < 4:
         result.extend(utils.int_to_4byte(
             time.mktime(self.creation_time.timetuple())
         ))
     else:
         result.append(self.public_key_algorithm)
         result.append(self.hash_algorithm)
         hashed_subpacket_data = b''.join(
             map(bytes, self.hashed_subpackets))
         hashed_subpacket_length = len(hashed_subpacket_data)
         result.extend(utils.int_to_2byte(hashed_subpacket_length))
         result.extend(hashed_subpacket_data)
         result.append(self.version)
         result.append(255)
         result.extend(utils.int_to_4byte(hashed_subpacket_length + 6))
     return result