summaryrefslogtreecommitdiffstats
path: root/x509/test_base64utils.py
diff options
context:
space:
mode:
authorJohn Dennis <jdennis@redhat.com>2013-11-08 09:52:19 -0500
committerJohn Dennis <jdennis@redhat.com>2013-11-08 09:52:19 -0500
commitef2869452735c1aa92e917375bb041bc86e9c45f (patch)
treefe54718f76cc167c5f08eba2611d5d0cfeee1456 /x509/test_base64utils.py
downloadutilities-ef2869452735c1aa92e917375bb041bc86e9c45f.tar.gz
utilities-ef2869452735c1aa92e917375bb041bc86e9c45f.tar.xz
utilities-ef2869452735c1aa92e917375bb041bc86e9c45f.zip
Two Python utility modules for PEM formated dataHEADmaster
base64utils provides functions for manipulating base64 data. pemutils utilizes functionality in base64utils. base64utils provides functionalty to: * tests if text is valid base64 * filter formatting from base64 * convert base64 between different alphabets * Handle padding issues - test if base64 is padded - removes padding - restores padding * wraps base64 text into formatted blocks - via iterator - return formatted string pemutils provides functionality to: * parse text and find all PEM blocks contained in the text. Information on the location of the block in the text, the type of PEM block, and it's base64 and binary data contents. * Search text for only a specfic PEM type (e.g. certificate) * parse text assumed to contain PEM data and return the binary data. * test if a block of text is a PEM block * convert base64 text into a formatted PEM block * convert binary data into a formatted PEM block * access to the valid PEM types and their headers, including conversion from deprecated PEM headers to the canonical header * Format either base64 or bindary data into PEM format
Diffstat (limited to 'x509/test_base64utils.py')
-rw-r--r--x509/test_base64utils.py197
1 files changed, 197 insertions, 0 deletions
diff --git a/x509/test_base64utils.py b/x509/test_base64utils.py
new file mode 100644
index 0000000..233465a
--- /dev/null
+++ b/x509/test_base64utils.py
@@ -0,0 +1,197 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2013 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from keystone.common import base64utils
+
+import unittest
+
+base64_alphabet = ('ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+ 'abcdefghijklmnopqrstuvwxyz'
+ '0123456789'
+ '+/=') # includes pad char
+
+base64url_alphabet = ('ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+ 'abcdefghijklmnopqrstuvwxyz'
+ '0123456789'
+ '-_=') # includes pad char
+
+
+class TestValid(unittest.TestCase):
+ def test_valid_base64(self):
+ self.assertTrue(base64utils.is_valid_base64('+/=='))
+ self.assertTrue(base64utils.is_valid_base64('+/+='))
+ self.assertTrue(base64utils.is_valid_base64('+/+/'))
+
+ self.assertFalse(base64utils.is_valid_base64('-_=='))
+ self.assertFalse(base64utils.is_valid_base64('-_-='))
+ self.assertFalse(base64utils.is_valid_base64('-_-_'))
+
+ self.assertTrue(base64utils.is_valid_base64('abcd'))
+ self.assertFalse(base64utils.is_valid_base64('abcde'))
+ self.assertFalse(base64utils.is_valid_base64('abcde=='))
+ self.assertFalse(base64utils.is_valid_base64('abcdef'))
+ self.assertTrue(base64utils.is_valid_base64('abcdef=='))
+ self.assertFalse(base64utils.is_valid_base64('abcdefg'))
+ self.assertTrue(base64utils.is_valid_base64('abcdefg='))
+ self.assertTrue(base64utils.is_valid_base64('abcdefgh'))
+
+ self.assertFalse(base64utils.is_valid_base64('-_=='))
+
+ def test_valid_base64url(self):
+ self.assertFalse(base64utils.is_valid_base64url('+/=='))
+ self.assertFalse(base64utils.is_valid_base64url('+/+='))
+ self.assertFalse(base64utils.is_valid_base64url('+/+/'))
+
+ self.assertTrue(base64utils.is_valid_base64url('-_=='))
+ self.assertTrue(base64utils.is_valid_base64url('-_-='))
+ self.assertTrue(base64utils.is_valid_base64url('-_-_'))
+
+ self.assertTrue(base64utils.is_valid_base64url('abcd'))
+ self.assertFalse(base64utils.is_valid_base64url('abcde'))
+ self.assertFalse(base64utils.is_valid_base64url('abcde=='))
+ self.assertFalse(base64utils.is_valid_base64url('abcdef'))
+ self.assertTrue(base64utils.is_valid_base64url('abcdef=='))
+ self.assertFalse(base64utils.is_valid_base64url('abcdefg'))
+ self.assertTrue(base64utils.is_valid_base64url('abcdefg='))
+ self.assertTrue(base64utils.is_valid_base64url('abcdefgh'))
+
+ self.assertTrue(base64utils.is_valid_base64url('-_=='))
+
+
+class TestBase64Padding(unittest.TestCase):
+
+ def test_filter(self):
+ self.assertEqual(base64utils.filter_formatting(''), '')
+ self.assertEqual(base64utils.filter_formatting(' '), '')
+ self.assertEqual(base64utils.filter_formatting('a'), 'a')
+ self.assertEqual(base64utils.filter_formatting(' a'), 'a')
+ self.assertEqual(base64utils.filter_formatting('a '), 'a')
+ self.assertEqual(base64utils.filter_formatting('ab'), 'ab')
+ self.assertEqual(base64utils.filter_formatting(' ab'), 'ab')
+ self.assertEqual(base64utils.filter_formatting('ab '), 'ab')
+ self.assertEqual(base64utils.filter_formatting('a b'), 'ab')
+ self.assertEqual(base64utils.filter_formatting(' a b'), 'ab')
+ self.assertEqual(base64utils.filter_formatting('a b '), 'ab')
+ self.assertEqual(base64utils.filter_formatting('a\nb\n '), 'ab')
+
+ text = ('ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+ 'abcdefghijklmnopqrstuvwxyz'
+ '0123456789'
+ '+/=')
+ self.assertEqual(base64_alphabet,
+ base64utils.filter_formatting(text))
+
+ text = (' ABCDEFGHIJKLMNOPQRSTUVWXYZ\n'
+ ' abcdefghijklmnopqrstuvwxyz\n'
+ '\t\f\r'
+ ' 0123456789\n'
+ ' +/=')
+ self.assertEqual(base64_alphabet,
+ base64utils.filter_formatting(text))
+ self.assertEqual(base64url_alphabet,
+ base64utils.base64_to_base64url(base64_alphabet))
+
+ text = ('ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+ 'abcdefghijklmnopqrstuvwxyz'
+ '0123456789'
+ '-_=')
+ self.assertEqual(base64url_alphabet,
+ base64utils.filter_formatting(text))
+
+ text = (' ABCDEFGHIJKLMNOPQRSTUVWXYZ\n'
+ ' abcdefghijklmnopqrstuvwxyz\n'
+ '\t\f\r'
+ ' 0123456789\n'
+ '-_=')
+ self.assertEqual(base64url_alphabet,
+ base64utils.filter_formatting(text))
+
+ def test_alphabet_conversion(self):
+ self.assertEqual(base64url_alphabet,
+ base64utils.base64_to_base64url(base64_alphabet))
+
+ self.assertEqual(base64_alphabet,
+ base64utils.base64url_to_base64(base64url_alphabet))
+
+ def test_is_padded(self):
+ self.assertTrue(base64utils.base64_is_padded('ABCD'))
+ self.assertTrue(base64utils.base64_is_padded('ABC='))
+ self.assertTrue(base64utils.base64_is_padded('AB=='))
+
+ self.assertTrue(base64utils.base64_is_padded('1234ABCD'))
+ self.assertTrue(base64utils.base64_is_padded('1234ABC='))
+ self.assertTrue(base64utils.base64_is_padded('1234AB=='))
+
+ self.assertFalse(base64utils.base64_is_padded('ABC'))
+ self.assertFalse(base64utils.base64_is_padded('AB'))
+ self.assertFalse(base64utils.base64_is_padded('A'))
+ self.assertFalse(base64utils.base64_is_padded(''))
+
+ self.assertRaises(base64utils.InvalidBase64Error,
+ base64utils.base64_is_padded, '=')
+
+ self.assertRaises(base64utils.InvalidBase64Error,
+ base64utils.base64_is_padded, 'AB=C')
+
+ self.assertRaises(base64utils.InvalidBase64Error,
+ base64utils.base64_is_padded, 'AB=')
+
+ self.assertRaises(base64utils.InvalidBase64Error,
+ base64utils.base64_is_padded, 'ABCD=')
+
+ def test_strip_padding(self):
+ self.assertEqual(base64utils.base64_strip_padding('ABCD'), 'ABCD')
+ self.assertEqual(base64utils.base64_strip_padding('ABC='), 'ABC')
+ self.assertEqual(base64utils.base64_strip_padding('AB=='), 'AB')
+
+ def test_assure_padding(self):
+ self.assertEqual(base64utils.base64_assure_padding('ABCD'), 'ABCD')
+ self.assertEqual(base64utils.base64_assure_padding('ABC'), 'ABC=')
+ self.assertEqual(base64utils.base64_assure_padding('ABC='), 'ABC=')
+ self.assertEqual(base64utils.base64_assure_padding('AB'), 'AB==')
+ self.assertEqual(base64utils.base64_assure_padding('AB=='), 'AB==')
+
+ def test_base64_percent_encoding(self):
+ self.assertEqual(base64utils.base64url_percent_encode('ABCD'), 'ABCD')
+ self.assertEqual(base64utils.base64url_percent_encode('ABC='),
+ 'ABC%3D')
+ self.assertEqual(base64utils.base64url_percent_encode('AB=='),
+ 'AB%3D%3D')
+
+ self.assertEqual(base64utils.base64url_percent_decode('ABCD'), 'ABCD')
+ self.assertEqual(base64utils.base64url_percent_decode('ABC%3D'),
+ 'ABC=')
+ self.assertEqual(base64utils.base64url_percent_decode('AB%3D%3D'),
+ 'AB==')
+
+
+class TestTextWrap(unittest.TestCase):
+
+ def test_wrapping(self):
+ raw_text = 'abcdefgh'
+ wrapped_text = 'abc\ndef\ngh\n'
+
+ self.assertEqual(base64utils.base64_wrap(raw_text, width=3),
+ wrapped_text)
+
+ t = '\n'.join(base64utils.base64_wrap_iter(raw_text, width=3)) + '\n'
+ self.assertEqual(t, wrapped_text)
+
+ raw_text = 'abcdefgh'
+ wrapped_text = 'abcd\nefgh\n'
+
+ self.assertEqual(base64utils.base64_wrap(raw_text, width=4),
+ wrapped_text)