Package tlslite :: Package utils :: Module pem |
[hide private]
[frames] | no frames]

# Source Code for Module tlslite.utils.pem

      1  # Author: Trevor Perrin
      2  # See the LICENSE file for legal information regarding use of this file.
      3
      4  from .compat import *
      5  import binascii
      6
      7  #This code is shared with tackpy (somewhat), so I'd rather make minimal
      8  #changes, and preserve the use of a2b_base64 throughout.
      9
     10 -def dePem(s, name):
     11      """Decode a PEM string into a bytearray of its payload.
     12
     13      The input must contain an appropriate PEM prefix and postfix
     14      based on the input name string, e.g. for name="CERTIFICATE":
     15
     16      -----BEGIN CERTIFICATE-----
     17      MIIBXDCCAUSgAwIBAgIBADANBgkqhkiG9w0BAQUFADAPMQ0wCwYDVQQDEwRUQUNL
     18  ...
     19      KoZIhvcNAQEFBQADAwA5kw==
     20      -----END CERTIFICATE-----
     21
     22      The first such PEM block in the input will be found, and its
     23      payload will be base64 decoded and returned.
     24      """
     25      prefix  = "-----BEGIN %s-----" % name
     26      postfix = "-----END %s-----" % name
     27      start = s.find(prefix)
     28      if start == -1:
     29          raise SyntaxError("Missing PEM prefix")
     30      end = s.find(postfix, start+len(prefix))
     31      if end == -1:
     32          raise SyntaxError("Missing PEM postfix")
     33      s = s[start+len("-----BEGIN %s-----" % name) : end]
     34      retBytes = a2b_base64(s) # May raise SyntaxError
     35      return retBytes
     36
     37 -def dePemList(s, name):
     38      """Decode a sequence of PEM blocks into a list of bytearrays.
     39
     40      The input must contain any number of PEM blocks, each with the appropriate
     41      PEM prefix and postfix based on the input name string, e.g. for
     42      name="TACK BREAK SIG".  Arbitrary text can appear between and before and
     43      after the PEM blocks.  For example:
     44
     45      " Created by TACK.py 0.9.3 Created at 2012-02-01T00:30:10Z -----BEGIN TACK
     46      BREAK SIG-----
     47      ATKhrz5C6JHJW8BF5fLVrnQss6JnWVyEaC0p89LNhKPswvcC9/s6+vWLd9snYTUv
     48      YMEBdw69PUP8JB4AdqA3K6Ap0Fgd9SSTOECeAKOUAym8zcYaXUwpk0+WuPYa7Zmm
     49      SkbOlK4ywqt+amhWbg9txSGUwFO5tWUHT3QrnRlE/e3PeNFXLx5Bckg= -----END TACK
     50      BREAK SIG----- Created by TACK.py 0.9.3 Created at 2012-02-01T00:30:11Z
     51      -----BEGIN TACK BREAK SIG-----
     52      ATKhrz5C6JHJW8BF5fLVrnQss6JnWVyEaC0p89LNhKPswvcC9/s6+vWLd9snYTUv
     53      YMEBdw69PUP8JB4AdqA3K6BVCWfcjN36lx6JwxmZQncS6sww7DecFO/qjSePCxwM
     54      +kdDqX/9/183nmjx6bf0ewhPXkA0nVXsDYZaydN8rJU1GaMlnjcIYxY= -----END TACK
     55      BREAK SIG----- "
     56
     57      All such PEM blocks will be found, decoded, and return in an ordered list
     58      of bytearrays, which may have zero elements if not PEM blocks are found.
     59       """
     60      bList = []
     61      prefix  = "-----BEGIN %s-----" % name
     62      postfix = "-----END %s-----" % name
     63      while 1:
     64          start = s.find(prefix)
     65          if start == -1:
     66              return bList
     67          end = s.find(postfix, start+len(prefix))
     68          if end == -1:
     69              raise SyntaxError("Missing PEM postfix")
     70          s2 = s[start+len(prefix) : end]
     71          retBytes = a2b_base64(s2) # May raise SyntaxError
     72          bList.append(retBytes)
     73          s = s[end+len(postfix) : ]
     74
     75 -def pem(b, name):
     76      """Encode a payload bytearray into a PEM string.
     77
     78      The input will be base64 encoded, then wrapped in a PEM prefix/postfix
     79      based on the name string, e.g. for name="CERTIFICATE":
     80
     81      -----BEGIN CERTIFICATE-----
     82      MIIBXDCCAUSgAwIBAgIBADANBgkqhkiG9w0BAQUFADAPMQ0wCwYDVQQDEwRUQUNL
     83  ...
     84      KoZIhvcNAQEFBQADAwA5kw==
     85      -----END CERTIFICATE-----
     86      """
     87      s1 = b2a_base64(b)[:-1] # remove terminating \n
     88      s2 = ""
     89      while s1:
     90          s2 += s1[:64] + "\n"
     91          s1 = s1[64:]
     92      s = ("-----BEGIN %s-----\n" % name) + s2 + \
     93          ("-----END %s-----\n" % name)
     94      return s
     95
     96 -def pemSniff(inStr, name):
     97      searchStr = "-----BEGIN %s-----" % name
     98      return searchStr in inStr
     99