1# 2# This file is part of pyasn1-modules software. 3# 4# Copyright (c) 2005-2017, Ilya Etingof <etingof@gmail.com> 5# License: http://pyasn1.sf.net/license.html 6# 7import base64 8import sys 9 10stSpam, stHam, stDump = 0, 1, 2 11 12 13# The markers parameters is in form ('start1', 'stop1'), ('start2', 'stop2')... 14# Return is (marker-index, substrate) 15def readPemBlocksFromFile(fileObj, *markers): 16 startMarkers = dict(map(lambda x: (x[1], x[0]), 17 enumerate(map(lambda y: y[0], markers)))) 18 stopMarkers = dict(map(lambda x: (x[1], x[0]), 19 enumerate(map(lambda y: y[1], markers)))) 20 idx = -1 21 substrate = '' 22 certLines = [] 23 state = stSpam 24 while True: 25 certLine = fileObj.readline() 26 if not certLine: 27 break 28 certLine = certLine.strip() 29 if state == stSpam: 30 if certLine in startMarkers: 31 certLines = [] 32 idx = startMarkers[certLine] 33 state = stHam 34 continue 35 if state == stHam: 36 if certLine in stopMarkers and stopMarkers[certLine] == idx: 37 state = stDump 38 else: 39 certLines.append(certLine) 40 if state == stDump: 41 if sys.version_info[0] <= 2: 42 substrate = ''.join([base64.b64decode(x) for x in certLines]) 43 else: 44 substrate = ''.encode().join([base64.b64decode(x.encode()) for x in certLines]) 45 break 46 return idx, substrate 47 48 49# Backward compatibility routine 50def readPemFromFile(fileObj, 51 startMarker='-----BEGIN CERTIFICATE-----', 52 endMarker='-----END CERTIFICATE-----'): 53 idx, substrate = readPemBlocksFromFile(fileObj, (startMarker, endMarker)) 54 return substrate 55 56 57def readBase64fromText(text): 58 if sys.version_info[0] <= 2: 59 return base64.b64decode(text) 60 else: 61 return base64.b64decode(text.encode()) 62 63 64def readBase64FromFile(fileObj): 65 return readBase64fromText(fileObj.read()) 66