本頁說明如何為乙太網路功能啟用 MACsec。
使用 MACsec 驗證及加密車內娛樂系統 (IVI) 用於不同 ECU 單元的乙太網路通訊,防止資料遭到竄改、重播或資訊外洩。請進行這項購買交易,為乙太網路網路啟用 MACsec IEEE 802.11AE。
總覽
如要啟用 MACsec,wpa_supplicant
會用做 MACsec 金鑰協議 (MKA) 握手的 Daemon。我們定義了 MACsec HAL,藉此以安全的方式儲存 MACsec 預先共用金鑰,也就是所謂的連線關聯金鑰 (CAK)。MACsec HAL 僅支援 CAK。這個供應商專屬的 MACsec HAL 會將 CAK 安全地儲存在防竄改儲存空間中。金鑰的佈建方式取決於供應商的實作方式。
MACsec 流程
圖 1 說明車用運算主機上的 MACsec 流程。
啟用 MACsec
如要透過 MACsec CAK 金鑰支援功能,必須使用供應商專屬的 MACsec HAL 明確啟用以太網路的 MACsec。
如要啟用這項功能,請啟用 wpa_supplicant_macsec
和供應商專屬的 macsec-service
至 PRODUCT_PACKAGES
,以及 wpa_supplicant_macsec
的設定檔、init rc
指令碼至 PRODUCT_COPY_FILES
。
例如,這個 [device-product].mk
檔案:
# MACSEC HAL # This is a mock MACsec HAL implementation with keys embedded in it. Replace with vendor specific HAL PRODUCT_PACKAGES += android.hardware.automotive.macsec-service # wpa_supplicant build with MACsec support PRODUCT_PACKAGES += wpa_supplicant_macsec # configuration file for wpa_supplicant with MACsec PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/wpa_supplicant_macsec.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wpa_supplicant_macsec.conf \ $(LOCAL_PATH)/wpa_supplicant_macsec.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/wpa_supplicant_macsec.rc
例如:wpa_supplicant_macsec.conf
。
# wpa_supplicant_macsec.conf eapol_version=3 ap_scan=0 fast_reauth=1 # Example configuration for MACsec with preshared key # mka_cak is not actual key but index for MACsec HAL to specify which key to use # and make_cak must be either 16 digits or 32 digits depends the actually CAK key length. network={ key_mgmt=NONE eapol_flags=0 macsec_policy=1 macsec_replay_protect=1 macsec_replay_window=0 mka_cak=00000000000000000000000000000001 mka_ckn=31323334 mka_priority=128 }
試閱內容:eth0
,〈wpa_supplicant_macsec.conf
〉。如果需要使用 MACsec 保護多個網路介面,您可以啟動多項服務。
# wpa_supplicant_macsec.rc service wpa_supplicant_macsec /vendor/bin/hw/wpa_supplicant_macsec \ -dd -i eth0 -Dmacsec_linux -c /vendor/etc/wpa_supplicant_macsec.conf oneshot
在乙太網路介面就緒後啟動 wpa_supplicant_macsec
。如果系統乙太網路尚未就緒,wpa_supplicant
會立即傳回錯誤。為避免競爭狀況,您可能需要等待 /sys//class/net/${eth_interface}
(預設逾時時間為 5 秒)。
# init.target.rc on late-fs … wait /sys/class/net/eth0 start wpa_supplicant_macsec …
設定 MACsec 介面的 IP 位址
zygote 啟動後,系統連線管理員可以設定 MACsec 介面 IP 位址。以下是用於連線的重疊 XML 檔案範例。如果 MACsec 介面的 IP 位址需要在 zygote 啟動前就準備就緒,則供應商專屬的守護程序需要監聽 macsec0 介面並進行設定,因為系統連線管理員只會在 zygote 啟動後啟動。
# Example of com.google.android.connectivity.resources overlay config <?xml version="1.0" encoding="utf-8"?> <!-- Resources to configure the connectivity module based on each OEM's preference. --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- Whether the internal vehicle network should remain active even when no apps requested it. --> <bool name="config_vehicleInternalNetworkAlwaysRequested">true</bool> <string-array translatable="false" name="config_ethernet_interfaces"> <!-- Not metered, trusted, not vpn, vehicle, not vcn managed, restricted --> <item>macsec0;11,14,15,27,28;ip=10.10.10.2/24 gateway=10.10.10.1 dns=4.4.4.4,8.8.8.8</item> </string-array> <string translatable="false" name="config_ethernet_iface_regex">macsec\\d</string> </resources>
MACsec HAL
MACsec 供應商專屬 HAL 必須實作下列函式,以保護 CAK 金鑰。使用該金鑰的所有加密和解密作業都會直接完成,不會向 wpa_supplicant
公開金鑰。
/** * MACSEC pre-shared key plugin for wpa_applicant * * The goal of this service is to provide function for using the MACSEC CAK * */ @VintfStability interface IMacsecPSKPlugin { /** * For xTS test only, not called in production * * @param keyId is key id to add * @param CAK, CAK key to set * @param CKN, CKN to set * * @return ICV. */ void addTestKey(in byte[] keyId, in byte[] CAK, in byte[] CKN);
/** * Use ICV key do AES CMAC same as ieee802_1x_icv_aes_cmac in wpa_supplicant * * @param keyId is key id to be used for AES CMAC * @param data * * @return ICV. */ byte[] calcICV(in byte[] keyId, in byte[] data);
/** * KDF with CAK key to generate SAK key same as ieee802_1x_sak_aes_cmac in wpa_supplicant * * @param keyId is key id to be used for KDF * @param seed is key seed (random number) * @param sakLength generated SAK length (16 or 32) * * @return SAK key. */ byte[] generateSAK(in byte[] keyId, in byte[] data, in int sakLength);
/** * Encrypt using KEK key, this is same as aes_wrap with kek.key in wpa_supplicant * which used to wrap a SAK key * * @param keyId is key id to be used for encryption * @param sak is SAK key (16 or 32 bytes) to be wrapped. * * @return wrapped data using KEK key. */ byte[] wrapSAK(in byte[] keyId, in byte[] sak);
/** * Decrypt using KEK key, this is same as aes_unwrap with kek.key in wpa_supplicant * which used to unwrap a SAK key * * @param keyId is key id to be used for decryption * @param sak is wrapped SAK key. * * @return unwrapped data using KEK key. */ byte[] unwrapSAK(in byte[] keyId, in byte[] sak); }
參考實作
hardware/interfaces/macsec/aidl/default
中提供參考實作項目,可提供內嵌鍵的 HAL 軟體實作項目。由於金鑰並未受到防竄改儲存空間的支援,因此此實作只提供 HAL 的功能參照。
測試 MACsec HAL
hardware/interfaces/automotive/macsec/aidl/vts/functional
提供 MACsec HAL 測試。
如何執行測試:
$ atest VtsHalMacsecPskPluginV1Test
這會呼叫 addTestKey
:將測試金鑰插入 HAL,並驗證 calcIcv
、generateSak
、wrapSak
和 unwrapSak
的預期值。
如要確認 MACsec 是否正常運作,請在 MACsec 介面的兩部機器之間進行連線偵測 (ping):
# ping -I macsec0 10.10.10.1
如要使用主機測試 Cuttlefish,主機中的 echo 8 > /sys/devices/virtual/net/cvd-ebr/bridge/group_fwd_mask
必須允許傳送 MACsec 所需的 LLDP 影格。