From e20cb05937569cf0dd58ff494879713527b08476 Mon Sep 17 00:00:00 2001 From: Yesudeep Mangalapilly Date: Thu, 11 Aug 2011 03:09:22 +0530 Subject: Adds faster ``struct.pack``-based int2bytes implementation. --- rsa/transform.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/rsa/transform.py b/rsa/transform.py index 57629ec..a2beaea 100644 --- a/rsa/transform.py +++ b/rsa/transform.py @@ -19,10 +19,12 @@ From bytes to a number, number to bytes, etc. ''' -import binascii +from __future__ import absolute_import +import binascii +from struct import pack from rsa import common -from rsa._compat import byte, is_integer, b +from rsa._compat import is_integer, b def bytes2int(raw_bytes): @@ -85,18 +87,17 @@ def int2bytes(number, block_size=None): 'is %i' % (needed_bytes, block_size)) # Convert the number to bytes. - raw_bytes = [] + raw_bytes = b('') while number > 0: - raw_bytes.insert(0, byte(number & 0xFF)) - number >>= 8 + raw_bytes = pack(">I", number & 0xffffffff) + raw_bytes + number >>= 32 # Pad with zeroes to fill the block - if block_size is not None: - padding = (block_size - needed_bytes) * b('\x00') - else: - padding = b('') - - return padding + b('').join(raw_bytes) + if block_size is not None and block_size > 0: + remainder = len(raw_bytes) % block_size + if remainder: + raw_bytes = ((block_size - remainder) * b('\x00')) + raw_bytes + return raw_bytes if __name__ == '__main__': -- cgit v1.2.1