blob: 62e933f25f59d11bdc24907dee161481c5fed372 [file] [log] [blame]
Yesudeep Mangalapillyfd1ec362011-08-11 01:47:46 +05301# -*- coding: utf-8 -*-
Roy Kokkelkoren0659aac2015-10-25 16:12:11 +01002#
3# Copyright 2011 Sybren A. Stüvel <sybren@stuvel.eu>
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
Sybren A. Stüvel3934ab42016-02-05 16:01:20 +01009# https://www.apache.org/licenses/LICENSE-2.0
Roy Kokkelkoren0659aac2015-10-25 16:12:11 +010010#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
Yesudeep Mangalapillyfd1ec362011-08-11 01:47:46 +053016
Sybren A. Stüveled1c81d2016-01-14 12:23:32 +010017import unittest
Yesudeep Mangalapillyfd1ec362011-08-11 01:47:46 +053018import struct
19
Michael Manganiellod3727172017-01-16 08:38:08 -030020from rsa._compat import byte, is_bytes, range, xor_bytes
Yesudeep Mangalapillyfd1ec362011-08-11 01:47:46 +053021
Sybren A. Stüveld3d10342016-01-22 11:36:06 +010022
23class TestByte(unittest.TestCase):
Michael Manganiellod3727172017-01-16 08:38:08 -030024 """Tests for single bytes."""
25
Yesudeep Mangalapillyfd1ec362011-08-11 01:47:46 +053026 def test_byte(self):
27 for i in range(256):
28 byt = byte(i)
29 self.assertTrue(is_bytes(byt))
30 self.assertEqual(ord(byt), i)
31
32 def test_raises_StructError_on_overflow(self):
33 self.assertRaises(struct.error, byte, 256)
34 self.assertRaises(struct.error, byte, -1)
Sybren A. Stüvelf0627be2016-03-17 15:52:23 +010035
36 def test_byte_literal(self):
adamantike9f577402016-05-08 15:36:57 -030037 self.assertIsInstance(b'abc', bytes)
Michael Manganiellod3727172017-01-16 08:38:08 -030038
39
40class TestBytes(unittest.TestCase):
41 """Tests for bytes objects."""
42
43 def setUp(self):
44 self.b1 = b'\xff\xff\xff\xff'
45 self.b2 = b'\x00\x00\x00\x00'
46 self.b3 = b'\xf0\xf0\xf0\xf0'
47 self.b4 = b'\x4d\x23\xca\xe2'
48 self.b5 = b'\x9b\x61\x3b\xdc'
49 self.b6 = b'\xff\xff'
50
51 self.byte_strings = (self.b1, self.b2, self.b3, self.b4, self.b5, self.b6)
52
53 def test_xor_bytes(self):
54 self.assertEqual(xor_bytes(self.b1, self.b2), b'\xff\xff\xff\xff')
55 self.assertEqual(xor_bytes(self.b1, self.b3), b'\x0f\x0f\x0f\x0f')
56 self.assertEqual(xor_bytes(self.b1, self.b4), b'\xb2\xdc\x35\x1d')
57 self.assertEqual(xor_bytes(self.b1, self.b5), b'\x64\x9e\xc4\x23')
58 self.assertEqual(xor_bytes(self.b2, self.b3), b'\xf0\xf0\xf0\xf0')
59 self.assertEqual(xor_bytes(self.b2, self.b4), b'\x4d\x23\xca\xe2')
60 self.assertEqual(xor_bytes(self.b2, self.b5), b'\x9b\x61\x3b\xdc')
61 self.assertEqual(xor_bytes(self.b3, self.b4), b'\xbd\xd3\x3a\x12')
62 self.assertEqual(xor_bytes(self.b3, self.b5), b'\x6b\x91\xcb\x2c')
63 self.assertEqual(xor_bytes(self.b4, self.b5), b'\xd6\x42\xf1\x3e')
64
65 def test_xor_bytes_length(self):
66 self.assertEqual(xor_bytes(self.b1, self.b6), b'\x00\x00')
67 self.assertEqual(xor_bytes(self.b2, self.b6), b'\xff\xff')
68 self.assertEqual(xor_bytes(self.b3, self.b6), b'\x0f\x0f')
69 self.assertEqual(xor_bytes(self.b4, self.b6), b'\xb2\xdc')
70 self.assertEqual(xor_bytes(self.b5, self.b6), b'\x64\x9e')
71 self.assertEqual(xor_bytes(self.b6, b''), b'')
72
73 def test_xor_bytes_commutative(self):
74 for first in self.byte_strings:
75 for second in self.byte_strings:
76 min_length = min(len(first), len(second))
77 result = xor_bytes(first, second)
78
79 self.assertEqual(result, xor_bytes(second, first))
80 self.assertEqual(len(result), min_length)