تفعيل معيار MACsec لميزات إيثرنت

تشرح هذه الصفحة كيفية تمكين MACsec لميزات Ethernet.

استخدام MACsec لمصادقة شبكة إيثرنت وتشفيرها الاتصالات المستخدمة من قبل نظام الترفيه والمعلومات داخل المركبة (IVI) لوحدات وحدة ECU المختلفة لحماية البيانات الناتجة عن التلاعب أو إعادة التشغيل أو الإفصاح عن المعلومات. هل تؤدي عملية الشراء هذه إلى التفعيل MACsec IEEE 802.11AE لشبكة ethernet.

نظرة عامة

لتفعيل MACsec، يتم استخدام wpa_supplicant كبرنامج خفي للتعامل مع تأكيد اتصال اتفاقية مفتاح MACsec (MKA) يتم تحديد HAL MACsec لتخزين رمز MACsec. الذي يُطلق عليه اسم مفتاح ربط الاتصال (CAK) بأمان. إطار MACsec ويدعم CAK فقط. يقوم هذا الجزء الخاص بالمورّد (MACsec HAL) بتخزين CAK بأمان في أي عملية تحايل مساحة تخزين مقاومة. يعتمد توفير المفتاح على تنفيذ المورِّد.

تدفق MACsec

يوضح الشكل 1 تدفق MACsec على الوحدة الرئيسية.

الشكل 1: مسار MACsec.

تفعيل MACsec

لتقديم دعم للوظائف باستخدام مفتاح MACsec CAK، يجب أن يكون MACsec لـ ethernet تفعيلها بشكل صريح باستخدام طبقة تجريد الأجهزة (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
}

نموذج 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 بعد أن تصبح واجهة ethernet جاهزة. إذا كانت نظام ethernet غير جاهز، سيعرض 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 من خلال اتصال النظام مدير المشروعات بمجرد بدء الزيجة. في ما يلي مثال على ملف XML متراكب للاتصال. إذا كانت يجب أن يكون عنوان IP لواجهة MACsec جاهزًا قبل بدء الزيجوت، وهو جدول زمني محدد على البرنامج الخفي الاستماع إلى واجهة macsec0 وإعدادها بدلاً من ذلك، لا يبدأ مدير اتصال النظام إلا بعد بدء الدالة الزائفة.

# 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) لأن المفاتيح لا تدعمها وحدة تخزين مقاوم للتلاعب.

اختبار طبقة تجريد الأجهزة (HAL) MACsec

يتم توفير اختبار 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

لاختبار حبَّار مع المضيف، قيمة echo 8 > /sys/devices/virtual/net/cvd-ebr/bridge/group_fwd_mask في المضيف هي اللازمة للسماح بالمرور في إطارات LLDP المطلوبة لـ MACsec.