| # | |
| # This file is part of pyasn1-modules software. | |
| # | |
| # Copyright (c) 2005-2017, Ilya Etingof <[email protected]> | |
| # License: http://pyasn1.sf.net/license.html | |
| # | |
| import base64 | |
| import sys | |
| stSpam, stHam, stDump = 0, 1, 2 | |
| # The markers parameters is in form ('start1', 'stop1'), ('start2', 'stop2')... | |
| # Return is (marker-index, substrate) | |
| def readPemBlocksFromFile(fileObj, *markers): | |
| startMarkers = dict(map(lambda x: (x[1], x[0]), | |
| enumerate(map(lambda y: y[0], markers)))) | |
| stopMarkers = dict(map(lambda x: (x[1], x[0]), | |
| enumerate(map(lambda y: y[1], markers)))) | |
| idx = -1 | |
| substrate = '' | |
| certLines = [] | |
| state = stSpam | |
| while True: | |
| certLine = fileObj.readline() | |
| if not certLine: | |
| break | |
| certLine = certLine.strip() | |
| if state == stSpam: | |
| if certLine in startMarkers: | |
| certLines = [] | |
| idx = startMarkers[certLine] | |
| state = stHam | |
| continue | |
| if state == stHam: | |
| if certLine in stopMarkers and stopMarkers[certLine] == idx: | |
| state = stDump | |
| else: | |
| certLines.append(certLine) | |
| if state == stDump: | |
| if sys.version_info[0] <= 2: | |
| substrate = ''.join([base64.b64decode(x) for x in certLines]) | |
| else: | |
| substrate = ''.encode().join([base64.b64decode(x.encode()) for x in certLines]) | |
| break | |
| return idx, substrate | |
| # Backward compatibility routine | |
| def readPemFromFile(fileObj, | |
| startMarker='-----BEGIN CERTIFICATE-----', | |
| endMarker='-----END CERTIFICATE-----'): | |
| idx, substrate = readPemBlocksFromFile(fileObj, (startMarker, endMarker)) | |
| return substrate | |
| def readBase64fromText(text): | |
| if sys.version_info[0] <= 2: | |
| return base64.b64decode(text) | |
| else: | |
| return base64.b64decode(text.encode()) | |
| def readBase64FromFile(fileObj): | |
| return readBase64fromText(fileObj.read()) |