Пример #1
0
    def test_enhanced_concatentation(self):
        first = binary.ByteArray(b"ABC")
        second = binary.ByteArray(b"DEF")
        first += second
        target = binary.ByteArray(b"ABCDEF")

        self.assertEquals(first, target)
Пример #2
0
 def test_get_index(self):
     self.assertEquals(binary.ByteArray([99])[0], 99)
     self.assertEquals(binary.ByteArray([99, 1, 10])[2], 10)
     self.assertRaises((IndexError, KeyError),
                       lambda: binary.ByteArray([])[0])
     self.assertRaises((IndexError, KeyError),
                       lambda: binary.ByteArray([2, 3])[4])
Пример #3
0
    def test_enhanced_binary_and(self):
        first = binary.ByteArray([3, 24])
        second = binary.ByteArray([2, 18])
        first &= second
        target = binary.ByteArray([2, 16])

        self.assertEquals(first, target)
Пример #4
0
    def test_enhanced_binary_xor(self):
        first = binary.ByteArray([3, 24])
        second = binary.ByteArray([2, 18])
        first ^= second
        target = binary.ByteArray([1, 10])

        self.assertEquals(first, target)
Пример #5
0
    def test_concatenation(self):
        first = binary.ByteArray(b"ABC")
        second = binary.ByteArray(b"DEF")
        result = first + second
        target = binary.ByteArray(b"ABCDEF")

        self.assertEquals(result, target)
        self.assertNotEquals(result, first)
Пример #6
0
    def test_binary_xor(self):
        first = binary.ByteArray([3, 24])
        second = binary.ByteArray([2, 18])
        result = first ^ second
        target = binary.ByteArray([1, 10])

        self.assertEquals(result, target)
        self.assertNotEquals(result, first)
Пример #7
0
    def test_set_index(self):
        bytes_ = binary.ByteArray([1, 2, 3])

        bytes_.bits[0] = 0
        bytes_.bits[8] = 1
        bytes_.bits[9] = 0
        bytes_.bits[10] = 1

        self.assertEqual(bytes_, binary.ByteArray([0, 5, 3]))
Пример #8
0
 def __init__(self, type_="private", data=None):
     """Generates a new key or loads one (from binary)."""
     
     if data is None:
         self._key = M2Crypto.RSA.gen_key(self.default_bits, self.default_exponent, noop)
         
         if type_ == "private":
             self.type = "private"
         else:
             raise ValueError("Can only generate keys of type \"private\".")
     else:
         if type_ == "private":
             self.type = "private"
             armor_type = "RSA PRIVATE KEY"
         else:
             self.type = "public"
             armor_type = "PUBLIC KEY"
         
         self._data = binary.ByteArray(data)
         
         armored = asciiarmor.AsciiArmored(data=self._data, type_=armor_type)
         
         # I couldn't get M2Crypto.BIO to work instead of using a
         # tempfile here, but I'm not sure if that was my fault.
         with tempfile.NamedTemporaryFile() as f:
             f.write(armored.dumps())
             f.flush()
             
             if self.type == "private":
                 self._key = M2Crypto.RSA.load_key(f.name)
             else:
                 self._key = M2Crypto.RSA.load_pub_key(f.name)
Пример #9
0
    def test_get_index(self):
        bits = binary.ByteArray([1, 8]).bits

        self.assertEquals(1, bits[0])
        self.assertEquals(0, bits[1])
        self.assertEquals(0, bits[7])
        self.assertEquals(1, bits[8 + 3])
        self.assertEquals(0, bits[8 + 4])
Пример #10
0
 def loads(cls, s, type_=None):
     lines = s.split("\n")
     
     # look for opening armor header
     
     armor_header_type = None
     
     for index, line in enumerate(lines):
         armor_header_match = re.match("^-{5}BEGIN( (?P<type>.+))?-{5}$", line)
         
         if (armor_header_match
             and (type_ is None
                  or type_ == armor_header_match.group("type"))):
             armor_header_type = armor_header_match.group("type")
             
             armor_header_line_index = index
             
             break
     else:
         raise ValueError("Could not find data!", s)
     
     # read ascii armors headers
     
     armor_headers = []
     
     for index, line in enumerate(lines[armor_header_line_index + 1:],
                                  start=armor_header_line_index + 1):
         if ": " in line:
             name, _, value = line.partition(": ")
             armor_headers.append((name, value))
             index_after_armor_headers = index + 1
         else:
             index_after_armor_headers = index
             break
     else:
         raise ValueError("Unexpected end of input; "
                          "expecting ASCII Armor headers or data.")
     
     # read radix64 data
     
     base64data = ""
     
     for index, line in enumerate(lines[index_after_armor_headers:],
                                  start=index_after_armor_headers):
         armor_tail_match = re.match("^-{5}END( (?P<type>.+))?-{5}$", line)
         
         canonized_line = re.sub("[^A-Za-z0-9\\+\\/\\=]", "", line)
         
         checksum_match = re.match("^=[A-Za-z0-9]", canonized_line)
         
         if checksum_match or armor_tail_match:
             break
         else:
             base64data += canonized_line
     
     data = binary.ByteArray(base64.b64decode(base64data))
     
     return cls(data=data, type_=armor_header_type, headers=armor_headers)
Пример #11
0
    def test_something(self):
        data = binary.ByteArray(b"This is simple text... " * 48)

        private = json.loads(
            '{"__type__":"rsa-key","data":{"__type__":"binary","data":"MIIEpAIBAAKCAQEAwUNfJfkXY7qPDYgdevHR1huRCTfzAq7y33KqTvt278KjfJPhBkbW35Bu6mgH9e1eb9Xt8ZM21Utus5OKXb6CKAX3donEGdhtlzSFQQrKK0z9DZuaWqd4sEx54D3Qv9GMkpg9nglZCyjefMw40nwrBPacD2MjO9L4aWQKmcExT3hiE5JOIVnvRQG8URcu0MRs55GjVq0mOsCN3vRwCRENOyhsOqhz/HoS20pHN3WPgYR0uSLSHM7EXU/yVpQQumaZJbP3p0qVpc9VBedxEoHV2kwBY2RFJpD9zN+NR5GcHlmRKXnynsd4qQj50nAdQWWu0C1+Bq8XUVkJODMEi5vsDwIDAQABAoIBAQCp1AAqqEcrdeb7Zx8wyIsycKr0xNuhAgee325VVZhgfFOZx4E4OMvdTViKV7yXGW2hLQaZAFpw+IZg+0fdtOk/Lm8VFV7jr1IuSxLF4ytg/ZhpetEa1IuzsKBwsyFbTlMPBwUueNxseA967yMHo+FRzTu6Mc3mZi+wvR6rmh8wyvsKzZ3Th+iJ3ZY4wCulktnaXfcHx5XHB6TWdCMo+mvGtqCn2SGhUP73CfTiWHItOAzhrrY70rnpdOPFhULCF4Dk6G6+pCmRrAT/Xotv6lZhUNWHcCY9Solq5b/ObSEEu9NBmVrgpJwVp8pSUwgazQwME/7twSctf80DfkmCHVARAoGBAOyI5yX+RAxg4CXkuzAtbJxTMm0bDdFzwXuMXiXytfxBEr6prCIDL0NATzsuZGn3l1sZi8FFSzws7DwjmFLKLl/orxdTBLcGKwj0pRyaPFGymZe1srRFROjn6KvBLexVCgUbTxr6ym94cgfqiEWlj5iAGJw8m+/ZMYvWAfXONuo7AoGBANEq3MM5vU+D9DXfJp+nYIep6gwqHUisuku4A4BOHAegxQSVcxb+IDc0mCZykp2dTCNr/ekiglwQo2EpDFSLj5y2Kb8XjBgeZ0UuF8JM18DufZB3W1I/3Hxa2KjEhT3bKLIpjBMrwamQKY6igoHVp49MNstlPTp7q6cVNB7NlJQ9AoGBAOPazbCPy8WQ3NwkBx5V47aDfqQT16/ZLp1xjpBHyn+BwCjjEeqB3tmN7cU434ok9CzR4wr/UYZaUAdu0qGOGjZR07lIQ9Z7nqE16ogvG8QnpEW8xrVZtRQXss8hfLeZA9n/gKigxrmy8UYm67cL0dQ6MXrv99eJBm2KbsD3MXdZAoGAVN/AntMyFy7jDG0VPhlr2QDAgNkh8thr68eqXAjV5N5+s4J1JfJOXjhQOOGqzpwCRilO6afgH718njNK1o+e4aclP24toafMncy7RVNrBNWBS/qyqqhRLoCqg6jirBve4pRrS2go+EYQJtmYfViV2lbBsTzOYInIOE8pTAp9bL0CgYBCPXvZMe+sD+oiVBf9IcyM9z+izT9bcdBvU0u8I497ar2g9w/LZthWd5LeLVA12TRNOd9vaWEO92HhwD9a6JUAvRuDToA3upV5bpizzi4TaFTY8zf/qWl5Ng7lbiWz6D1tEtblIaNWCtmFNbqU8fJXgoT+2a3lUfX/9SOHHhFpRQ==","encoding":"base64"},"type":"private"}'
        )
        json.dumps(json.loads(json.dumps(private.wrap_signature(data))))
        message = json.loads(
            '{"__type__":"signed-binary","data":{"__type__":"binary","data":"This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... This is simple text... "},"key":{"__type__":"rsa-key","b32_id":"jztheogssykq7vci2c5qry47mu5pjcpvll6tepkscklcvscm3f7q","data":{"__type__":"binary","data":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwUNfJfkXY7qPDYgdevHR1huRCTfzAq7y33KqTvt278KjfJPhBkbW35Bu6mgH9e1eb9Xt8ZM21Utus5OKXb6CKAX3donEGdhtlzSFQQrKK0z9DZuaWqd4sEx54D3Qv9GMkpg9nglZCyjefMw40nwrBPacD2MjO9L4aWQKmcExT3hiE5JOIVnvRQG8URcu0MRs55GjVq0mOsCN3vRwCRENOyhsOqhz/HoS20pHN3WPgYR0uSLSHM7EXU/yVpQQumaZJbP3p0qVpc9VBedxEoHV2kwBY2RFJpD9zN+NR5GcHlmRKXnynsd4qQj50nAdQWWu0C1+Bq8XUVkJODMEi5vsDwIDAQAB","encoding":"base64"}},"signature":{"__type__":"binary","data":"YYn55KV89p8kbHl8oEzRttRaULEh9NWOUhklNAGZtqsDS+od1g6m4OCMwvjIib8Le37rujubxATfgrFxFO2GNRNZLAm5W5MIL6KQPABFgfLJnHO9tCcdNEAfjcwbKD2LDsr51SDtdgvXd3lztCKpYT/BUQpY7MWE89M1m0WJ/26VlFOQKDvFC9A0hYAqVDIokO7TIz03RzrNQjNootDH3ieX3TBAIG46G+tWabfb/6isa/urgv4FzciFfN8b2bLA6A3/2GLfIB/xNthxkX9wPlMK5RpF/FvMv0wn/ffUtp4kWSok4VaFUcx6/IOP8HYtlP0zojTcqhXqEO2vJhLPwA==","encoding":"base64"}}'
        )
Пример #12
0
 def sign(self, data, hash_name=None, padding=None, salt_length=None):
     """Generates a signature for some data using the key.
     """
     
     if self.type != "private":
         raise ValueError("Private key required to generate signature.")
     
     digest = hashlib.new(hash_name or self.default_hash_name, data).digest()
     
     signature = self._key.sign_rsassa_pss(digest, hash_name or self.default_hash_name)
     
     return binary.ByteArray(signature)
Пример #13
0
 def test_boolean_conversion(self):
     self.assertEquals(False, bool(binary.ByteArray([])))
     self.assertEquals(True, bool(binary.ByteArray([0])))
     self.assertEquals(True, bool(binary.ByteArray([0, 0, 1])))
     self.assertEquals(True, bool(binary.ByteArray([1, 0, 0])))
     self.assertEquals(True, bool(binary.ByteArray([0, 1, 0])))
     self.assertEquals(True, bool(binary.ByteArray([1, 1, 1])))
Пример #14
0
    def test_set_slice(self):
        original = binary.ByteArray([1, 2, 3])
        original[1:2] = [2, 2]

        assert isinstance(original, binary.ByteArray)
        self.assertEquals(original, binary.ByteArray([1, 2, 2, 3]))

        original2 = binary.ByteArray([1, 2, 3])
        original2[2:] = [3, 4, 5]

        assert isinstance(original2, binary.ByteArray)
        self.assertEquals(original2, binary.ByteArray([1, 2, 3, 4, 5]))

        original3 = binary.ByteArray([1, 2])
        original3[2:] = [3, 4, 5]

        assert isinstance(original3, binary.ByteArray)
        self.assertEquals(original3, binary.ByteArray([1, 2, 3, 4, 5]))
Пример #15
0
 def test_length(self):
     self.assertEquals(len(binary.ByteArray([16, 9, 1])), 3)
     self.assertEquals(len(binary.ByteArray([])), 0)
     self.assertEquals(len(binary.ByteArray([8])), 1)
Пример #16
0
 def wrap_signature(self, data):
     return SignedBinary(binary.ByteArray(data), self.public, self.sign(data))
Пример #17
0
    def test_binary_invert(self):
        original = binary.ByteArray([3, 24])
        target = binary.ByteArray([252, 231])

        self.assertEquals(~original, target)
Пример #18
0
    def test_set_index(self):
        original = binary.ByteArray([1, 2, 3])
        original[1] = 4

        self.assertEquals(original, binary.ByteArray([1, 4, 3]))
Пример #19
0
 def test_get_slice(self):
     self.assertEquals(
         binary.ByteArray([99, 1, 10])[:2], binary.ByteArray([99, 1]))
     self.assertEquals(
         binary.ByteArray([99, 1, 10])[4:], binary.ByteArray([]))
Пример #20
0
 def test_from_integer(self):
     self.assertEquals(
         binary.ByteArray.from_int(1 * 2**16 + 2 * 2**8 + 3 * 2**0),
         binary.ByteArray([3, 2, 1]))
Пример #21
0
 def test_iterate(self):
     self.assertEquals(list(binary.ByteArray([16, 9]).bits),
                       [0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0])
Пример #22
0
 def test_to_integer(self):
     self.assertEquals(
         binary.ByteArray([3, 2, 1]).to_int(),
         1 * 2**16 + 2 * 2**8 + 3 * 2**0)
Пример #23
0
 def __init__(self, data=None, type_=None, headers=None):
     self.data = binary.ByteArray(data) if data else binary.ByteArray()
     self.type = type_ or "PGP MESSAGE"
     self.headers = headers or []
Пример #24
0
    def test_to_json_equvilent(slef):
        original = binary.ByteArray([0, 1, 2, 3, 5, 9])
        original2 = binary.ByteArray(b"Hello, World!!")
        original3 = binary.ByteArray(b"Hello, World!!" + b"\x00" * 6)
        original4 = binary.ByteArray(b"Hello, World!!" + b"\x00" * 7)
        original5 = binary.ByteArray(b'''{
            "__type__": "signed-binary",
            "data": {
                "__type__": "binary",
                "data": "{\"v\":1,\"@\":\"66.228.39.163\"}\n"
            },
            "key": {
                "__type__": "rsa-key",
                "b32_id": "tu3krs5sjnnrauae6qrdp2k2jmgw2dgehgl6emfic7gzs2hcg3aq",
                "data": {
                    "__type__": "binary",
                    "data": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4e5b5O2Fik9RB0uQr7pLTHiBocLn//ivjdjfOECcfYpYJ8UlaKWisLwwb9LlARUd5kP2TfIG183VjwBCG0MhiAX8Oz6aLs5PbCVVCItm3QSgxytoFDzDGMxtOsiPqffoBSlP5zm6vTKDCKCzGlPR6G2PypyR2OkL+5ZPZV1D1+iCzfHIfox/WoR1rDPfxPIimFwF62UY1BKn5b9vmuhDzAL9GBYqv/CwAqqgLy838KcqaN2UX56890BfUWNWDMLKtDbygDThAIsnMZp7QPMUHFH7MKcsZ/pNUgLG25ErqbuQskxeePyBXuiEEIUZIGG1hCYE90FwNmx9Wo0h6cirBwIDAQAB",
                    "encoding": "base64"
                }
            },
            "signature": {
                "__type__": "binary",
                "data": "XMjnqB1+TMu/UHrYpMkJrXuodxoH3qiYDdXa4rgu4oHV4Tdgacyr4ot1yS5YLTyQ0+IbXjUBD8+6dbU2sDcFkVtS0U+sNWUDejplSvfM4kYsHxi58ZvUwLPJ+WdZRtAjyKLIE6JJVMwTJBn5pq+PYeJcbW32Iw/rJy1Gz45v5SY1RJGHCxfxhlA1iB6NWeclr7S2wkBg6L4cMwot+lzbppT56CNkNL1teapxMhkIyhqW+QC0wX8zgmzpaeeB4n/OzHwi0AuyFkkrf0QE2negAmbDnxZJpsLXKFHcychNe616mq0eahASCMN1apiu5v8MwNWluI6RZbbo2sSrLFOTRg==",
                "encoding": "base64"
            }
        }''')

        j = lambda o, e=None: repr(json.dumps(o.to_json_equivalent(e)))

        assert json.dumps(original.to_json_equivalent()
                          ) == '{"data":"AAECAwUJ","encoding":"base64"}'
        assert json.dumps(
            original2.to_json_equivalent()) == '{"data":"Hello, World!!"}'
        assert json.dumps(original3.to_json_equivalent(
        )) == '{"data":"SGVsbG8sIFdvcmxkISEAAAAAAAA=","encoding":"base64"}'
        assert json.dumps(original4.to_json_equivalent(
        )) == '{"data":"SGVsbG8sIFdvcmxkISEAAAAAAAAA","encoding":"base64"}'
        assert json.dumps(
            original5.to_json_equivalent()
        ) == '{"data":"QlpoOTFBWSZTWbDiqHEAAkl/gARUQABQD//yf///8L////pAAryZ1J2y7OKjU9I00NB6mmRo9QyD0nqaBiGINNA0aNBFNTEwKabCNMTJ6maSeaiaeJlPATEoDQNCKm0p6YjT0no1T9E01PTKPJkwp5DR6IZTQABoJQVI9TRoBtMoPKAeo0PKGg09RsoaDQ0PUzALLM9LY7o6Dsw9oBAgBCNETXZf4Mm00ub3lZShiepYF3/zU0yEvLeV0HYdRmdVLqy0cEsNO7QuWkhAHnHCVULlqeVT/kxYpofAaQHu/NaVp4/abYol26mDzE/HkZSQ39GqAo0k0Fpvf2I1tei3IUf0MBeyIPxF7sjCP7TLKZga+tXvE46LT9POJpD4q0BX+Q5xcG/1w/rHyqqSGQf+FS/QlttlGTFvQdzbLFL30UDMAA+B6HUoFn+Gr59rnREUR9bPOrwnJhGifpLYKGyJ1B+0ikefj0b4ZzzRO9yflViGZJrqhuYfgPe8QkjeTCJsgi0wCgMWjXshrJzW5IjWzPiIOBdtTfmcdgchwtVBxZPxkG+56+Sdzh7HxMzv75tak86yvCLmczLeOvL1jHKrnuNojmIiroWt6S5nudFzpOx21ihopHVTmdc3FFtVzUyHZsX4txHR75Rv75xzsApAIIb9ob045TqPRsOKpaWNkvFqFseLVuTjyDt+MZSeiQW11SLPWTWdZPXFhTATgrRFZPI+7XmoS9HLsxFJKgNLbIpQjqSHDx/hgUmAyYERpgSmB5Xde0FWGO53LNUG4QoNt60W8sfpBX0QFFjJcx3e2ZcWHqv1+MmxGYDd4ZEph2M4AxX6mA4PiQKfUC4/FDTgDlPlMnrFMVkobAJoNyNXygjpjKuuCCNLZOUHlzBD0YiDYv74j3PzTsyM1Avu2z6GE+l6vEqY6jQygnAHwZL0v02SINqbm++B8LriGPa3ZTZMidQ9cuaf3Lm7U89DZU247vO+4wTNxrMsAYcYIPogsB7WZJS0rpDaCjSkpJduh0YAkcOA6oM3ESB6O9Ytl/htbbaaGny6MwLalIB1cNbBGF24ABOu4ux5iY7fpSD3UAe63IMu3W5MwH0BqHYGBfPRsJj0R6dwRKqRoCyl1eGRLZzY1d2jRba5eRxYW5K5uus1OtNfncIwVGqqlrPWWbkkmQt2p/PBURNO2O/JF8ZAn+srMWf4u5IpwoSFhxVDiA==","encoding":"bzip2-base64"}'

        assert json.dumps(original.to_json_equivalent("text")) != json.dumps(
            original.to_json_equivalent("base64"))
        assert json.dumps(original2.to_json_equivalent("text")) != json.dumps(
            original2.to_json_equivalent("base64"))
        assert json.dumps(original3.to_json_equivalent("text")) != json.dumps(
            original3.to_json_equivalent("base64"))
        assert json.dumps(original4.to_json_equivalent("text")) != json.dumps(
            original4.to_json_equivalent("base64"))

        assert len(json.dumps(original.to_json_equivalent())) <= len(
            json.dumps(original.to_json_equivalent("base64")))
        assert len(json.dumps(original.to_json_equivalent())) <= len(
            json.dumps(original.to_json_equivalent("text")))
        assert len(json.dumps(original2.to_json_equivalent())) <= len(
            json.dumps(original2.to_json_equivalent("base64")))
        assert len(json.dumps(original2.to_json_equivalent())) <= len(
            json.dumps(original2.to_json_equivalent("text")))
        assert len(json.dumps(original3.to_json_equivalent())) <= len(
            json.dumps(original3.to_json_equivalent("base64")))
        assert len(json.dumps(original3.to_json_equivalent())) <= len(
            json.dumps(original3.to_json_equivalent("text")))
        assert len(json.dumps(original4.to_json_equivalent())) <= len(
            json.dumps(original4.to_json_equivalent("base64")))
        assert len(json.dumps(original4.to_json_equivalent())) <= len(
            json.dumps(original4.to_json_equivalent("text")))