אפשר MACsec עבור תכונות Ethernet

דף זה מסביר כיצד להפעיל את MACsec עבור תכונות Ethernet.

השתמש ב-MACSec כדי לאמת ולהצפין את תקשורת ה-Ethernet המשמשת את המידע והבידור לרכב (IVI) עבור יחידות ECU שונות, תוך הגנה על הנתונים מפני שיבוש, הפעלה חוזרת או חשיפת מידע. עשה זאת בקנייה כדי לאפשר את MACsec IEEE 802.11AE עבור רשת ה-ethernet.

סקירה כללית

כדי להפעיל את MACsec, wpa_supplicant משמש בתור הדמון לטיפול בלחיצת היד של MACsec Key Agreement (MKA). MACsec HAL מוגדר לאחסון המפתח המשותף מראש של MACsec, הנקרא מפתח שיוך קישוריות (CAK) בצורה מאובטחת. ה-MACSec HAL תומך רק ב-CAK. MACsec HAL זה הספציפי לספק מאחסן את ה-CAK בצורה מאובטחת באחסון עמיד בפני חבלה. אספקת המפתח תלויה ביישום הספק.

זרימת MACsec

איור 1 ממחיש את זרימת MACsec ביחידת הראש.

איור 1 : זרימת MACsec.

הפעל את MACsec

כדי לספק תמיכה עבור פונקציונליות עם מפתח MACsec CAK, MACsec עבור ethernet חייב להיות מופעל במפורש עם 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 לאחר שממשק ה-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 צריכה להיות מוכנה לפני הפעלת 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

מבחן MACsec HAL מסופק 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.