swtpm(8) swtpm(8)

swtpm - شبیه‌ساز نرم‌افزاری TPM برای نگارش‌های ۱.۲ و ۲.۰

swtpm socket [OPTIONS]

swtpm chardev [OPTIONS]

swtpm cuse [OPTIONS]

swtpm یک شبیه‌ساز نرم‌افزاری TPM مبتنی بر libtpms را پیاده‌سازی می‌کند. این ابزار دسترسی به قابلیت‌های TPM را از طریق یک رابط سوکت TCP/IP فراهم می‌کند، یا می‌تواند روی یک دستگاه کاراکتری (chardev) به دستورات گوش فرا دهد، یا یک رابط CUSE (دستگاه کاراکتری در فضای کاربری) برای دریافت دستورات TPM ایجاد کند.

مگر در مواردی که پارامترهای خط فرمان مربوطه استفاده شوند، نسخه سوکت swtpm نیازمند آن است که متغیر محیطی TPM_PORT روی درگاه TCP/IP که فرایند قرار است برای پیام‌های درخواست TPM روی آن گوش فرا دهد، تنظیم شده باشد.

به طور مشابه، متغیر محیطی TPM_PATH می‌تواند تنظیم شود و حاوی نام پوشه‌ای باشد که TPM می‌تواند وضعیت ماندگار خود را در آن ذخیره کند.

فرایند swtpm را می‌توان با ارسال سیگنال SIGTERM به آن، به آرامی و با نظم پایان داد.

نسخه cuse از swtpm برای راه‌اندازی TPM نیازمند امتیازات ریشه (root) است.

در صورت انتخاب رابط socket، گزینه‌های زیر پشتیبانی می‌شوند:

استفاده از درگاه داده‌شده به جای استفاده از متغیر محیطی TPM_PORT.
پایان دادن به کار TPM پس از آنکه کلاینت اتصال کانال داده را بست (تنها در TCP).
انتظار اتصالات TCP روی درگاه داده‌شده؛ اگر درگاهی مشخص نشود باید یک توصیف‌گر فایل با پارامتر fd ارسال گردد و در آن صورت دستورات از این توصیف‌گر فایل خوانده می‌شوند. اگر درگاهی مشخص شود، ni-shani bind (آدرس اتصال) برای گوش فرا دادن به اتصالات TCP نیز می‌تواند مشخص شود؛ آدرس اتصال پیش‌فرض 127.0.0.1 است. اگر یک آدرس IPv6 محلی پیوند (link-local) مشخص شود، نام رابطی که باید به آن متصل شود باید با ifname ارائه گردد.

این پارامتر اتصال پایدار را به طور پیش‌فرض فعال می‌کند، مگر اینکه گزینه disconnect داده شود. این پارامتر باید به جای گزینه‌های -p و --fd استفاده شود.

انتظار اتصالات UnixIO در مسیر داده‌شده. اگر مسیری ارائه نشود، به جای آن باید یک توصیف‌گر فایل ارسال شود. پارامتر mode به کاربر اجازه می‌دهد تا بیت‌های حالت فایل مسیر UnixIO را تنظیم کند. مقدار بیت‌های حالت باید به عنوان یک عدد هشت‌هشتی با شروع از '0' داده شود. مقدار پیش‌فرض 0770 است. uid و gid مالکیت مسیر سوکت UnixIO را تنظیم می‌کنند. این عملیات نیازمند امتیازات ریشه (root) است.

در صورت انتخاب رابط chardev، گزینه‌های زیر پشتیبانی می‌شوند:

استفاده از دستگاه داده‌شده برای گوش فرا دادن به دستورات TPM و ارسال پاسخ‌ها روی آن.
ایجاد یک نمونه دستگاه پروکسی vTPM لینوکس و خواندن دستورات TPM از دستگاه پشتیبان (backend) آن.

در صورت انتخاب رابط cuse، گزینه‌های زیر پشتیبانی می‌شوند:

استفاده TPM از دستگاهی با نام مشخص‌شده. دستگاهی با نام داده‌شده در /dev ایجاد خواهد شد. این یک گزینه اجباری است.
ایجاد دستگاه با شماره اصلی (major number) داده‌شده.
ایجاد دستگاه با شماره فرعی (minor number) داده‌شده.

گزینه‌های زیر توسط هر دو رابط سوکت و دستگاه کاراکتری پشتیبانی می‌شوند:

استفاده از توصیف‌گر فایل سوکت یا توصیف‌گر فایل دستگاه کاراکتری داده‌شده برای دریافت دستورات TPM و ارسال پاسخ‌ها. برای رابط سوکت، این گزینه به طور خودکار -t را مفروض می‌داند.
اجرای فرایند به صورت دیمن (daemonize).
این گزینه یک کانال کنترل به TPM اضافه می‌کند. کانال کنترل می‌تواند از یک سوکت UnixIO با path یا filedescriptor داده‌شده استفاده کند، یا می‌تواند از یک سوکت TCP روی port یا filedescriptor داده‌شده استفاده کند. اگر درگاهی مشخص شود، nishani bind (آدرس اتصال) برای گوش فرا دادن به اتصالات TCP نیز می‌تواند مشخص گردد؛ آدرس اتصال پیش‌فرض 127.0.0.1 است. اگر یک آدرس IPv6 محلی پیوند (link-local) مشخص شود، نام رابطی که باید به آن متصل شود باید با ifname ارائه گردد.

پارامتر mode به کاربر اجازه می‌دهد بیت‌های حالت فایل مسیر UnixIO را تنظیم کند. مقدار بیت‌های حالت باید به عنوان یک عدد هشت‌هشتی با شروع از '0' داده شود. مقدار پیش‌فرض 0770 است. uid و gid مالکیت مسیر سوکت UnixIO را تنظیم می‌کنند. این عملیات نیازمند امتیازات ریشه (root) است.

پارامتر terminate خاتمه خودکار swtpm را هنگام قطع اتصال کانال کنترل فعال می‌سازد. این امر در سناریوهایی که اتصال کانال کنترل به طور دائمی حفظ می‌شود، مانند محیط QEMU، کاربرد دارد، تا در صورت خاتمه غیرعادی کلاینتی که نتوانسته است CMD_SHUTDOWN را از طریق کانال کنترل ارسال کند، swtpm بسته شود.

کانال کنترل، مدیریت خارج از باند (out-of-band) TPM مانند بازنشانی (reset) آن را ممکن می‌سازد.

گزینه‌های زیر توسط تمام رابط‌ها پشتیبانی می‌شوند:

استفاده از مسیر داده‌شده به جای استفاده از متغیر محیطی TPM_PATH.

اگر dir مشخص شده باشد، فایل‌های وضعیت TPM با بیت‌های mode مشخص‌شده برای فایل در dir نوشته خواهند شد. این مقدار باید به صورت یک عدد هشت‌هشتی با شروع از '0' داده شود. مقدار پیش‌فرض 0640 است.

اگر backend-uri مشخص شده باشد، داده‌های وضعیت TPM در شناسه URI ذخیره خواهند شد. در حال حاضر backend-uri=dir://<path_to_dir> و backend-uri=file://<path_to_dir> در دسترس هستند. برای 'dir://'، شناسه URI باید مسیر پوشه‌ای را که فایل‌ها در آن ذخیره می‌شوند مشخص کند. اگر path_to_dir با '/' آغاز شود، مسیر به عنوان یک مسیر مطلق تفسیر می‌شود؛ در غیر این صورت مسیری نسبی نسبت به پوشه جاری خواهد بود. برای 'file://'، شناسه URI باید یک فایل منفرد یا یک دستگاه بلوکی را مشخص کند که وضعیت TPM در آن ذخیره خواهد شد. دستگاه بلوکی باید از قبل وجود داشته باشد و به اندازه کافی بزرگ باشد تا تمام وضعیت را ذخیره کند. (از نگارش v0.7)

اگر lock مشخص شده باشد، پشتیبان ذخیره‌سازی TPM فایل وضعیت TPM را قفل می‌کند تا از دسترسی همزمان نمونه دیگری از swtpm به آن جلوگیری شود. مقدار پیش‌فرض در صورت نبود این پارامتر، به پشتیبان ذخیره‌سازی بستگی دارد. برای پشتیبان دایرکتوری، پیش‌فرض این است که قفل‌گذاری همیشه فعال است و بنابراین نیازی به تعیین این پارامتر نیست. برای پشتیبان فایل، تعیین آن ضروری است زیرا به طور پیش‌فرض قفل‌گذاری خودکار فعال نیست. برای جلوگیری از قفل‌گذاری، می‌توان از lock=false استفاده کرد.

انتخاب قابلیت‌های TPM 2؛ به طور پیش‌فرض TPM 1.2 انتخاب می‌شود.
فعال‌سازی ثبت وقایع (لاگین) در یک فایل بر اساس توصیف‌گر فایل یا مسیر آن. از '-' برای مسیر جهت عدم ثبت وقایع استفاده کنید.

پارامتر level به کاربر امکان می‌دهد سطح گزارش‌گیری را تعیین کند. با شروع از سطح لاگ ۵، ثبت وقایع اشکال‌زدایی libtpms فعال می‌شود.

تمام خطوط ثبت‌شده با prefix شروع خواهند شد. به طور پیش‌فرض هیچ پیشوندی اضافه نمی‌شود.

اگر truncate داده شود، فایل وقایع کوتاه (خالی) خواهد شد.

پارامتر reject-locality-4 موجب می‌شود که برای درخواست‌های قرار دادن TPM در سطح محلی ۴ (locality 4)، پیام‌های خطای TPM بازگردانده شوند.

پارامتر allow-set-locality به swtpm اجازه می‌دهد تا دستورات TPM/TPM2_SetLocality را دریافت کند. این پارامتر زمانی مفید است که دسترسی درایور پروکسی VTPM لینوکس با ارسال توصیف‌گر فایل فعال شده باشد. این گزینه توسط گزینه --vtpm-proxy به طور ضمنی فعال می‌شود و بنابراین در صورت درج آن گزینه، نیازی به تنظیم صریح نیست. در سایر موارد باید دقت شود که چه کسی می‌تواند دستور TPM/TPM2_SetLocality را ارسال کند.

فعال‌سازی رمزگذاری فایل‌های وضعیت TPM. فایل کلید باید حاوی یک کلید AES در اندازه پشتیبانی‌شده باشد؛ کلیدهای ۱۲۸ بیتی (۱۶ بایت) و ۲۵۶ بیتی (۳۲ بایت) پشتیبانی می‌شوند.

کلید می‌تواند در قالب دودویی باشد، که در این صورت اندازه فایل باید ۱۶ یا ۳۲ بایت باشد. اگر کلید در قالب هگزادسیمال (پیش‌فرض) باشد، می‌تواند از ۳۲ یا ۶۴ رقم هگز که با '0x' اختیاری آغاز می‌شود تشکیل شده باشد.

پارامتر mode نشان می‌دهد کدام حالت زنجیره‌سازی بلوک استفاده شود. در حال حاضر aes-cbc (یا aes-128-cbc) و aes-256-cbc پشتیبانی می‌شوند. داده‌های رمزگذاری‌شده با استفاده از روش encrypt-then-mac از نظر صحت و یکپارچگی محافظت می‌شوند.

پارامتر remove پس از خوانده شدن کلید، تلاش خواهد کرد تا فایل کلید داده‌شده را حذف کند.

این گونه از پارامتر کلید به کاربر اجازه می‌دهد یک عبارت عبور (passphrase) را در یک فایل ارائه دهد. فایل خوانده شده و یک کلید با استفاده از هش SHA512 یا PBKDF2 از آن مشتق می‌شود. به طور پیش‌فرض از PBKDF2 استفاده می‌شود.
در دسترس بودن یک کلید مهاجرت تضمین می‌کند که وضعیت TPM در زمان بازیابی حباب‌های وضعیت (blobs) از طریق رابط ioctl، به صورت رمزگذاری‌نشده فاش نشود. کلید مهاجرت برای رمزگذاری وضعیت نوشته‌شده TPM در فایل‌ها به کار نمی‌رود، این همان کاری است که پارامتر --key برای آن استفاده می‌شود.

کلید مهاجرت و کلید مورداستفاده برای رمزگذاری فایل‌های وضعیت TPM می‌توانند یکسان باشند.

در حالی که کلید فایل‌های وضعیت TPM باید در کنار همان فایل‌هایی که رمزگذاری می‌کند باقی بماند، کلید مهاجرت باید همراه با حباب‌های وضعیت TPM بماند. برای نمونه اگر وضعیت TPM بین میزبان‌ها در یک مرکز داده مهاجرت داده شود، کلید مهاجرت TPM باید در تمام مقاصد در دسترس باشد، بنابراین در عمل ممکن است لازم باشد کلیدی مشترک در تمام ماشین‌های مرکز داده باشد. در مقابل، کلید مورداستفاده برای رمزگذاری فایل‌های وضعیت TPM می‌تواند برای هر TPM متفاوت باشد و تنها کافی است روی میزبانی که وضعیت TPM در آن قرار دارد در دسترس باشد.

کلید مهاجرت رمزگذاری حباب‌های وضعیت TPM را فعال می‌کند. فایل کلید باید حاوی یک کلید AES در اندازه پشتیبانی‌شده باشد؛ کلیدهای ۱۲۸ بیتی (۱۶ بایت) و ۲۵۶ بیتی (۳۲ بایت) پشتیبانی می‌شوند.

کلید ممکن است در قالب دودویی باشد، که در این حالت اندازه فایل باید ۱۶ یا ۳۲ بایت باشد. اگر کلید در قالب هگزادسیمال (پیش‌فرض) باشد، کلید می‌تواند شامل ۳۲ یا ۶۴ رقم هگز با شروع از '0x' اختیاری باشد.

پارامتر mode نشان می‌دهد کدام حالت زنجیره‌سازی بلوک باید استفاده شود. در حال حاضر aes-cbc (یا aes-128-cbc) و aes-256-cbc پشتیبانی می‌شوند. داده‌های رمزگذاری‌شده با روش encrypt-then-mac از یکپارچگی محافظت می‌شوند.

پارامتر remove پس از خوانده شدن کلید، تلاش خواهد کرد تا فایل کلید ارائه‌شده را حذف کند.

این گونه از پارامتر کلید به کاربر اجازه می‌دهد یک عبارت عبور را در یک فایل ارائه دهد. فایل خوانده شده و یک کلید با استفاده از هش SHA512 یا PBKDF2 از آن مشتق می‌شود. به طور پیش‌فرض از PBKDF2 استفاده می‌شود.
این گزینه به کاربر امکان می‌دهد نام فایلی را که شناسه فرایند (PID) مربوط به TPM در آن نوشته خواهد شد، تعیین کند. همچنین امکان ارسال یک توصیف‌گر فایل به فایلی که برای نوشتن باز شده است وجود دارد.
تغییر وضعیت به کاربر مشخص‌شده. این گزینه تنها زمانی قابل استفاده است که swtpm با کاربر ریشه (root) آغاز شده باشد.
تغییر ریشه (Chroot) به پوشه داده‌شده در هنگام راه‌اندازی. این گزینه تنها زمانی قابل استفاده است که swtpm با کاربر ریشه (root) اجرا شده باشد.
این گزینه به کاربر امکان می‌دهد اقدام لازم توسط نمایه seccomp را در هنگام اجرای یک فراخوانی سیستم غیرمجاز انتخاب کند. مقدار پیش‌فرض kill است. برای غیرفعال‌سازی نمایه seccomp، گزینه none را انتخاب کنید. اقدام log فراخوانی‌های غیرمجاز را ثبت می‌کند. اقدام log تنها در صورتی موجود است که libseccomp از ثبت وقایع پشتیبانی کند.

این گزینه تنها در لینوکس و در صورتی که swtpm با پشتیبانی از libseccomp کامپایل شده باشد در دسترس است.

پرچم not-need-init به TPM امکان می‌دهد دستورات TPM را بلافاصله پس از شروع بدون نیاز به ارسال یک INIT از طریق کانال فرمان بپذیرد (به گزینه '-i' در swtpm_ioctl مراجعه کنید).

گزینه‌های startup باعث می‌شوند دستور TPM_Startup یا TPM2_Startup به طور خودکار ارسال شود. گزینه startup-deactivated تنها برای یک TPM 1.2 معتبر است. این گزینه‌ها متضمن not-need-init هستند، به جز گزینه startup-none که منجر به عدم ارسال هیچ دستوری می‌شود.

اگر --vtpm-proxy استفاده شود، گزینه startup-clear به طور خودکار انتخاب می‌شود اما این مورد می‌تواند با این گزینه تغییر یابد.

پرچم disable-auto-shutdown مانع از ارسال خودکار TPM2_Shutdown() توسط swtpm پیش از بازنشانی TPM 2 یا پیش از خاتمه فرایند swtpm می‌شود. در صورت عدم ارائه این پرچم، swtpm این دستور را ارسال خواهد کرد تا از افزایش شمارنده قفل حمله واژه‌نامه‌ای (DA) و در نهایت قفل شدن بر اثر حمله واژه‌نامه‌ای توسط TPM 2 به دلیل عدم ارسال TPM2_Shutdown() لازم قبل از بازنشانی یا خاتمه فرایند جلوگیری شود.

چاپ قابلیت‌هایی که پس از نگارش 0.1 به swtpm افزوده شده‌اند. خروجی ممکن است شامل موارد زیر باشد:
{
  "type": "swtpm",
  "features": [
    "tpm-1.2",
    "tpm-2.0",
    "tpm-send-command-header",
    "flags-opt-startup",
    "flags-opt-disable-auto-shutdown",
    "cmdarg-seccomp",
    "cmdarg-key-fd",
    "cmdarg-pwd-fd",
    "cmdarg-print-states",
    "cmdarg-chroot",
    "cmdarg-migration",
    "nvram-backend-dir",
    "nvram-backend-file",
    "rsa-keysize-1024",
    "rsa-keysize-2048",
    "rsa-keysize-3072",
    "cmdarg-profile",
    "cmdarg-print-profiles",
    "profile-opt-remove-disabled",
    "cmdarg-print-info",
    "tpmstate-opt-lock"
  ],
  "version": "0.7.0"
}

فیلد نسخه از نگارش v0.7 در دسترس است.

معنای عبارات ویژگی‌ها به شرح زیر است:

شبیه‌سازی TPM 1.2 پشتیبانی می‌شود (libtpms با پشتیبانی از 1.2 کامپایل شده است).
شبیه‌سازی TPM 2 پشتیبانی می‌شود (libtpms با پشتیبانی از 2.0 کامپایل شده است).

(گزینه --tpm2 پشتیبانی می‌شود)

گزینه --seccomp پشتیبانی می‌شود.
گزینه --key از پارامتر fd= پشتیبانی می‌کند.
گزینه --key از پارامتر pwdfd= پشتیبانی می‌کند.
گزینه --print-states پشتیبانی می‌شود.
گزینه --chroot پشتیبانی می‌شود.
گزینه --migration پشتیبانی می‌شود.
گزینه --tpmstate از پارامتر backend-uri=dir://... پشتیبانی می‌کند.
گزینه --tpmstate از پارامتر backend-uri=file://... پشتیبانی می‌کند.
دستورات TPM 2 ممکن است دارای یک سرآیند پیشوند باشند که حامل یک دستور ۴ بایتی، ۱ بایت برای locality، و ۴ بایت نشانگر طول دستور TPM 2 است. TPM 2 با پیشوند کردن یک نشانگر پاسخ ۴ بایتی و یک تریلر ۴ بایتی پاسخ خواهد داد. تمام داده‌ها در قالب big endian ارسال می‌شوند.
گزینه --flags از گزینه‌های startup-... پشتیبانی می‌کند.
گزینه --flags از پرچم disable-auto-shutdown پشتیبانی می‌کند.
بخش TPM 2 از اندازه‌های کلید RSA نشان‌داده‌شده پشتیبانی می‌کند. اگر هیچ یک از کلیدواژه‌های rsa-keysize نشان داده نشود، تنها کلیدهای RSA با اندازه ۲۰۴۸ بیت پشتیبانی می‌شوند.
گزینه --profile برای تنظیم یک نمایه (پروفایل) برای TPM 2 با هر یک از پارامترهای اختیاری name=، profile=، fd= یا file= پشتیبانی می‌شود.
گزینه --print-profiles پشتیبانی می‌شود.
گزینه --profile از پارامتر گزینه‌ای remove-disabled پشتیبانی می‌کند.
گزینه --print-info پشتیبانی می‌شود.
پارامتر گزینه‌ای lock برای گزینه --tpmstate پشتیبانی می‌شود.
این گزینه امکان چاپ حباب‌های وضعیت TPM 1.2 یا TPM 2 را که در حال حاضر در یک پشتیبان ذخیره‌سازی نگهداری می‌شوند فراهم می‌کند. این گزینه مستلزم آن است که پشتیبان ذخیره‌سازی با گزینه --tpmstate مشخص شده باشد و اگر قرار است حباب‌های وضعیت TPM 2 نمایش داده شوند، گزینه --tpm2 باید ارسال گردد.

در ادامه خروجی JSON این گزینه نشان داده شده است. این خروجی نشان می‌دهد که وضعیت‌های 'permall' و 'volatile' در دسترس هستند.

{
  "type": "swtpm",
  "states": [
    {
      "name": "permall",
      "size": 6013
    }, {
      "name": "volatile",
      "size": 1087
    }
  ]
}
این گزینه امکان کنترل قفل‌گذاری حافظه NVRAM را به منظور پشتیبانی از مهاجرت بین میزبان‌هایی که برای پوشه وضعیت swtpm فضای ذخیره‌سازی مشترک پیکربندی کرده‌اند، در صورتی که قفل‌گذاری توسط پشتیبان ذخیره‌سازی پشتیبانی شود، فراهم می‌کند. برای مثال، پشتیبان ذخیره‌سازی پوشه از قفل‌گذاری پشتیبانی می‌کند و بنابراین در صورت استفاده از ذخیره‌سازی مشترک، نیازمند استفاده از این گزینه است. هنگام ارائه پارامتر گزینه‌ای incoming، ابزار swtpm قفل‌گذاری NVRAM را تا زمان دریافت حباب‌های وضعیت یا تا زمان پردازش اولین دستور TPM (در صورتی که هیچ حباب وضعیتی دریافت نشود) به تعویق می‌اندازد. پارامتر گزینه‌ای release-lock-outgoing باعث می‌شود swtpm به محض دریافت حباب وضعیت 'savestate' مربوط به TPM از swtpm، هرگونه قفل NVRAM را آزاد کند. برای جلوگیری از آزادسازی زودهنگام قفل، حباب‌های وضعیت 'permanent' و 'volatile' باید قبل از حباب وضعیت 'savestate' دریافت شوند.
این گزینه امکان تنظیم یک نمایه (profile) را برای TPM 2 فراهم می‌کند. یک نمایه داخلی را می‌توان با استفاده از پارامتر گزینه‌ای name= بر اساس نام آن انتخاب کرد. با پارامتر گزینه‌ای profile= می‌توان یک نمایه در قالب JSON را به طور مستقیم ارسال کرد. با پارامتر گزینه‌ای file= نمایه در قالب JSON از یک فایل خوانده خواهد شد. پارامتر گزینه‌ای fd= امکان خواندن آن را از یک توصیف‌گر فایل فراهم می‌کند.

نمایه‌ها باید به نام یک نمایه توکار (داخلی) ارجاع دهند. توجه داشته باشید که تنها نمایه 'custom'، یا نمایه‌هایی که نام آنها با 'custom:' آغاز می‌شود، قابل تغییر هستند و فهرستی از الگوریتم‌ها، دستورات یا ویژگی‌ها را ارائه می‌دهند که کنترل می‌کند TPM 2 کدام الگوریتم‌های رمزنگاری را فعال کند. اگر هر یک از این فهرست‌ها ارائه نشود، فهرست متناظر از نمایه داخلی 'custom' استفاده خواهد شد.

گزینه خط فرمان زیر نمایه 'custom' را تحت نام جدید 'custom:test' با تنظیم صفت 'fips-host' انتخاب می‌کند:

[...] --profile '{"Name":"custom:test", "Attributes":"fips-host"}'

نمایه تنها در همان اولین باری که نمونه‌ای از TPM 2 راه‌اندازی می‌شود و تا زمانی که هیچ فایل وضعیتی وجود ندارد، قابل تنظیم است. نمایه پس از آن دیگر قابل تغییر نیست و در صورت ارسال مجدد با استفاده از این گزینه، خطایی رخ خواهد داد.

پارامتر گزینه‌ای remove-disabled به swtpm دستور می‌دهد آن دسته از الگوریتم‌هایی را که هنگام فعال بودن FIPS روی میزبان غیرفعال هستند (پارامتر fips-host؛ مرجع حالت FIPS در RHEL 9.4 به بالا است) و دسترسی OpenSSL به الگوریتم‌های رمزنگاری محدود شده است، از نمایه حذف کند. از پارامتر check می‌توان برای بررسی غیرفعال بودن واقعی یک الگوریتم پیش از حذف آن استفاده کرد. این گزینه تنها در صورتی پشتیبانی می‌شود که نمایه custom انتخاب شده باشد. در این حالت، (در حال حاضر) اقدامات زیر انجام خواهد شد:

  • حذف camellia، tdes، و rsaes (رمزنگاری RSA با لایه‌گذاری PKCS#1 v1.5)
  • غیرفعال‌سازی پشتیبانی از امضا (RSA و EC) بر روی SHA1
  • غیرفعال‌سازی رمزنگاری بدون لایه‌گذاری RSA
  • تنظیم حداقل اندازه برای کلیدهای RSA روی ۲۰۴۸ بیت
  • تنظیم حداقل اندازه برای کلیدهای EC روی ۲۲۴ بیت

تمام الگوریتم‌های دیگر فعال باقی می‌مانند، از جمله مواردی که ممکن است معمولاً در FIPS مجاز نباشند، مانند ecdaa و ecschnorr و غیره. فهرست الگوریتم‌های غیرفعال در آینده و در صورتی که حالت FIPS روی میزبان الگوریتم‌های بیشتری را غیرفعال کند، گسترش خواهد یافت. از آنجا که در این حالت ممکن است swtpm ویژگی‌هایی (Attributes) را به نمایه اضافه کند که نیازمند یک StateFormatLevel مشخص باشند، توصیه می‌شود فیلد StateFormatLevel از نمایه حذف شود.

برای مشاهده فهرست الگوریتم‌هایی که پشتیبانی می‌شوند و می‌توانند غیرفعال شوند، می‌توان از swtpm به صورت زیر استفاده کرد:

$ swtpm socket --tpmstate dir=./ --tpm2 --print-info 0x08 | jq
{
  "RuntimeAlgorithms": {
    "Implemented": "rsa,rsa-min-size=1024,tdes,tdes-min-size=128,sha1,\
                    hmac,aes,aes-min-size=128,mgf1,keyedhash,xor,sha256,\
                    sha384,sha512,null,rsassa,rsaes,rsapss,oaep,ecdsa,\
                    ecdh,ecdaa,sm2,ecschnorr,ecmqv,kdf1-sp800-56a,kdf2,\
                    kdf1-sp800-108,ecc,ecc-min-size=192,ecc-nist,ecc-bn,\
                    ecc-nist-p192,ecc-nist-p224,ecc-nist-p256,\
                    ecc-nist-p384,ecc-nist-p521,ecc-bn-p256,ecc-bn-p638,\
                    ecc-sm2-p256,symcipher,camellia,camellia-min-size=128,\
                    cmac,ctr,ofb,cbc,cfb,ecb",
    "CanBeDisabled": "tdes,sha1,sha512,rsassa,rsaes,rsapss,ecmqv,\
                      ecc-nist-p192,ecc-nist-p224,ecc-nist-p521,\
                      ecc-bn-p256,ecc-bn-p638,ecc-sm2-p256,camellia,cmac,\
                      ctr,ofb,cbc,ecb",
    "Enabled": "rsa,rsa-min-size=1024,tdes,tdes-min-size=128,sha1,hmac,\
                aes,aes-min-size=128,mgf1,keyedhash,xor,sha256,sha384,\
                sha512,null,rsassa,rsaes,rsapss,oaep,ecdsa,ecdh,ecdaa,sm2,\
                ecschnorr,ecmqv,kdf1-sp800-56a,kdf2,kdf1-sp800-108,ecc,\
                ecc-min-size=192,ecc-nist,ecc-bn,symcipher,camellia,\
                camellia-min-size=128,cmac,ctr,ofb,cbc,cfb,ecb",
    "Disabled": ""
  }
}

برای دیدن فهرست دستورات پشتیبانی‌شده:

$ swtpm socket --tpmstate dir=./ --tpm2 --print-info 0x10 | jq
{
  "RuntimeCommands": {
    "Implemented": "0x11f-0x122,0x124-0x12e,0x130-0x140,0x142-0x159,\
                    0x15b-0x15e,0x160-0x165,0x167-0x174,0x176-0x178,\
                    0x17a-0x193,0x197,0x199-0x19c",
    "CanBeDisabled": "0x11f,0x121-0x122,0x124-0x128,0x12a,0x12c-0x12e,\
                      0x130,0x132-0x13b,0x13d-0x140,0x142,0x146-0x147,\
                      0x149-0x14d,0x14f-0x152,0x154-0x155,0x159,0x15b,\
                      0x15d-0x15e,0x160-0x164,0x167-0x168,0x16a-0x172,\
                      0x174,0x177-0x178,0x17b,0x17f-0x181,0x183-0x184,\
                      0x187-0x193,0x197,0x199-0x19c",
    "Enabled": "0x11f-0x122,0x124-0x12e,0x130-0x140,0x142-0x159,\
                0x15b-0x15e,0x160-0x165,0x167-0x174,0x176-0x178,\
                0x17a-0x193,0x197,0x199-0x19c",
    "Disabled": ""
  }
}

برای دیدن فهرست ویژگی‌های پشتیبانی‌شده:

$ swtpm socket --tpmstate dir=./ --tpm2 --print-info 0x80 | jq
{
  "RuntimeAttributes": {
    "Implemented": "no-unpadded-encryption,no-sha1-signing,\
                    no-sha1-verification,no-sha1-hmac-creation,\
                    no-sha1-hmac-verification,no-sha1-hmac,fips-host",
    "CanBeDisabled": "no-unpadded-encryption,no-sha1-signing,\
                      no-sha1-verification,no-sha1-hmac-creation,\
                      no-sha1-hmac-verification,no-sha1-hmac,fips-host",
    "Enabled": "no-unpadded-encryption,no-sha1-signing,\
                no-sha1-verification,no-sha1-hmac",
    "Disabled": "no-sha1-hmac-creation,no-sha1-hmac-verification,fips-host"
  }
}

ویژگی‌های فوق ممکن است به نمایه ذیل مدخل نگاشت "Attributes" اضافه شوند، که مشابه مدخل‌های "Algorithms" و "Commands" است.

برای مشاهده فهرست نمایه‌های موجود:

$ swtpm socket --tpm2 --print-info 0x40 | jq
{
  "AvailableProfiles": [
    {
      "Name": "default-v1",
      "StateFormatLevel": 4,
      "Commands": "0x11f-0x122,0x124-0x12e,0x130-0x140,0x142-0x159,\
                   0x15b-0x15e,0x160-0x165,0x167-0x174,0x176-0x178,\
                   0x17a-0x193,0x197,0x199-0x19a",
      "Algorithms": "rsa,rsa-min-size=1024,tdes,tdes-min-size=128,sha1,\
                     hmac,aes,aes-min-size=128,mgf1,keyedhash,xor,sha256,\
                     sha384,sha512,null,rsassa,rsaes,rsapss,oaep,ecdsa,\
                     ecdh,ecdaa,sm2,ecschnorr,ecmqv,kdf1-sp800-56a,kdf2,\
                     kdf1-sp800-108,ecc,ecc-min-size=192,ecc-nist,ecc-bn,\
                     symcipher,camellia,camellia-min-size=128,cmac,ctr,\
                     ofb,cbc,cfb,ecb",
      "Description": "This profile enables all currently supported \
                      commands and algorithms. It is applied when the \
                      user chooses no profile."
    },
    {
      "Name": "null",
      "StateFormatLevel": 1,
      "Commands": "0x11f-0x122,0x124-0x12e,0x130-0x140,0x142-0x159,\
                   0x15b-0x15e,0x160-0x165,0x167-0x174,0x176-0x178,\
                   0x17a-0x193,0x197",
      "Algorithms": "rsa,rsa-min-size=1024,tdes,tdes-min-size=128,sha1,\
                     hmac,aes,aes-min-size=128,mgf1,keyedhash,xor,sha256,\
                     sha384,sha512,null,rsassa,rsaes,rsapss,oaep,ecdsa,\
                     ecdh,ecdaa,sm2,ecschnorr,ecmqv,kdf1-sp800-56a,kdf2,\
                     kdf1-sp800-108,ecc,ecc-min-size=192,ecc-nist,ecc-bn,\
                     symcipher,camellia,camellia-min-size=128,cmac,ctr,\
                     ofb,cbc,cfb,ecb",
      "Description": "The profile enables the commands and algorithms \
                      that were enabled in libtpms v0.9. This profile is \
                      automatically used when the state does not have a \
                      profile, for example when it was created by \
                      libtpms v0.9 or before."
    },
    {
      "Name": "custom",
      "StateFormatLevel": 2,
      "Commands": "0x11f-0x122,0x124-0x12e,0x130-0x140,0x142-0x159,\
                   0x15b-0x15e,0x160-0x165,0x167-0x174,0x176-0x178,\
                   0x17a-0x193,0x197",
      "Algorithms": "rsa,rsa-min-size=1024,tdes,tdes-min-size=128,sha1,\
                     hmac,aes,aes-min-size=128,mgf1,keyedhash,xor,sha256,\
                     sha384,sha512,null,rsassa,rsaes,rsapss,oaep,ecdsa,\
                     ecdh,ecdaa,sm2,ecschnorr,ecmqv,kdf1-sp800-56a,kdf2,\
                     kdf1-sp800-108,ecc,ecc-min-size=192,ecc-nist,ecc-bn,\
                     ecc-sm2-p256,symcipher,camellia,\
                     camellia-min-size=128,cmac,ctr,ofb,cbc,cfb,ecb",
      "Description": "This profile allows customization of enabled \
                      algorithms and commands. This profile requires at \
                      least libtpms v0.10."
    }
  ]
}

برای دیدن نمایه فعال جاری با استعلام از swtpm که برای پیام‌های کنترل روی درگاه ۲۳۲۲ گوش فرا می‌دهد:

$ swtpm_ioctl --tcp :2322 --info 0x20 | jq
{
  "ActiveProfile": {
    "Name": "default-v1",
    "StateFormatLevel": 4,
    "Commands": "0x11f-0x122,0x124-0x12e,0x130-0x140,0x142-0x159,\
                 0x15b-0x15e,0x160-0x165,0x167-0x174,0x176-0x178,\
                 0x17a-0x193,0x197,0x199-0x19a",
    "Algorithms": "rsa,rsa-min-size=1024,tdes,tdes-min-size=128,sha1,\
                   hmac,aes,aes-min-size=128,mgf1,keyedhash,xor,sha256,\
                   sha384,sha512,null,rsassa,rsaes,rsapss,oaep,ecdsa,\
                   ecdh,ecdaa,sm2,ecschnorr,ecmqv,kdf1-sp800-56a,kdf2,\
                   kdf1-sp800-108,ecc,ecc-min-size=192,ecc-nist,ecc-bn,\
                   symcipher,camellia,camellia-min-size=128,cmac,ctr,\
                   ofb,cbc,cfb,ecb",
    "Description": "This profile enables all currently supported \
                    commands and algorithms. It is applied when the \
                    user chooses no profile."
  }
}

تنها نمایه‌ای که کاربر می‌تواند آن را تغییر دهد، نمایه 'custom' است. در اینجا کاربر می‌تواند الگوریتم‌ها، دستورات و ویژگی‌هایی را که اجازه غیرفعال شدن دارند، غیرفعال کند. برای جلوگیری از خرابی برنامه‌های کاربردی TPM 2، باید اطمینان حاصل کرد که هیچ‌یک از آنها به دستورات یا الگوریتم‌های غیرفعال‌شده وابسته نباشند.

نمایش نمایه‌های پشتیبانی‌شده توسط libtpms. همراه با گزینه --tpm2 استفاده شود.
نمایش اطلاعات مربوط به TPM حاصل از فراخوانی TPMLIB_GetInfo در libtpms و خروج. برای اطلاعات درباره TPM 2 از گزینه --tpm2 استفاده کنید. اگر گزینه --tpmstate نیز مشخص شده باشد، خروجی اطلاعات نمایه را نیز نشان خواهد داد. توجه داشته باشید که با این گزینه در صورتی که قبلاً وضعیتی برای TPM وجود نداشته باشد، ممکن است ایجاد شود.

مقادیر زیر را می‌توان ارائه داد. تمامی مقادیر می‌توانند با یکدیگر OR (یا جمع) شوند تا اطلاعات مربوط به تمام آنها در یک پرس‌وجو به دست آید:

  • 0x1: اطلاعات درباره مشخصاتی که پیاده‌سازی TPM از آن پیروی کرده است
  • 0x2: اطلاعات درباره سازنده، مدل و نسخه TPM
  • 0x4: فهرست اندازه‌های پشتیبانی‌شده برای کلیدهای RSA و Camellia
  • 0x8: شرح الگوریتم‌های پشتیبانی‌شده و فعال
  • 0x10: شرح دستورات پشتیبانی‌شده و فعال
  • 0x20: شرح نمایه فعال
  • 0x40: فهرست تمام نمایه‌های داخلی (built-in)
  • 0x80: شرح ویژگی‌های پشتیبانی‌شده
نمایش اطلاعات راهنمای استفاده.

در صورت استفاده از TPM 2، کاربر معمولاً موظف است دستور TPM2_Shutdown() را به TPM 2 ارسال کند تا از احتمال افزایش TPM_PT_LOCKOUT_COUNTER که ممکن است منجر به قفل شدن بر اثر حمله واژه‌نامه‌ای (DA) در راه‌اندازی بعدی (TPM2_Startup()) مربوط به TPM 2 شود جلوگیری گردد. افزایش یا عدم افزایش TPM_PT_LOCKOUT_COUNTER به دستورات قبلی ارسال‌شده به TPM 2 و همچنین وضعیت داخلی TPM 2 بستگی دارد. یک نمونه که موجب افزایش شمارنده می‌شود، حذف یا عدم ارائه گذرواژه در هنگام تلاش برای دسترسی به یک شیء حفاظت‌شده با گذرواژه یا مکانی در حافظه NVRAM با صفت فعال DA است، که به دنبال آن خاتمه swtpm بدون ارسال TPM2_Shutdown() رخ دهد. برای جلوگیری از قفل حمله واژه‌نامه‌ای، ابزار swtpm حداکثر تلاش خود را به کار بسته و در صورت لزوم دستور TPM2_Shutdown(SU_STATE) یا TPM2_Shutdown(SU_CLEAR) را ارسال خواهد کرد.

swtpm_bios, swtpm_cuse

2026-03-26 swtpm