diff --git a/.gitignore b/.gitignore index dee8e1f..80af3d4 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ ESPNTPServer.code-workspace *-bak .pio .vscode +/data eagle/ESPNTPServer/ESPNTPServer.b#* eagle/ESPNTPServer/ESPNTPServer.s#* eagle/ESPNTPServer/ESPNTPServer_*.zip diff --git a/mkcerts.py b/mkcerts.py new file mode 100644 index 0000000..815d2c1 --- /dev/null +++ b/mkcerts.py @@ -0,0 +1,82 @@ +Import("env", "projenv") +import csv +import os +from subprocess import Popen, PIPE, call +import urllib2 +try: + # for Python 2.x + from StringIO import StringIO +except ImportError: + # for Python 3.x + from io import StringIO + +# +# Dump build environment (for debug purpose) +# print env.Dump() +# + + +def generate_ssl_data(source, target, env): + print("generate_ssl_data") + + # Mozilla's URL for the CSV file with included PEM certs + mozurl = "https://ccadb-public.secure.force.com/mozilla/IncludedCACertificateReportPEMCSV" + + # Load the manes[] and pems[] array from the URL + names = [] + pems = [] + response = urllib2.urlopen(mozurl) + csvData = response.read() + csvReader = csv.reader(StringIO(csvData)) + pem_info_index = -1 + for row in csvReader: + # find the index of the PEM data (its moved at least once) + if pem_info_index == -1: + for i in range(0,len(row)): + if row[i] == "PEM Info": + pem_info_index = i + break + if pem_info_index < 0: + raise RuntimeError("could not find 'PEM Info' index!") + names.append(row[0]+":"+row[1]+":"+row[2]) + pems.append(row[pem_info_index]) + del names[0] # Remove headers + del pems[0] # Remove headers + + # Try and make ./data, skip if present + try: + os.mkdir("data") + except: + pass + + derFiles = [] + idx = 0 + # Process the text PEM using openssl into DER files + for i in range(0, len(pems)): + certName = "data/ca_%03d.der" % (idx); + thisPem = pems[i].replace("'", "") + print names[i] + " -> " + certName + ssl = Popen(['openssl','x509','-inform','PEM','-outform','DER','-out', certName], shell = False, stdin = PIPE) + pipe = ssl.stdin + pipe.write(thisPem) + pipe.close() + ssl.wait() + if os.path.exists(certName): + derFiles.append(certName) + idx = idx + 1 + + if os.path.exists("data/certs.ar"): + os.unlink("data/certs.ar"); + + arCmd = '$AR mcs data/certs.ar ' + " ".join(derFiles); + print(arCmd) + env.Execute(arCmd) + + for der in derFiles: + os.unlink(der) + + +print("Current build targets", map(str, BUILD_TARGETS)) + +# custom action before building SPIFFS image. For example, compress HTML, etc. +env.AddPreAction("$BUILD_DIR/spiffs.bin", generate_ssl_data) diff --git a/platformio.ini b/platformio.ini index 4f45c9f..361eb07 100644 --- a/platformio.ini +++ b/platformio.ini @@ -38,3 +38,5 @@ platform = https://github.com/platformio/platform-espressif8266.git#feature/stag platform_packages = ; use upstream Git version framework-arduinoespressif8266 @ https://github.com/esp8266/Arduino.git +extra_scripts = post:mkcerts.py ; this creates the cert file for bearssl +