Example #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)
Example #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])
Example #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)
Example #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)
Example #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)
Example #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)
Example #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]))
Example #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)
Example #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])
Example #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)
Example #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"}}'
        )
Example #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)
Example #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])))
Example #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]))
Example #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)
Example #16
0
 def wrap_signature(self, data):
     return SignedBinary(binary.ByteArray(data), self.public, self.sign(data))
Example #17
0
    def test_binary_invert(self):
        original = binary.ByteArray([3, 24])
        target = binary.ByteArray([252, 231])

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

        self.assertEquals(original, binary.ByteArray([1, 4, 3]))
Example #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([]))
Example #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]))
Example #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])
Example #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)
Example #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 []
Example #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")))