make_server_cert.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import os
  2. import argparse
  3. import base64
  4. import re
  5. import sys
  6. class Cert(object):
  7. def __init__(self, name, buff):
  8. self.name = name
  9. self.len = len(buff)
  10. self.buff = buff
  11. pass
  12. def __str__(self):
  13. out_str = ['\0']*32
  14. for i in range(len(self.name)):
  15. out_str[i] = self.name[i]
  16. out_str = "".join(out_str)
  17. out_str += str(chr(self.len & 0xFF))
  18. out_str += str(chr((self.len & 0xFF00) >> 8))
  19. out_str += self.buff
  20. return out_str
  21. def main():
  22. parser = argparse.ArgumentParser(description='Convert PEM file(s) into C source file.')
  23. parser.add_argument('--section',
  24. default='.servercert.flash',
  25. help='specify the section for the data (default is .servercert.flash)')
  26. parser.add_argument('--name',
  27. default='tls_server_cert_area',
  28. help='specify the variable name for the data (default is tls_server_cert_area)')
  29. parser.add_argument('file', nargs='+',
  30. help='One or more PEM files')
  31. args = parser.parse_args()
  32. cert_list = []
  33. cert_file_list = []
  34. for cert_file in args.file:
  35. with open(cert_file, 'r') as f:
  36. buff = f.read()
  37. m = re.search(r"-----BEGIN ([A-Z ]+)-----([^-]+?)-----END \1-----", buff, flags=re.DOTALL)
  38. if not m:
  39. sys.exit("Input file was not in PEM format")
  40. if "----BEGIN" in buff[m.end(0):]:
  41. sys.exit("Input file contains more than one PEM object")
  42. cert_list.append(Cert(m.group(1), base64.b64decode(''.join(m.group(2).split()))))
  43. print '__attribute__((section("%s"))) unsigned char %s[INTERNAL_FLASH_SECTOR_SIZE] = {' % (args.section, args.name)
  44. for _cert in cert_list:
  45. col = 0
  46. for ch in str(_cert):
  47. print ("0x%02x," % ord(ch)),
  48. if col & 15 == 15:
  49. print
  50. col = col + 1
  51. print '\n0xff};\n'
  52. if __name__ == '__main__':
  53. main()