summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYesudeep Mangalapilly <yesudeep@gmail.com>2011-08-11 03:09:22 +0530
committerYesudeep Mangalapilly <yesudeep@gmail.com>2011-08-11 03:09:22 +0530
commite20cb05937569cf0dd58ff494879713527b08476 (patch)
tree35e6b8b69d7d04460946ef495dde053cb963e9b1
parent96e72eb4ec4481c66cbb4cf8f82c1aae537b4bc9 (diff)
downloadrsa-e20cb05937569cf0dd58ff494879713527b08476.tar.gz
Adds faster ``struct.pack``-based int2bytes implementation.
-rw-r--r--rsa/transform.py23
1 files 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__':