fapi-profile(5) File Formats Manual fapi-profile(5)

fapi-profile - فایل پیکربندی پروفایل FAPI برای کتابخانه TPM2-TSS

پروفایل رمزنگاری FAPI

پروفایل‌های رمزنگاری، الگوریتم‌ها و پارامترهای رمزنگاری را برای تمامی کلیدها و عملیات یک تعامل خاص با TPM تعیین می‌کنند. مقادیر متأثر از این پروفایل‌ها عبارتند از:

•
الگوریتم هش نام (name hash algorithm)
•
الگوریتم، طرح و پارامترهای امضای نامتقارن (مانند منحنی، اندازه کلید، پدینگ پیش‌فرض، هش و غیره)
•
انتخاب بانک PCR (این‌که کدام بانک‌های PCR باید گسترش یابند، کوت شوند و خوانده شوند)

دو پروفایل نمونه برای RSA و ECC به همراه TSS نصب می‌شوند. به‌طور پیش‌فرض، پروفایل رمزنگاری RSA فعال است. کاربر مختار است بر اساس نیازهای خود، پروفایل‌های رمزنگاری اختصاصی ایجاد کند.

پروفایل‌های خاص در فایل پیکربندی FAPI فعال می‌شوند. در صورتی که در هنگام نصب TSS به‌گونه دیگری مشخص نشده باشد، مسیر پیش‌فرض برای پروفایل‌های نمونه /etc/tpm2-tss/profiles/ و برای فایل پیکربندی FAPI مسیر /etc/tpm2-tss/ است.

پارامترهای پروفایل عبارتند از:

•
type: الگوریتم نامتقارن مورد استفاده برای این پروفایل.
•
nameAlg: الگوریتم هش که برای نشست‌ها و کلیدها استفاده خواهد شد.
•
srk_template: تعریف نوع برای شیء /SRK. پارامتر type از Fapi_CreateKey را ببینید.
•
srk_description: توضیحاتی که برای شیء /EK تنظیم می‌شود. Fapi_GetDescription را ببینید.
•
ek_template: تعریف نوع برای شیء /EK. پارامتر type از Fapi_CreateKey را ببینید.
•
ek_description: توضیحاتی که برای شیء /SRK تنظیم می‌شود. Fapi_GetDescription را ببینید.
•
ecc_signing_scheme: طرح امضای مورد استفاده برای کلیدهای ECC.
•
rsa_signing_scheme: طرح امضای مورد استفاده برای کلیدهای RSA.
•
keyBits: اندازه کلید برای کلیدهای RSA.
•
exponent: توان (exponent) کلیدهای RSA.
•
sym_mode: حالت رمز قالبی برای رمزنگاری متقارن.
•
sym_parameters: الگوریتم و پارامترهای مورد استفاده برای رمزنگاری متقارن.
•
sym_block_size: اندازه بلوک مورد استفاده برای رمزنگاری متقارن.
•
session_symmetric: الگوریتم و پارامترهای مورد استفاده برای رمزنگاری پارامترهای یک نشست (با همان ساختار و پیش‌فرض sym_parameters).
•
pcr_selection: رجیسترها و بانک‌های PCR مورد استفاده توسط FAPI.
•
curveID: شناسه منحنی برای کلیدهای ECC.
•
ek_policy: سیاست کدگذاری‌شده به فرمت JSON برای شیء /EK.
•
srk_policy: سیاست کدگذاری‌شده به فرمت JSON برای شیء /SRK.
•
eh_policy: سیاست کدگذاری‌شده به فرمت JSON برای سلسله‌مراتب تاییدیه /HE.
•
sh_policy: سیاست کدگذاری‌شده به فرمت JSON برای سلسله‌مراتب مالک /HS.
•
lockout_policy: سیاست کدگذاری‌شده به فرمت JSON برای سلسله‌مراتب قفل‌شدگی /LOCKOUT.
•
newMaxTries: تعداد خطاهای احراز هویت پیش از اعمال قفل‌شدگی (lockout). در صورت عدم تنظیم، مقدار پیش‌فرض 5 است.
•
newRecoveryTime: زمان بر حسب ثانیه پیش از آن‌که شمارنده خطاهای احراز هویت به‌طور خودکار کاهش یابد. مقدار صفر نشان می‌دهد که محافظت DA غیرفعال است. در صورت عدم تنظیم، مقدار پیش‌فرض 1000 است.
•
lockoutRecovery: زمان بر حسب ثانیه پس از خطای lockoutAuth پیش از آن‌که استفاده از lockoutAuth مجاز شود. مقدار صفر نشان می‌دهد که نیاز به راه‌اندازی مجدد (reboot) سیستم است. در صورت عدم تنظیم، مقدار پیش‌فرض 1000 است.
•
ignore_ek_template: نادیده گرفتن الگوی EK ذخیره‌شده در حافظه NV ram. در صورت عدم تنظیم، مقدار پیش‌فرض no است.

مثال کدگذاری‌شده به فرمت JSON زیر، پروفایل استاندارد را برای کلیدهای ECC نشان می‌دهد:

{
    "type": "ecc",
    "nameAlg":"sha256",
    "srk_template": "system,restricted,decrypt,0x81000001",
    "srk_description": "Storage root key SRK",
    "ek_template":  "system,restricted,decrypt",
    "ek_description": "Endorsement key EK",
    "ecc_signing_scheme": {
        "scheme":"ecdsa",
        "details":{
            "hashAlg":"sha256"
        },
    },
    "sym_mode":"cfb",
    "sym_parameters": {
        "algorithm":"aes",
        "keyBits":"128",
        "mode":"cfb"
    },
    "sym_block_size": 16,
    "pcr_selection": [
       { "hash": "sha1",
         "pcrSelect": [ ],
       },
       { "hash": "sha256",
         "pcrSelect": [ 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 ]
       }
    ],
    "curveID": "nist_p256",
    "ek_policy": {
        "description": "Endorsement hierarchy used for policy secret.",
        "policy":[
            {
                "type":"policysecret",
                "objectName": "4000000b",
            }
        ]
    }
}

در کنار پارامترهای رمزنگاری، می‌توان توضیحاتی را برای کلید ریشه ذخیره‌سازی (storage root key) و کلید تاییدیه (endorsement key) تعیین کرد. برای سلسله‌مراتب تاییدیه، سیاست ek_policy مطابق با مشخصات TCG Credential profile EK 2.0 تنظیم می‌شود. مقادیر این ثوابت مشابه ثوابت تعریف‌شده در فایل‌های هدر TSS هستند، با این تفاوت که می‌توان از پیشوند TPM2_ آن‌ها صرف‌نظر کرد.

نوع کلید برای کلید ریشه ذخیره‌سازی و کلید تاییدیه توسط فیلدهای JSON شامل srk_template و ek_template تعریف می‌شود. نوع کلید شامل فهرستی از کلیدواژه‌هاست که با کاما و/یا فاصله از یکدیگر جدا شده‌اند. در صورتی که یک کلیدواژه قید نشده باشد، حالت معکوس بیت‌های ویژگی مرجع TPM تنظیم یا پاک خواهد شد. این کلیدواژه‌ها عبارتند از:

•
sign: ویژگی sign (امضا) را برای کلید تنظیم می‌کند.
•
decrypt: ویژگی decrypt (رمزگشایی) را برای کلید تنظیم می‌کند.
•
در صورتی که هیچ‌یک از sign یا decrypt مشخص نشده باشند، هر دو ویژگی باید تنظیم شوند.
•
restricted: ویژگی restricted (محدودشده) را برای کلید تنظیم می‌کند.
•
اگر restricted تنظیم شده باشد، باید دقیقاً یکی از دو ویژگی sign یا decrypt (و نه هر دو) تنظیم شوند.
•
noda: ویژگی noda را برای کلید یا ایندکس NV تنظیم می‌کند.
•
یک عدد هگزادسیمال: شیء کلید را به‌گونه‌ای علامت‌گذاری می‌کند که پایدار (persistent) شود و هندل شیء پایدار را روی این مقدار تنظیم می‌کند.
•
unique_zero=n: مقداردهی اولیه فیلد unique با n صفر برای RSA و برای فیلدهای unique متغیرهای x و y در ECC.
•
unique=hexstring: مقداردهی اولیه فیلد unique کلید RSA با یک رشته هگزادسیمال (مانند 0c0a0f0f0e).
•
unique_x=hexstring: مقداردهی اولیه فیلد unique متغیر x در ECC با یک رشته هگزادسیمال (مانند 0c0a0f0f0e).
•
unique_y=hexstring: مقداردهی اولیه فیلد unique متغیر y در ECC با یک رشته هگزادسیمال (مانند 0c0a0f0f0e).

پروفایل RSA دارای مقادیر خاصی برای طرح امضا و طرح رمزگشایی است:

  "rsa_signing_scheme": {
    "scheme":"rsapss",
    "details":{
        "hashAlg":"sha256"
    }
},
"rsa_decrypt_scheme": {
    "scheme":"oaep",
    "details":{
        "hashAlg":"sha256"
    }
},

مقادیر مجاز برای طرح‌های امضا عبارتند از:

•
RSA: RSASSA, RSAPSS
•
ECC: ECDSA, ECDAA

حالت‌های مجاز برای رمزنگاری متقارن عبارتند از:

•
CTR, OFB, CBC, CFB, ECB, NULL

حالت‌های مجاز برای طرح رمزگشایی RSA عبارتند از:

•
RSAES, OAEP

شناسه‌های منحنی (curve ids) زیر می‌توانند مورد استفاده قرار گیرند:

•
ECC_NIST_P192, ECC_NIST_P224, ECC_NIST_P256, ECC_NIST_P384, ECC_NIST_P521, ECC_BN_P256, ECC_BN_P638, ECC_SM2_P256

اگر رجیسترهای PCR از 0 تا 10 توسط BIOS و IMA در بانک SHA1 گسترش داده شده باشند، برای فعال‌سازی امکان استفاده از quote و verify quote در FAPI باید از انتخاب PCR زیر استفاده شود:

"pcr_selection": [
   { "hash": "sha1",
     "pcrSelect": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ],
   },
   { "hash": "sha256",
     "pcrSelect": [ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 ]
   }
],

دایرکتوری حاوی پروفایل‌های FAPI شامل الگوهایی برای کلیدهای مختلف ECC و RSA است. برای کلیدهای ECC P-256 و RSA 2048 بیتی، سه الگوی پروفایل متمایز وجود دارد:

پروفایل .low-range مطابق با الگوهای کم‌دامنه EK تعریف‌شده در TCG EK Credential Profile و TCG TPM 2.0 Provisioning Guidance است.

پروفایل .high-range مطابق با الگوهای پردامنه EK است.

پروفایل .legacy که در حال حاضر حالت پیش‌فرض است، بازتاب‌دهنده الگوی FAPI مورد استفاده تا نسخه 4.1.3 کتابخانه TSS است.

تفاوت‌های کلیدی در ادامه مشخص شده‌اند:

•
low-range: noDa: 1، فیلد unique روی صفر تنظیم شده است (طول اندازه کلید).
•
high-range: noDa: 1، اندازه کلید unique روی صفر تنظیم شده است.
•
legacy: noDa: 0، اندازه کلید unique روی صفر تنظیم شده است.

در برخی موارد، ممکن است یک SRK از پیش روی پلتفرم وجود داشته باشد و توسط FAPI قابل استفاده مجدد باشد. این موارد شامل پیکربندی‌های بوت دوگانه (dual-boot) و مقداردهی اولیه SRK توسط systemd است. اسکریپت زیر مشخص می‌کند کدام پروفایل‌های FAPI برای یک کلید SRK موجود مناسب هستند:

#!/bin/bash
# بررسی می‌شود که آیا پروفایل FAPI در /etc/... وجود دارد
# که با SRK پایدار فعلی با هندل 0x81000001 مطابقت داشته باشد
if ! command -v tss2_provision &> /dev/null; then
    echo "Error tss2_provisioning not installed."
    exit 1
fi
SRK_HANDLE=0x81000001
if tpm2_getcap handles-persistent| grep $SRK_HANDLE > /dev/null; then
    echo "Check SRK default handle $SRK_HANDLE"
else
    echo "Persistent SRK handle $SRK_HANDLE does not exist"
    exit 1
fi
PROFILES=( \
P_ECCP256SHA256-low-range \
P_RSA2048SHA256-low-range \
P_ECCP256SHA256-high-range \
P_RSA2048SHA256-high-range \
P_ECCP256SHA256-legacy \
P_RSA2048SHA256-legacy \
P_ECCP384SHA384 \
P_RSA3072SHA384 \
P_ECCP256SHA256 \
P_RSA2048SHA256 \
)
TMPDIR=$(mktemp -d)
USER_DIR="${TMPDIR}/tpm2-tss/user/keystore"
SYSTEM_DIR="${TMPDIR}/tpm2-tss/system/keystore"
LOG_DIR="${TMPDIR}/tpm2-tss/eventlog/"
for d in /usr/local/etc/tpm2-tss/fapi-profiles/ /etc/tpm2-tss/fapi-profiles/; do
    if [[ -d $d ]]; then
        PROFILE_DIR=$d
        break;
    fi
done
if [ -z "$PROFILE_DIR" ]; then
    echo "Profile dir not found"
    exit 1
fi
for PROFILE in "${PROFILES[@]}"; do
    config_file=${TMPDIR}/fapi_config.json
    cat <<EOF > "$config_file"
{
    "profile_name": "${PROFILE}",
    "profile_dir": "${PROFILE_DIR}",
    "user_dir": "${USER_DIR}",
    "system_dir": "${SYSTEM_DIR}",
    "tcti": "",
    "system_pcrs": [],
    "log_dir": "${LOG_DIR}",
    "firmware_log_file": "/sys/kernel/security/tpm0/binary_bios_measurements",
    "ima_log_file": "/sys/kernel/security/ima/binary_runtime_measurements"
}
EOF
    export TSS2_FAPICONF="$config_file"
    if tss2_provision > /dev/null 2>&1 ;then
        echo "+ ${PROFILE} provisioned"
    else
        echo "- ${PROFILE} failed"
    fi
    rm "$config_file"
    rm -r -f $TMPDIR/tmp2-tss
done
rm -r -f $TMPDIR

fapi-config(5)

این صفحه بخشی از نگارش 4.2.0 پیاده‌سازی متن‌باز TCG TPM2 Software Stack (TSS2) است. توضیحات مربوط به پروژه، اطلاعات گزارش باگ‌ها و آخرین نگارش این صفحه را می‌توان در نشانی زیر یافت:

https://github.com/tpm2-software/tpm2-tss

این اثر تحت مجوز بین‌المللی Creative Commons Attribution 4.0 (CC BY 4.0) منتشر شده است. برای کسب اطلاعات بیشتر به نشانی زیر مراجعه فرمایید:

https://creativecommons.org/licenses/by/4.0

ژوئیه 2020 TPM2 Software Stack