將mbed TLS移植到新的環境或操作系統

mbed TLS可以在不同的架構和運行環境中移植,並可以在各種不同的操作系統或裸機端口上執行。體系結構的可移植性通過以通用的可移植方式使用C語言來實現,而通過最小化其平臺依賴性來實現環境或體系結構獨立性,減少依賴於特定環境或OS的代碼量並乾淨地隔離平臺特定的代碼從高度便攜的核心,使平臺代碼可以很容易地更換。本文是關於後一部分:它解釋了將mbed TLS移植到新環境應該如何做,以及如何做到這一點。

請注意,這篇文章是關於mbed TLS庫,而不是作爲mbed OS一部分的yotta模塊 ; 它將mbed TLS移植到新的運行時環境,而不是新的硬件平臺。它也只是關於圖書館本身,而不是mbed TLS示例程序和測試套件,它們具有不同的系統要求。

概觀

mbed TLS具有模塊化設計,許多模塊完全獨立於任何運行時或環境依賴關係,但標準C庫的系統無關部分除外。圖書館唯一可能與環境互動的部分是:

網絡模塊net_sockets.c可以被禁用,並被替換爲一個單獨的網絡堆棧。這可能意味着任何使用mbed TLS的傳輸層堆棧。
定時模塊timing.c可以禁用和替換,以適應底層操作系統或硬件驅動程序。
熵模塊中熵的默認來源,以及其他來源可以被註冊。
訪問可以被禁用的文件系統的功能,在使用時是可選的。
想要知道實時時鐘的當前時間的函數可以被禁用,儘管這確實限制了證書可能的驗證。
通常用於調試和診斷的打印消息的功能可以禁用或替換,以將消息輸出到其他平臺特定的調試輸出。

總之,爲了編譯mbed TLS上已經有一個標準C庫裸機環境中,所有你所要做的就是配置編譯通過禁用MBEDTLS_NET_C,MBEDTLS_TIMING_C並且MBEDTLS_ENTROPY_PLATFORM,和潛在的MBEDTLS_FS_IO,MBEDTLS_HAVE_TIME_DATE和MBEDTLS_HAVE_TIME也。這在config.h中有更詳細的記錄。

以下部分詳細介紹如何更換缺少的部分。

聯網

提供的網絡模塊net_sockets.c工作在實現BSD套接字API的Windows和Unix系統上。它只能由SSL / TLS模塊通過回調函數選擇使用,並可在編譯時禁用,而不會影響庫的其餘部分。

回調可以被替換爲編寫自己的函數(阻塞或非阻塞)寫和讀(可選地超時),基於您選擇的網絡或傳輸層堆棧。替代函數必須與函數期望的API匹配mbedtls_ssl_set_bio()。

定時

提供的計時模塊timing.c適用於Windows,Linux和BSD(包括OS X)。它只能由SSL / TLS模塊通過DTLS的回調函數使用,並可在編譯時禁用,而不會影響庫的其餘部分。

如果您不使用DTLS,則不需要定時功能。如果您使用DTLS,則需要編寫適合傳遞給函數的自定義回調函數mbedtls_ssl_set_timer_cb()。在我們的DTLS教程中將更詳細地討論這個問題,以全面描述如何使用回調。

默認熵源

作爲RNG模塊的一部分,熵池從各種來源收集和安全地混合熵。在Windows和提供/ dev / urandom的不同Unix平臺上,註冊了一個默認的基於操作系統的源代碼。它可以在編譯時被禁用,而不影響庫的其餘部分。

這個源代碼可以通過對一個或多個實現函數期望的API的熵集函數進行編碼,mbedtls_entropy_add_source()並在運行時對該函數進行註冊,或者在編譯時根據硬件資源進行註冊MBEDTLS_ENTROPY_HARDWARE_ALT。

請注意,出於明顯的安全原因,熵模塊將拒絕輸出任何內容,直到聲明強大的來源已被註冊。

警告:評估提供的來源的強度是做平臺端口的人的責任。

硬件加速

實現密碼原語的大多數模塊都可以用原語的替代實現替代,以便平臺可以利用可能存在的硬件加速。這可以通過MBEDTLS_*_ALT爲每個需要被替換的模塊定義適當的預處理器符號來實現。例如,MBEDTLS_AES_ALT可以定義爲用硬件加速的AES驅動器替換整個AES API,並且MBEDTLS_AES_ENCRYPT_ALT可以被定義爲僅替換AES塊加密功能。

文件系統訪問

幾個模塊包括訪問文件系統的功能。所有這些都可以在編譯時被禁用,而不會影響庫的其餘部分。

每一個訪問文件系統的函數都只是一個方便的包裝函數,它和內存緩衝區執行相同的工作,所以在這裏沒有什麼東西需要替換 - 只需要使用緩衝區中的函數。

實時時鐘

有幾個模塊可以選擇訪問當前時間,既可以測量時間間隔,也可以知道當前的絕對時間和日期。這些功能可以在編譯時被禁用,而不會影響庫的其餘部分。

每個測量時間間隔的函數都有一個替代版本的代碼,以便在時間不可用時提供類似的功能(例如,根據使用次數而不是經過時間旋轉鍵)。絕對時間和日期僅在X.509中用於檢查證書的有效期 - 如果不可用,則跳過此檢查。

警告:根據您如何使用X.509證書來保護您的平臺,這可能是一個嚴重的安全風險!

診斷輸出

在庫中,打印消息(使用printf())的唯一功能是自檢功能。這些可以在編譯時禁用(MBEDTLS_SELF_TEST)而不影響庫的其餘部分。

或者,printf()可以很容易地用自己的打印功能替換,這要歸功於平臺層,可以MBEDTLS_PLATFORM_PRINTF_ALT在編譯時啓用,然後mbedtls_platform_set_printf()在運行時使用,或者MBEDTLS_PLATFORM_PRINTF_MACRO在編譯時使用。

結論

由於其模塊化設計,mbed TLS易於在各種不同的平臺和環境中使用。如果在您的環境中無法正常工作,則可以輕鬆地提供您自己的與環境交互的少數幾個部分的實現,並讓其餘的mbed TLS使用它們。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章