blob: b346b59e06b8b3d595a1d28f2861ccd1e418a249 [file] [log] [blame]
Alex Gaynoraf82d5e2013-10-29 17:07:24 -07001.. hazmat::
Alex Gaynor5f3db272013-10-29 10:56:35 -07002
3Padding
4=======
5
Paul Kehrer2129d502015-02-13 12:37:34 -06006.. module:: cryptography.hazmat.primitives.padding
Alex Gaynor5f3db272013-10-29 10:56:35 -07007
Alex Gaynor462bd602014-04-25 07:49:08 -07008Padding is a way to take data that may or may not be a multiple of the block
Alex Gaynor5f3db272013-10-29 10:56:35 -07009size for a cipher and extend it out so that it is. This is required for many
10block cipher modes as they require the data to be encrypted to be an exact
11multiple of the block size.
12
13
Alex Gaynorb2d5efd2013-10-29 11:15:30 -070014.. class:: PKCS7(block_size)
Alex Gaynor5f3db272013-10-29 10:56:35 -070015
16 PKCS7 padding is a generalization of PKCS5 padding (also known as standard
17 padding). PKCS7 padding works by appending ``N`` bytes with the value of
18 ``chr(N)``, where ``N`` is the number of bytes required to make the final
19 block of data the same size as the block size. A simple example of padding
20 is:
21
22 .. doctest::
23
Alex Gaynor07082782013-10-29 11:18:23 -070024 >>> from cryptography.hazmat.primitives import padding
Alex Gaynor60ad3e12013-10-29 14:26:11 -070025 >>> padder = padding.PKCS7(128).padder()
David Reiddb616be2014-02-12 10:51:56 -080026 >>> padded_data = padder.update(b"11111111111111112222222222")
Alex Gaynorbae899a2013-11-22 16:54:55 -080027 >>> padded_data
David Reiddb616be2014-02-12 10:51:56 -080028 '1111111111111111'
David Reid50309fb2014-02-12 11:16:27 -080029 >>> padded_data += padder.finalize()
30 >>> padded_data
David Reiddb616be2014-02-12 10:51:56 -080031 '11111111111111112222222222\x06\x06\x06\x06\x06\x06'
Alex Gaynorbae899a2013-11-22 16:54:55 -080032 >>> unpadder = padding.PKCS7(128).unpadder()
David Reiddb616be2014-02-12 10:51:56 -080033 >>> data = unpadder.update(padded_data)
34 >>> data
35 '1111111111111111'
36 >>> data + unpadder.finalize()
37 '11111111111111112222222222'
Alex Gaynor5f3db272013-10-29 10:56:35 -070038
39 :param block_size: The size of the block in bits that the data is being
40 padded to.
Paul Kehrerc6f19562014-04-27 09:54:11 -050041 :raises ValueError: Raised if block size is not a multiple of 8 or is not
42 between 0 and 256.
Alex Gaynor5f3db272013-10-29 10:56:35 -070043
Alex Gaynorb2d5efd2013-10-29 11:15:30 -070044 .. method:: padder()
45
46 :returns: A padding
Paul Kehrer4ab60592015-02-13 09:06:48 -060047 :class:`~cryptography.hazmat.primitives.padding.PaddingContext`
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -030048 instance.
Alex Gaynorb2d5efd2013-10-29 11:15:30 -070049
50 .. method:: unpadder()
51
52 :returns: An unpadding
Paul Kehrer4ab60592015-02-13 09:06:48 -060053 :class:`~cryptography.hazmat.primitives.padding.PaddingContext`
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -030054 instance.
Alex Gaynorb2d5efd2013-10-29 11:15:30 -070055
56
Cédric Krierbf0f4642016-02-26 18:40:20 +010057.. class:: ANSIX923(block_size)
58
Cédric Krier6cfd9192016-03-15 14:35:19 +010059 .. versionadded:: 1.3
60
Cédric Krier93a3d532016-02-26 23:34:15 +010061 `ANSI X.923`_ padding works by appending ``N-1`` bytes with the value of
62 ``0`` and a last byte with the value of ``chr(N)``, where ``N`` is the
63 number of bytes required to make the final block of data the same size as
64 the block size. A simple example of padding is:
Cédric Krierbf0f4642016-02-26 18:40:20 +010065
66 .. doctest::
67
68 >>> padder = padding.ANSIX923(128).padder()
69 >>> padded_data = padder.update(b"11111111111111112222222222")
70 >>> padded_data
71 '1111111111111111'
72 >>> padded_data += padder.finalize()
73 >>> padded_data
74 '11111111111111112222222222\x00\x00\x00\x00\x00\x06'
75 >>> unpadder = padding.ANSIX923(128).unpadder()
76 >>> data = unpadder.update(padded_data)
77 >>> data
78 '1111111111111111'
79 >>> data + unpadder.finalize()
80 '11111111111111112222222222'
81
82 :param block_size: The size of the block in bits that the data is being
83 padded to.
84 :raises ValueError: Raised if block size is not a multiple of 8 or is not
85 between 0 and 256.
86
87 .. method:: padder()
88
89 :returns: A padding
90 :class:`~cryptography.hazmat.primitives.padding.PaddingContext`
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -030091 instance.
Cédric Krierbf0f4642016-02-26 18:40:20 +010092
93 .. method:: unpadder()
94
95 :returns: An unpadding
96 :class:`~cryptography.hazmat.primitives.padding.PaddingContext`
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -030097 instance.
Cédric Krierbf0f4642016-02-26 18:40:20 +010098
99
Alex Gaynorb2d5efd2013-10-29 11:15:30 -0700100.. class:: PaddingContext
101
Alex Gaynorb4818892014-02-06 10:58:50 -0800102 When calling ``padder()`` or ``unpadder()`` the result will conform to the
103 ``PaddingContext`` interface. You can then call ``update(data)`` with data
104 until you have fed everything into the context. Once that is done call
105 ``finalize()`` to finish the operation and obtain the remainder of the
106 data.
Alex Gaynorb2d5efd2013-10-29 11:15:30 -0700107
108 .. method:: update(data)
109
110 :param bytes data: The data you wish to pass into the context.
111 :return bytes: Returns the data that was padded or unpadded.
Paul Kehrerc6f19562014-04-27 09:54:11 -0500112 :raises TypeError: Raised if data is not bytes.
Alex Stapleton425fc042014-04-25 22:32:01 +0100113 :raises cryptography.exceptions.AlreadyFinalized: See :meth:`finalize`.
Ayrx00eff9c2014-05-17 19:47:09 +0800114 :raises TypeError: This exception is raised if ``data`` is not ``bytes``.
Alex Gaynorb2d5efd2013-10-29 11:15:30 -0700115
116 .. method:: finalize()
117
Alex Stapleton425fc042014-04-25 22:32:01 +0100118 Finalize the current context and return the rest of the data.
119
120 After ``finalize`` has been called this object can no longer be used;
121 :meth:`update` and :meth:`finalize` will raise an
122 :class:`~cryptography.exceptions.AlreadyFinalized` exception.
123
Alex Gaynorb2d5efd2013-10-29 11:15:30 -0700124 :return bytes: Returns the remainder of the data.
Paul Kehrerc6f19562014-04-27 09:54:11 -0500125 :raises TypeError: Raised if data is not bytes.
Alex Stapleton425fc042014-04-25 22:32:01 +0100126 :raises ValueError: When trying to remove padding from incorrectly
127 padded data.
Cédric Krier93a3d532016-02-26 23:34:15 +0100128
129.. _`ANSI X.923`: https://en.wikipedia.org/wiki/Padding_%28cryptography%29#ANSI_X.923