2001-03-27 12:42:59 -05:00
|
|
|
|
PEP: 247
|
|
|
|
|
Title: API for Cryptographic Hash Functions
|
|
|
|
|
Version: $Revision$
|
2001-07-08 23:57:09 -04:00
|
|
|
|
Author: A.M. Kuchling <akuchlin@mems-exchange.org>
|
2001-03-28 15:18:03 -05:00
|
|
|
|
Status: Draft
|
2001-03-27 12:42:59 -05:00
|
|
|
|
Type: Informational
|
|
|
|
|
Created: 23-Mar-2001
|
2001-09-20 11:48:02 -04:00
|
|
|
|
Post-History: 20-Sep-2001
|
2001-03-27 12:42:59 -05:00
|
|
|
|
|
|
|
|
|
Abstract
|
|
|
|
|
|
2001-03-28 15:18:03 -05:00
|
|
|
|
There are several different modules available that implement
|
|
|
|
|
cryptographic hashing algorithms such as MD5 or SHA. This
|
|
|
|
|
document specifies a standard API for such algorithms, to make it
|
|
|
|
|
easier to switch between different implementations.
|
2001-03-27 12:42:59 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Specification
|
|
|
|
|
|
2001-03-28 15:18:03 -05:00
|
|
|
|
All hashing modules should present the same interface. Additional
|
|
|
|
|
methods or variables can be added, but those described in this
|
|
|
|
|
document should always be present.
|
2001-03-27 12:42:59 -05:00
|
|
|
|
|
2001-03-28 15:18:03 -05:00
|
|
|
|
Hash function modules define one function:
|
2001-03-27 12:42:59 -05:00
|
|
|
|
|
2001-09-20 11:48:02 -04:00
|
|
|
|
new([string])
|
|
|
|
|
new([key] , [string])
|
2001-03-27 12:42:59 -05:00
|
|
|
|
|
2001-03-28 15:18:03 -05:00
|
|
|
|
Create a new hashing object and return it. You can now feed
|
|
|
|
|
arbitrary strings into the object using its update() method,
|
|
|
|
|
and can ask for the hash value at any time by calling its
|
|
|
|
|
digest() method.
|
2001-03-27 12:42:59 -05:00
|
|
|
|
|
2001-09-17 11:09:37 -04:00
|
|
|
|
The 'string' parameter, if supplied, will be immediately
|
|
|
|
|
hashed into the object's starting state; an empty string or
|
|
|
|
|
None. For keyed hashes such as HMAC, 'key' is a string
|
|
|
|
|
containing the starting key.
|
|
|
|
|
|
|
|
|
|
Arbitrary additional keyword arguments can be added to this
|
|
|
|
|
function, but if they're not supplied, sensible default values
|
2001-09-20 11:48:02 -04:00
|
|
|
|
should be used. For example, 'rounds' and 'digest_size'
|
|
|
|
|
keywords could be added for a hash function which supports a
|
|
|
|
|
variable number of rounds and several different output sizes,
|
|
|
|
|
and they should default to values believed to be secure.
|
2001-03-27 12:42:59 -05:00
|
|
|
|
|
2001-03-28 15:18:03 -05:00
|
|
|
|
Hash function modules define one variable:
|
2001-03-27 12:42:59 -05:00
|
|
|
|
|
2001-09-20 11:48:02 -04:00
|
|
|
|
digest_size
|
2001-03-27 12:42:59 -05:00
|
|
|
|
|
2001-03-28 15:18:03 -05:00
|
|
|
|
An integer value; the size of the digest produced by the
|
2001-09-17 11:09:37 -04:00
|
|
|
|
hashing objects created by this module, measured in bytes.
|
|
|
|
|
You could also obtain this value by creating a sample object
|
2001-09-20 11:48:02 -04:00
|
|
|
|
and accessing its 'digest_size' attribute, but it can be
|
2001-09-17 11:09:37 -04:00
|
|
|
|
convenient to have this value available from the module.
|
|
|
|
|
Hashes with a variable output size will set this variable to 0.
|
2001-03-27 12:42:59 -05:00
|
|
|
|
|
2001-09-20 11:48:02 -04:00
|
|
|
|
Hashing objects require a single attribute:
|
2001-03-27 12:42:59 -05:00
|
|
|
|
|
2001-09-20 11:48:02 -04:00
|
|
|
|
digest_size
|
2001-03-27 12:42:59 -05:00
|
|
|
|
|
2001-09-20 11:48:02 -04:00
|
|
|
|
This attribute is identical to the module-level digest_size
|
|
|
|
|
variable, measuring the size of the digest produced by the
|
2001-09-17 11:09:37 -04:00
|
|
|
|
hashing object, measured in bytes. If the hash has a variable
|
2001-09-20 11:48:02 -04:00
|
|
|
|
output size, this output size must be chosen when the hashing
|
|
|
|
|
object is created, and this attribute must contain the
|
2001-09-17 11:09:37 -04:00
|
|
|
|
selected size. Therefore 0 is *not* a legal value for this
|
|
|
|
|
attribute.
|
|
|
|
|
|
|
|
|
|
|
2001-09-20 11:48:02 -04:00
|
|
|
|
Hashing objects require the following methods:
|
2001-03-27 12:42:59 -05:00
|
|
|
|
|
2001-03-28 15:18:03 -05:00
|
|
|
|
copy()
|
2001-03-27 12:42:59 -05:00
|
|
|
|
|
2001-03-28 15:18:03 -05:00
|
|
|
|
Return a separate copy of this hashing object. An update to
|
|
|
|
|
this copy won't affect the original object.
|
2001-03-27 12:42:59 -05:00
|
|
|
|
|
2001-03-28 15:18:03 -05:00
|
|
|
|
digest()
|
2001-03-27 12:42:59 -05:00
|
|
|
|
|
2001-09-17 11:09:37 -04:00
|
|
|
|
Return the hash value of this hashing object as a string
|
2001-03-28 15:18:03 -05:00
|
|
|
|
containing 8-bit data. The object is not altered in any way
|
|
|
|
|
by this function; you can continue updating the object after
|
|
|
|
|
calling this function.
|
2001-03-27 12:42:59 -05:00
|
|
|
|
|
2001-09-17 11:09:37 -04:00
|
|
|
|
hexdigest()
|
|
|
|
|
|
|
|
|
|
Return the hash value of this hashing object as a string
|
|
|
|
|
containing hexadecimal digits. Lowercase letters should be used
|
|
|
|
|
for the digits 'a' through 'f'. Like the .digest() method, this
|
|
|
|
|
method mustn't alter the object.
|
|
|
|
|
|
2001-03-28 15:18:03 -05:00
|
|
|
|
update(arg)
|
2001-03-27 12:42:59 -05:00
|
|
|
|
|
2001-09-17 11:09:37 -04:00
|
|
|
|
Update this hashing object with the string 'arg'.
|
2001-03-27 12:42:59 -05:00
|
|
|
|
|
2001-09-20 11:48:02 -04:00
|
|
|
|
Hashing modules can define additional module-level functions or
|
|
|
|
|
object methods and still be compliant with this specification.
|
|
|
|
|
|
2001-03-28 15:18:03 -05:00
|
|
|
|
Here's an example, using a module named 'MD5':
|
2001-03-27 12:42:59 -05:00
|
|
|
|
|
2001-03-28 15:18:03 -05:00
|
|
|
|
>>> from Crypto.Hash import MD5
|
|
|
|
|
>>> m = MD5.new()
|
2001-09-20 11:48:02 -04:00
|
|
|
|
>>> m.digest_size
|
2001-09-17 11:09:37 -04:00
|
|
|
|
16
|
2001-03-28 15:18:03 -05:00
|
|
|
|
>>> m.update('abc')
|
|
|
|
|
>>> m.digest()
|
2001-09-17 11:09:37 -04:00
|
|
|
|
'\x90\x01P\x98<\xd2O\xb0\xd6\x96?}(\xe1\x7fr'
|
|
|
|
|
>>> m.hexdigest()
|
|
|
|
|
'900150983cd24fb0d6963f7d28e17f72'
|
2001-03-28 15:18:03 -05:00
|
|
|
|
>>> MD5.new('abc').digest()
|
2001-09-17 11:09:37 -04:00
|
|
|
|
'\x90\x01P\x98<\xd2O\xb0\xd6\x96?}(\xe1\x7fr'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Changes
|
|
|
|
|
|
2001-09-20 11:48:02 -04:00
|
|
|
|
2001-09-17: Renamed clear() to reset(); added digest_size attribute
|
2001-09-17 11:09:37 -04:00
|
|
|
|
to objects; added .hexdigest() method.
|
2001-09-20 11:48:02 -04:00
|
|
|
|
2001-09-20: Removed reset() method completely.
|
2001-09-17 11:09:37 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Acknowledgements
|
|
|
|
|
|
2001-09-20 11:48:02 -04:00
|
|
|
|
Thanks to Andrew Archibald, Rich Salz, Itamar Shtull-Trauring, and
|
|
|
|
|
the readers of the python-crypto list for their comments on this
|
|
|
|
|
PEP.
|
2001-03-27 12:42:59 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Copyright
|
|
|
|
|
|
|
|
|
|
This document has been placed in the public domain.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Local Variables:
|
|
|
|
|
mode: indented-text
|
|
|
|
|
indent-tabs-mode: nil
|
|
|
|
|
End:
|
|
|
|
|
|