.. autofunction:: pyderasn.abs_decode_path
.. autofunction:: pyderasn.colonize_hex
.. autofunction:: pyderasn.encode_cer
+.. autofunction:: pyderasn.file_mmaped
.. autofunction:: pyderasn.hexenc
.. autofunction:: pyderasn.hexdec
.. autofunction:: pyderasn.tag_encode
from datetime import timedelta
from io import BytesIO
from math import ceil
+from mmap import mmap
+from mmap import PROT_READ
from operator import attrgetter
from string import ascii_letters
from string import digits
"encode_cer",
"Enumerated",
"ExceedingData",
+ "file_mmaped",
"GeneralizedTime",
"GeneralString",
"GraphicString",
DECIMAL_SIGNS = ".,"
+def file_mmaped(fd):
+ """Make mmap-ed memoryview for reading from file
+
+ :param fd: file object
+ :returns: memoryview over read-only mmap-ing of the whole file
+ """
+ return memoryview(mmap(fd.fileno(), 0, prot=PROT_READ))
+
def pureint(value):
if not set(value) <= DECIMALS:
raise ValueError("non-pure integer")
help="Allow explicit tag out-of-bound",
)
parser.add_argument(
- "DERFile",
+ "RAWFile",
type=argparse.FileType("rb"),
- help="Path to DER file you want to decode",
+ help="Path to BER/CER/DER file you want to decode",
)
args = parser.parse_args()
- args.DERFile.seek(args.skip)
- der = memoryview(args.DERFile.read())
- args.DERFile.close()
+ if PY2:
+ args.RAWFile.seek(args.skip)
+ raw = memoryview(args.RAWFile.read())
+ args.RAWFile.close()
+ else:
+ raw = file_mmaped(args.RAWFile)[args.skip:]
oid_maps = (
[obj_by_path(_path) for _path in (args.oids or "").split(",")]
if args.oids else ()
}
if args.defines_by_path is not None:
ctx["defines_by_path"] = obj_by_path(args.defines_by_path)
- obj, tail = schema().decode(der, ctx=ctx)
+ obj, tail = schema().decode(raw, ctx=ctx)
from os import environ
print(pprinter(
obj,
from unittest import skipIf
from unittest import TestCase
+from six import PY2
+
from pyderasn import BitString
from pyderasn import encode_cer
+from pyderasn import file_mmaped
from pyderasn import Sequence
from pyderasn import SequenceOf
from pyderasn import tag_ctxc
der_raw = crl2.encode()
print("DER encoded", time() - start)
self.assertSequenceEqual(der_raw, raw)
+
+ @skipIf(PY2, "Py27 mmap does not implement buffer protocol")
+ def test_mmaped(self):
+ fd = open("revoke.crl", "rb")
+ start = time()
+ CertificateList().decod(file_mmaped(fd))
+ print("DER decoded", time() - start)