SConscript 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. from building import *
  2. import rtconfig
  3. Import('RTT_ROOT')
  4. import os
  5. from string import Template
  6. # 1. Specific certificate file template
  7. cert_template = """
  8. /*
  9. * Copyright (c) 2006-2018 RT-Thread Development Team. All rights reserved.
  10. * License-Identifier: Apache-2.0
  11. *
  12. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  13. * not use this file except in compliance with the License.
  14. * You may obtain a copy of the License at
  15. *
  16. * http://www.apache.org/licenses/LICENSE-2.0
  17. *
  18. * Unless required by applicable law or agreed to in writing, software
  19. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  20. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  21. * See the License for the specific language governing permissions and
  22. * limitations under the License.
  23. *
  24. */
  25. #include "mbedtls/certs.h"
  26. const char mbedtls_root_certificate[] =
  27. "-----BEGIN CERTIFICATE-----\\r\\n\" \\
  28. "MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/\\r\\n" \\
  29. "MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT\\r\\n" \\
  30. "DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow\\r\\n" \\
  31. "PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD\\r\\n" \\
  32. "Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\\r\\n" \\
  33. "AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O\\r\\n" \\
  34. "rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq\\r\\n" \\
  35. "OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b\\r\\n" \\
  36. "xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw\\r\\n" \\
  37. "7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD\\r\\n" \\
  38. "aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV\\r\\n" \\
  39. "HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG\\r\\n" \\
  40. "SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69\\r\\n" \\
  41. "ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr\\r\\n" \\
  42. "AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz\\r\\n" \\
  43. "R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5\\r\\n" \\
  44. "JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo\\r\\n" \\
  45. "Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ\\r\\n" \\
  46. "-----END CERTIFICATE-----\\r\\n" \\
  47. ${CERT_CONTENT}
  48. ;
  49. const size_t mbedtls_root_certificate_len = sizeof(mbedtls_root_certificate);
  50. """
  51. # 2. Create substitute from template
  52. cert_subs = Template(cert_template)
  53. # 3. Get the current absolute path
  54. cwd = GetCurrentDir()
  55. # 4. PEM certificate file path (*.pem or *.cer)
  56. certs_user_dir = cwd + os.sep + 'certs'
  57. certs_default_dir = cwd + os.sep + (os.sep).join(['certs', 'default'])
  58. ROOT_CA_FILE = []
  59. # 5. File that stores the contents of the certificate file
  60. output_cert_file = cwd + os.sep + (os.sep).join(['ports', 'src', 'tls_certificate.c'])
  61. if GetDepend(['PKG_USING_MBEDTLS_EXAMPLE']):
  62. path = cwd + os.sep + (os.sep).join(['certs', 'default', 'DIGITAL_SIGNATURE_TRUST_ROOT_CA.cer'])
  63. if os.path.exists(path):
  64. ROOT_CA_FILE += [path]
  65. if GetDepend(['PKG_USING_MBEDTLS_USE_ALL_CERTS']):
  66. file_list = os.listdir(certs_default_dir)
  67. if len(file_list):
  68. for i in range(0, len(file_list)):
  69. path = os.path.join(certs_default_dir, file_list[i])
  70. if os.path.isfile(path):
  71. ROOT_CA_FILE += [path]
  72. if GetDepend(['PKG_USING_MBEDTLS_USER_CERTS']):
  73. file_list = os.listdir(certs_user_dir)
  74. if len(file_list):
  75. for i in range(0, len(file_list)):
  76. path = os.path.join(certs_user_dir, file_list[i])
  77. if os.path.isfile(path):
  78. ROOT_CA_FILE += [path]
  79. KCONFIG_ROOT_CA_DICT = {'PKG_USING_MBEDTLS_THAWTE_ROOT_CA': 'THAWTE_ROOT_CA.cer', \
  80. 'PKG_USING_MBEDTLS_VERSIGN_PBULIC_ROOT_CA': 'VERSIGN_PUBLIC_ROOT_CA.cer', \
  81. 'PKG_USING_MBEDTLS_VERSIGN_UNIVERSAL_ROOT_CA': 'VERSIGN_UNIVERSAL_ROOT_CA.cer', \
  82. 'PKG_USING_MBEDTLS_GEOTRUST_ROOT_CA': 'GEOTRUST_ROOT_CA.cer', \
  83. 'PKG_USING_MBEDTLS_DIGICERT_ROOT_CA': 'DIGICERT_ROOT_CA.cer', \
  84. 'PKG_USING_MBEDTLS_GODADDY_ROOT_CA': 'GODADDY_ROOT_CA.cer',
  85. 'PKG_USING_MBEDTLS_COMODOR_ROOT_CA': 'COMODOR_ROOT_CA.cer', \
  86. 'PKG_USING_MBEDTLS_DST_ROOT_CA': 'DIGITAL_SIGNATURE_TRUST_ROOT_CA.cer', \
  87. 'PKG_USING_MBEDTLS_CLOBALSIGN_ROOT_CA': 'CLOBALSIGN_ROOT_CA.cer', \
  88. 'PKG_USING_MBEDTLS_ENTRUST_ROOT_CA': 'ENTRUST_ROOT_CA.cer', \
  89. 'PKG_USING_MBEDTLS_CERTUM_TRUSTED_NETWORK_ROOT_CA': 'CERTUM_TRUSTED_NETWORK_ROOT_CA.cer', \
  90. 'PKG_USING_MBEDTLS_AMAZON_ROOT_CA': 'AMAZON_ROOT_CA.cer'}
  91. for key, value in KCONFIG_ROOT_CA_DICT.items():
  92. if GetDepend([key]):
  93. path = os.path.join(certs_default_dir, value)
  94. if os.path.exists(path) and os.path.isfile(path):
  95. ROOT_CA_FILE += [path]
  96. ROOT_CA_FILE = list(set(ROOT_CA_FILE))
  97. file_content = ""
  98. # 6. Traverse the specified certificate file
  99. if len(ROOT_CA_FILE) > 0:
  100. for i in range(0, len(ROOT_CA_FILE)):
  101. if os.path.isfile(ROOT_CA_FILE[i]):
  102. # READ CER FILE, copy to tls_certificate.c
  103. with open(ROOT_CA_FILE[i], 'r') as ca:
  104. # Pre-read, check first line
  105. if not ca.readline().startswith("-----BEGIN CERTIFICATE"):
  106. print("[mbedtls] Warning: ", ROOT_CA_FILE[i], "is not CA file! Skipped!")
  107. continue
  108. ca.seek(0)
  109. for line in ca.readlines():
  110. file_content += '"' + line.strip() + '\\r\\n" \\\n'
  111. # 7. Populate certificate template content
  112. cert_content = cert_subs.substitute(CERT_CONTENT = file_content)
  113. # 8. Write certificate template content to tls_certificate.c
  114. with open(output_cert_file, 'w') as f:
  115. f.write(cert_content)
  116. src = Glob('mbedtls/library/*.c')
  117. SrcRemove(src, 'mbedtls/library/net_sockets.c')
  118. src += Glob('ports/src/*.c')
  119. if GetDepend(['PKG_USING_MBEDTLS_EXAMPLE']):
  120. src += Glob('samples/*.c')
  121. CPPPATH = [
  122. cwd + '/mbedtls/include',
  123. cwd + '/mbedtls/library',
  124. cwd + '/ports/inc',
  125. ]
  126. if rtconfig.CROSS_TOOL == 'gcc' or rtconfig.CROSS_TOOL == 'keil' or rtconfig.CROSS_TOOL == 'iar':
  127. import shutil
  128. cp_src = cwd + '/ports/inc/tls_config.h'
  129. cp_dst = cwd + '/mbedtls/include/mbedtls/config.h'
  130. shutil.copyfile(cp_src, cp_dst)
  131. CPPDEFINES = []
  132. else:
  133. CPPDEFINES = []
  134. group = DefineGroup('mbedtls', src, depend = ['PKG_USING_MBEDTLS'], CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES)
  135. Return('group')