tlslite.utils.pem

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