این صفحه نحوه فعال کردن MACsec را برای ویژگیهای اترنت توضیح میدهد.
از MACsec برای احراز هویت و رمزگذاری ارتباطات اترنت مورد استفاده توسط سیستم اطلاعات سرگرمی داخل خودرو (IVI) برای واحدهای ECU مختلف استفاده کنید و از داده ها در برابر دستکاری، پخش مجدد یا افشای اطلاعات محافظت کنید. این کار را با فعال کردن MACsec IEEE 802.11AE برای شبکه اترنت انجام دهید.
نمای کلی
برای فعال کردن MACsec، wpa_supplicant
به عنوان شبح برای مدیریت توافق نامه کلید MACsec (MKA) استفاده می شود. یک MACsec HAL برای ذخیره کردن کلید پیش اشتراکگذاری شده MACsec تعریف شده است که به آن کلید ارتباط اتصال (CAK) میگویند. MACsec HAL فقط از CAK پشتیبانی می کند. این MACsec HAL مخصوص فروشنده، CAK را به طور ایمن در یک ذخیره سازی مقاوم در برابر دستکاری ذخیره می کند. تهیه کلید به پیاده سازی فروشنده بستگی دارد.
جریان MACsec
شکل 1 جریان MACsec روی یونیت سر را نشان می دهد.
MACsec را فعال کنید
برای ارائه پشتیبانی از عملکردها با کلید MACsec CAK، MACsec برای اترنت باید به صراحت با یک MACsec HAL خاص فروشنده فعال شود.
برای فعال کردن این ویژگی، 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 }
نمونه wpa_supplicant_macsec.conf
در eth0
. هنگامی که چندین رابط شبکه باید توسط 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
بلافاصله یک خطا را برمیگرداند. برای اجتناب از شرایط مسابقه، ممکن است به یک انتظار (تایم وقفه پیشفرض پنج (5) ثانیه است) برای /sys//class/net/${eth_interface}
نیاز باشد.
# init.target.rc on late-fs … wait /sys/class/net/eth0 start wpa_supplicant_macsec …
آدرس IP را برای رابط MACsec پیکربندی کنید
پیکربندی آدرس IP رابط MACsec می تواند توسط مدیر اتصال سیستم پس از راه اندازی zygote انجام شود. در اینجا یک نمونه فایل XML همپوشانی برای اتصال است. اگر آدرس IP رابط MACsec باید قبل از شروع 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
HAL مخصوص فروشنده MACsec باید توابع زیر را برای محافظت از کلید 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 را تست کنید
تست HAL MACsec در hardware/interfaces/automotive/macsec/aidl/vts/functional
ارائه شده است.
برای اجرای تست:
$ atest VtsHalMacsecPskPluginV1Test
این addTestKey
را فراخوانی می کند -- برای درج یک کلید تست در HAL و بررسی مقادیر مورد انتظار برای calcIcv
, generateSak
, wrapSak
و unwrapSak
.
برای تایید کارکرد MACsec، برای تست های یکپارچه سازی، بین دو ماشین در رابط MACsec پینگ کنید:
# ping -I macsec0 10.10.10.1
برای آزمایش Cuttlefish با میزبان، echo 8 > /sys/devices/virtual/net/cvd-ebr/bridge/group_fwd_mask
در میزبان مورد نیاز است تا اجازه عبور از فریمهای LLDP مورد نیاز برای MACsec را بدهد.