Trang này giải thích cách bật MACsec cho các tính năng Ethernet.
Dùng MACsec để xác thực và mã hoá hoạt động giao tiếp Ethernet mà hệ thống thông tin giải trí trong xe (IVI) sử dụng cho nhiều đơn vị ECU, giúp bảo vệ dữ liệu khỏi hành vi can thiệp, phát lại hoặc tiết lộ thông tin. Thực hiện giao dịch mua này để bật MACsec IEEE 802.11AE cho mạng Ethernet.
Tổng quan
Để bật MACsec, wpa_supplicant
được dùng làm trình nền để xử lý cơ chế bắt tay Thoả thuận khoá MACsec (MKA). HAL MACsec được xác định để lưu trữ khoá được chia sẻ trước MACsec, được gọi là khoá liên kết kết nối (CAK) một cách an toàn. HAL MACsec chỉ hỗ trợ CAK. HAL MACsec dành riêng cho nhà cung cấp này lưu trữ CAK một cách an toàn trong bộ nhớ chống can thiệp. Việc cấp phép khoá sẽ phụ thuộc vào phương thức triển khai của nhà cung cấp.
Luồng MACsec
Hình 1 minh hoạ luồng MACsec trên đầu phát trung tâm.
Bật MACsec
Để hỗ trợ các chức năng bằng khoá CAK MACsec, bạn phải bật MACsec cho Ethernet một cách rõ ràng bằng HAL MACsec dành riêng cho nhà cung cấp.
Để bật tính năng này, hãy bật wpa_supplicant_macsec
và macsec-service
dành riêng cho nhà cung cấp thành PRODUCT_PACKAGES
và tệp cấu hình cho wpa_supplicant_macsec
, tập lệnh init rc
thành PRODUCT_COPY_FILES
.
Ví dụ: tệp [device-product].mk
này:
# 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
Ví dụ: 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 }
Lấy mẫu wpa_supplicant_macsec.conf
trên eth0
. Khi cần bảo vệ nhiều giao diện mạng bằng MACsec, bạn có thể khởi động nhiều dịch vụ.
# 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
Khởi động wpa_supplicant_macsec
sau khi giao diện Ethernet đã sẵn sàng. Nếu Ethernet hệ thống chưa sẵn sàng, wpa_supplicant
sẽ trả về lỗi ngay lập tức.
Để tránh tình trạng tranh đua, bạn có thể cần phải chờ (thời gian chờ mặc định là 5 giây) cho /sys//class/net/${eth_interface}
.
# init.target.rc on late-fs … wait /sys/class/net/eth0 start wpa_supplicant_macsec …
Định cấu hình địa chỉ IP cho giao diện MACsec
Trình quản lý kết nối hệ thống có thể định cấu hình địa chỉ IP của giao diện MACsec sau khi zygote khởi động. Dưới đây là ví dụ về tệp XML lớp phủ cho khả năng kết nối. Nếu địa chỉ IP cho giao diện MACsec cần sẵn sàng trước khi zygote khởi động, thì trình nền dành riêng cho nhà cung cấp sẽ cần nghe giao diện macsec0 và định cấu hình giao diện đó vì trình quản lý kết nối hệ thống chỉ bắt đầu sau khi zygote khởi động.
# 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
HAL dành riêng cho nhà cung cấp MACsec phải triển khai các hàm sau để bảo vệ khoá CAK. Toàn bộ quá trình mã hoá và giải mã bằng khoá đều được thực hiện trực tiếp mà không để lộ khoá cho 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); }
Triển khai tham chiếu
Một cách triển khai tham chiếu được cung cấp trong hardware/interfaces/macsec/aidl/default
, cung cấp cách triển khai phần mềm của HAL với các khoá được nhúng bên trong. Phương thức triển khai này chỉ cung cấp tham chiếu chức năng đến HAL vì các khoá không được lưu trữ trong bộ nhớ chống can thiệp.
Kiểm thử HAL MACsec
Quy trình kiểm tra HAL (Lớp trừu tượng phần cứng) được cung cấp trong hardware/interfaces/automotive/macsec/aidl/vts/functional
.
Cách chạy kiểm thử:
$ atest VtsHalMacsecPskPluginV1Test
Lệnh này sẽ gọi addTestKey
– để chèn khoá kiểm thử vào HAL và để xác minh dựa trên các giá trị dự kiến cho calcIcv
, generateSak
, wrapSak
và unwrapSak
.
Để xác nhận MACsec đang hoạt động, đối với các thử nghiệm tích hợp, hãy ping giữa hai máy trong giao diện MACsec:
# ping -I macsec0 10.10.10.1
Để kiểm thử Cuttlefish với máy chủ lưu trữ, bạn cần có echo 8 > /sys/devices/virtual/net/cvd-ebr/bridge/group_fwd_mask
trong máy chủ lưu trữ để cho phép truyền các khung LLDP cần thiết cho MACsec.