tpm2_duplicate(1) General Commands Manual tpm2_duplicate(1)

tpm2_duplicate - کپی و تکثیر شیء بارگذاری‌شده در TPM2

tpm2_duplicate [گزینه‌ها]

دستور tpm2_duplicate(1) یک شیء بارگذاری‌شده را تکثیر می‌کند تا بتوان از آن در یک سلسله‌مراتب (hierarchy) متفاوت استفاده کرد. کلید والد جدید برای شیء تکثیرشده می‌تواند روی همان TPM یا یک TPM دیگر، یا TPM_RH_NULL باشد.

این گزینه‌ها فرآیند وارد کردن کلید را کنترل می‌کنند:

•
-G, --wrapper-algorithm=ALGORITHM:

الگوریتم متقارنی که اگر گزینهٔ -U استفاده نشود، برای پوشش درونی (inner wrapper) استفاده خواهد شد. پشتیبانی می‌کند از:

•
aes - الگوریتم AES 128 در حالت CFB.
•
null - هیچ‌کدام. الگوریتم کلید مرتبط با والد عمومی در صورت استفاده از گزینهٔ -U.
•
-G, --key-algorithm=ALGORITHM:

الگوریتم کلید مرتبط با والد عمومی در صورت استفاده از گزینهٔ -U.

•
-i, --encryptionkey-in=FILE:

نام فایل کلید متقارن (داده‌های ۱۲۸ بیتی) را مشخص می‌کند که برای پوشش درونی استفاده می‌شود. تنها زمانی معتبر است که الگوریتم متقارن مشخص‌شده null نباشد.

•
-o, --encryptionkey-out=FILE:

نام فایل برای ذخیره کلید متقارن (داده‌های ۱۲۸ بیتی) که برای پوشش درونی استفاده شده است را مشخص می‌کند. تنها زمانی معتبر است که الگوریتم متقارن مشخص‌شده null نباشد و --input-key-file مشخص نشده باشد. در این حالت TPM کلید را تولید می‌کند.

•
-C, --parent-context=OBJECT:

شیء کلید والد.

•
-U, --parent-public=FILE:

مسیر فایل به کلید عمومی شیء والد در TPM مقصد را مشخص می‌کند. این باید فایلی با قالب TPM2B_PUBLIC باشد. این کلید عمومی برای پوشش‌دهی یک کلید PEM یا DER استفاده می‌شود که برای یک TPM راه دور صادر خواهد شد.

•
-k, --private-key=FILE:

مسیر فایل کلید خصوصی خارجی را مشخص می‌کند که باید برای TPM راه دور رمزنگاری شود. این باید یک کلید خصوصی با قالب PEM باشد.

•
-r, --private=FILE:

مسیر فایل را برای ذخیره بخش خصوصی شیء تکثیرشده مشخص می‌کند. # جزئیات حفاظت (Protection Details)

اشیایی که می‌توانند به خارج از TPM منتقل شوند، باید محافظت گردند (محرمانگی و یکپارچگی). به عنوان مثال، اشیاء گذرا (transient) نیازمند آن هستند که داده‌های محافظت‌شده توسط TPM (کلید یا داده‌های مهروموم) در خارج از TPM ذخیره شوند. این مورد در ابزارهایی مانند tpm2_create(1) دیده می‌شود که در آن گزینهٔ -r این داده‌های محافظت‌شده را در خروجی قرار می‌دهد. این حباب داده (blob) حاوی بخش‌های حساس شیء است. بخش‌های حساس شیء توسط شیء والد محافظت می‌شوند؛ با استفاده از مشخصات رمزنگاری متقارن والد برای رمزگذاری داده‌های حساس و اعمال HMAC بر روی آن.

جزئیات دقیق را می‌توان در بخش ۲۳ سند زیر یافت:

•
https://trustedcomputinggroup.org/wp-content/uploads/TPM-Rev-2.0-Part-1-Architecture-01.38.pdf

به‌ویژه شکل ۲۰ مرتبط است، هرچند که مشخصاً به حباب‌های تکثیر اشاره دارد، اما فرآیند یکسان است.

اگر خروجی از tpm2_duplicate(1) باشد، خروجی کمی متفاوت خواهد بود، همان‌طور که به‌طور کامل در بخش ۲۳ توضیح داده شده است.

•
-u, --public=FILE:

در صورتی که یک کلید خارجی در حال تکثیر باشد، مسیر فایل برای ذخیره بخش عمومی شیء تکثیرشده را مشخص می‌کند.

•
-s, --encrypted-seed=FILE:

فایل ذخیره سید (seed) رمزنگاری‌شدهٔ شیء تکثیرشده.

•
-p, --auth=AUTH:

مقدار احراز هویت برای کلید، اختیاری است.

•
-L, --policy=FILE:

فایل پالیسی ورودی، اختیاری است.

•
-c, --key-context=OBJECT:

شیئی که قرار است تکثیر شود.

•
-a, --attributes=ATTRIBUTES:

ویژگی‌های شیء، اختیاری است. مقدار پیش‌فرض برای اشیاء ایجادشده عبارت است از:

TPMA_OBJECT_SIGN_ENCRYPT|TPMA_OBJECT_DECRYPT|TPMA_OBJECT_USERWITHAUTH

نکته: اگر یک پالیسی بدون مقدار auth مشخص شود، ویژگی TPMA_OBJECT_USERWITHAUTH غیرفعال می‌شود.

•
--cphash=FILE

مسیر فایل برای ثبت هش پارامترهای دستور. این مقدار معمولاً به عنوان cpHash شناخته می‌شود. نکته: با انتخاب این گزینه، ابزار در عمل دستور را اجرا نمی‌کند و صرفاً یک cpHash برمی‌گرداند.

نوع یک شیء کانتکست، چه هندل باشد یا نام فایل، بر اساس منطق زیر به‌ترتیب تعیین می‌شود:

•
اگر آرگومان یک مسیر فایل باشد، آن فایل به عنوان یک شیء گذرا (transient) بازگردانی‌شدهٔ TPM بارگذاری می‌شود.
•
اگر آرگومان با پیشوند یکی از موارد زیر مطابقت داشته باشد:
•
owner: سلسله‌مراتب مالک (owner hierarchy)
•
platform: سلسله‌مراتب پلتفرم (platform hierarchy)
•
endorsement: سلسله‌مراتب تأیید (endorsement hierarchy)
•
lockout: شیء پایدار کنترل قفل (lockout control persistent object)
•
اگر آرگومان بتواند به صورت یک عدد بارگذاری شود، به عنوان یک هندل تلقی می‌شود (مانند 0x81010013) و مستقیماً استفاده خواهد شد._OBJECT_.

مجوز برای استفاده از یک شیء در TPM2.0 می‌تواند به ۳ شکل مختلف باشد: 1. گذرواژه (Password) 2. کد HMAC 3. نشست‌ها (Sessions)

نکته: “در صورت مشخص نشدن، مجوزها به‌طور پیش‌فرض به گذرواژه خالی (EMPTY PASSWORD) تنظیم می‌شوند”.

برای احراز هویت با مقادیر مجاز (auth values)، دستورات ابزار به‌طور ضمنی یک نشست HMAC ایجاد می‌کنند. بنابراین گذرواژه‌ها به صورت رمزنگاری‌نشده منتقل نمی‌شوند. این امر برای گذرواژه‌های تعریف‌شده برای اشیاء صدق نمی‌کند. در این حالت، باید از یک نشست HMAC استفاده شود (دستور tpm2_startauthsession(1) را ببینید).

گذرواژه‌ها با استفاده از شناسه‌های پیشوندی به اَشکال زیر تفسیر می‌شوند.

نکته: در صورتی که گذرواژه‌ها پیشوند نداشته باشند، به‌طور پیش‌فرض به شکل رشته فرض می‌شوند.

یک گذرواژه رشته‌ای، که با پیشوند “str:” یا نبود آن (رشته خام بدون پیشوند) مشخص می‌شود، پردازش تفسیری نمی‌شود و مستقیماً برای احراز هویت استفاده می‌گردد.

foobar
str:foobar

یک گذرواژه رشته هگز، که با پیشوند “hex:” مشخص می‌شود، از قالب هگزادسیمال به یک آرایه بایتی تبدیل می‌شود؛ بنابراین امکان استفاده از گذرواژه‌هایی با نویسه‌های غیرقابل‌چاپ یا ناسازگار با ترمینال را فراهم می‌کند.

hex:1122334455667788

یک گذرواژه مبتنی بر فایل، که با پیشوند “file:” مشخص می‌شود، باید مسیر فایلی حاوی گذرواژه برای خوانده شدن توسط ابزار یا کاراکتر “-” برای استفاده از ورودی استاندارد (stdin) باشد. ذخیره گذرواژه‌ها در فایل از نشت اطلاعات جلوگیری می‌کند؛ گذرواژه‌هایی که به عنوان گزینه خط فرمان منتقل می‌شوند ممکن است از فهرست فرآیندها یا تاریخچه شل خوانده شوند.

# برای استفاده از ورودی استاندارد و دریافت اعلان
file:-
# برای استفاده از فایل از طریق مسیر
file:path/to/password/file
# برای ارسال گذرواژه از طریق stdin با echo:
echo foobar | tpm2_tool -p file:-
# برای استفاده از here-string بش از طریق stdin:
tpm2_tool -p file:- <<< foobar

هنگام استفاده از یک نشست پالیسی (policy session) برای مجاز کردن استفاده از یک شیء، شناسه گزینه را با کلمه کلیدی session شروع کنید. سپس مسیری به یک فایل نشست که توسط دستور tpm2_startauthsession(1) ایجاد شده است را مشخص نمایید. در صورت تمایل، اگر نشست نیازمند ارسال یک مقدار احراز هویت (auth value) به همراه هندل نشست باشد (مانند گذرواژه پالیسی)، یک علامت + و یک رشته را مطابق آنچه در بخش گذرواژه‌ها (Passwords) توضیح داده شد، اضافه کنید.

برای استفاده از یک فایل کانتکست نشست با نام session.ctx:

session:session.ctx

برای استفاده از یک فایل کانتکست نشست با نام session.ctx و ارسال مقدار احراز هویت mypassword:

session:session.ctx+mypassword

برای استفاده از یک فایل کانتکست نشست با نام session.ctx و ارسال مقدار احراز هویت هگز 0x11223344:

session:session.ctx+hex:11223344

می‌توانید با استفاده از پیشوند “pcr:” و زبان کوچک مربوط به PCR، یک پالیسی PCR را برآورده سازید. زبان کوچک PCR به صورت زیر است: <pcr-spec>=<raw-pcr-file>

مشخصات PCR در بخش “مشخص‌کننده‌های بانک PCR” مستند شده است.

آرگومان raw-pcr-file یک پارامتر اختیاری است که شامل خروجی محتویات خام PCR مطابق با خروجی دستور tpm2_pcrread(1) می‌باشد.

مشخص‌کننده‌های بانک PCR

برای برآورده کردن یک پالیسی PCR از نوع sha256 روی بانک‌های 0، 1، 2 و 3 از مشخص‌کننده زیر استفاده کنید:

pcr:sha256:0,1,2,3

مشخص کردن AUTH.

گزینه‌هایی که الگوریتم دریافت می‌کنند از «نام‌های مناسب» (nice-names) پشتیبانی می‌کنند.

دو دسته اصلی رشته‌های مشخص‌کننده الگوریتم وجود دارد: ساده و پیچیده. تنها الگوریتم‌های خاصی بر اساس نوع کاربرد و شرایط توسط TPM پذیرفته خواهند شد.

این‌ها رشته‌هایی بدون داده‌های مشخص‌کننده اضافی هستند. هنگام ایجاد اشیاء، بخش‌های تعیین‌نشده شیء با مقادیر پیش‌فرض در نظر گرفته می‌شوند. فهرست «مشخص‌کننده‌های ساده» شناخته‌شده در زیر آمده است.

•
rsa
•
ecc

•
aes
•
camellia
•
sm4

•
sha1
•
sha256
•
sha384
•
sha512
•
sm3_256
•
sha3_256
•
sha3_384
•
sha3_512

•
hmac
•
xor

•
rsassa
•
rsapss
•
ecdsa
•
ecdaa
•
ecschnorr
•
sm2

•
oaep
•
rsaes
•
ecdh

•
ctr
•
ofb
•
cbc
•
cfb
•
ecb

•
null

اشیاء، هنگامی که برای ایجاد توسط TPM مشخص می‌شوند، الگوریتم‌های متعددی دارند که در داده‌های عمومی آن‌ها قرار می‌گیرد؛ مواردی مانند نوع، طرح و جزئیات نامتقارن، اندازه کلید و غیره. در ادامه قالب کلی برای تعیین این داده‌ها آمده است: <type>:<scheme>:<symmetric-details>

این بخش از مشخص‌کننده الگوریتم پیچیده الزامی است. باقی‌مانده جزئیات طرح و بخش متقارن بر اساس نوع مشخص‌شده و نوع شیء در حال ایجاد، مقدار پیش‌فرض به خود می‌گیرند.

•
aes - مقدار پیش‌فرض AES: aes128
•
aes128<mode> - الگوریتم AES با ۱۲۸ بیت و حالت اختیاری (ctr|ofb|cbc|cfb|ecb). اگر حالت مشخص نشود، مقدار پیش‌فرض null خواهد بود.
•
aes192<mode> - مشابه aes128<mode>، به جز اندازه کلید ۱۹۲ بیتی.
•
aes256<mode> - مشابه aes128<mode>، به جز اندازه کلید ۲۵۶ بیتی.
•
sm4 - مقدار پیش‌فرض SM4: sm4128
•
sm4128 or sm4_128 <mode> - الگوریتم SM4 با ۱۲۸ بیت و حالت اختیاری (ctr|ofb|cbc|cfb|ecb). اگر حالت مشخص نشود، مقدار پیش‌فرض null خواهد بود.
•
ecc - منحنی بیضوی، مقدار پیش‌فرض ecc256.
•
ecc192 or ecc_nist_p192 - منحنی ECC NIST با طول ۱۹۲ بیت
•
ecc224 or ecc_nist_p224 - منحنی ECC NIST با طول ۲۲۴ بیت
•
ecc256 or ecc_nist_p256 - منحنی ECC NIST با طول ۲۵۶ بیت
•
ecc384 or ecc_nist_p384 - منحنی ECC NIST با طول ۳۸۴ بیت
•
ecc521 or ecc_nist_p521 - منحنی ECC NIST با طول ۵۲۱ بیت
•
ecc_sm2 or ecc_sm2_p256 - منحنی SM2 با طول ۲۵۶ بیت
•
rsa - مقدار پیش‌فرض RSA: rsa2048
•
rsa1024 - الگوریتم RSA با اندازه کلید ۱۰۲۴ بیت.
•
rsa2048 - الگوریتم RSA با اندازه کلید ۲۰۴۸ بیت.
•
rsa3072 - الگوریتم RSA با اندازه کلید ۳۰۷۲ بیت.
•
rsa4096 - الگوریتم RSA با اندازه کلید ۴۰۹۶ بیت.

مورد بعدی یک فیلد اختیاری است و می‌توان از آن صرف‌نظر کرد.

طرح‌ها معمولاً طرح‌های امضا یا طرح‌های رمزنگاری نامتقارن هستند. بیشتر طرح‌های امضا یک الگوریتم درهم‌سازی را مستقیماً پس از طرح امضا دریافت می‌کنند. اگر الگوریتم درهم‌سازی ذکر نشود، پیش‌فرض آن sha256 خواهد بود. برخی هیچ آرگومانی دریافت نمی‌کنند و برخی چندین آرگومان می‌پذیرند.

پس از این مشخص‌کننده‌های طرح، یک خط تیره و یک الگوریتم درهم‌سازی معتبر قرار می‌گیرد؛ به عنوان مثال: oaep-sha256.

•
oaep
•
ecdh
•
rsassa
•
rsapss
•
ecdsa
•
ecschnorr
•
sm2

پس از این مشخص‌کننده طرح، یک مقدار شمارش (حداکثر اندازه UINT16) و سپس یک خط تیره (-) و یک الگوریتم درهم‌سازی معتبر می‌آید. * ecdaa برای مثال: ecdaa4-sha256. اگر مقداری برای شمارش تعیین نشود، پیش‌فرض آن ۴ خواهد بود.

این مشخص‌کننده طرح هیچ آرگومانی نمی‌پذیرد. * rsaes

این فیلد اختیاری است و بر اساس نوع شیء در حال ایجاد و ویژگی‌های آن به مقادیر پیش‌فرض تنظیم می‌شود. به‌طور کلی، هر مشخص‌کننده معتبر متقارن از فهرست مشخص‌کننده‌های نوع قابل استفاده است. در صورت عدم تعیین، جزئیات متقارن یک شیء نامتقارن به‌طور پیش‌فرض aes128cfb در نظر گرفته می‌شود.

tpm2_create -C parent.ctx -G rsa2048:rsaes -u key.pub -r key.priv

/tpm2_create -C parent.ctx -G ecc256:ecdaa4-sha384 -u key.pub -r key.priv الگوریتم‌های رمزنگاری ALGORITHM.

این مجموعه گزینه‌ها میان بسیاری از برنامه‌ها مشترک هستند و اطلاعاتی را ارائه می‌دهند که اغلب کاربران انتظار دارند.

•
-h, --help=[man|no-man]: نمایش صفحه راهنمای ابزار. به‌طور پیش‌فرض، تلاش می‌کند صفحه‌خوان راهنما (manpager) را برای ابزار فراخوانی کند؛ اما در صورت شکست، خلاصه‌ای کوتاه از ابزار را نمایش می‌دهد. اگر آرگومان گزینه “man” مشخص شود نیز همین رفتار رخ می‌دهد، اما اگر صریحاً “man” درخواست شود، ابزار خطاهای man را در خروجی استاندارد خطا (stderr) نشان می‌دهد. اگر گزینه “no-man” مشخص شود یا صفحه‌خوان man با شکست مواجه گردد، خلاصه گزینه‌ها در خروجی استاندارد (stdout) چاپ خواهد شد.

استفاده موفقیت‌آمیز از ویژگی manpages نیازمند نصب بودن صفحات راهنما یا قرار داشتن آن‌ها در مسیر MANPATH است؛ برای جزئیات بیشتر به man(1) مراجعه کنید.

•
-v, --version: نمایش اطلاعات نگارش این ابزار و TCTIهای پشتیبانی‌شده و سپس خروج.
•
-V, --verbose: افزایش میزان اطلاعاتی که ابزار حین اجرا در کنسول چاپ می‌کند. هنگام استفاده از این گزینه، نام فایل و شماره خط چاپ می‌شوند.
•
-Q, --quiet: بی‌صدا کردن خروجی عادی ابزار در خروجی استاندارد (stdout).
•
-Z, --enable-errata: فعال‌سازی اعمال اصلاحیه‌های اشتباهات (errata fixups). این گزینه زمانی مفید است که نیاز به اعمال یک اصلاحیه errata روی دستورات ارسالی به TPM باشد. تعریف متغیر محیطی TPM2TOOLS_ENABLE_ERRATA نیز عملکردی معادل دارد.
•
-z, --pwd-session: استفاده از نشست گذرواژه به جای نشست HMAC برای احراز هویت. یک گذرواژه متن خام (clear text) برای تأیید عملیات به TPM ارسال می‌شود. از این گزینه می‌توان برای جلوگیری از بروز مشکل در زمان استفاده از نشست‌های بدون نمک (unsalted) در حالت OpenSSL FIPS استفاده کرد. اگر مقادیر مجاز (auth values) به کار روند، باید از یک نشست نمک‌دار (salted) برای احراز هویت استفاده شود.
•
-R, --autoflush: فعال کردن تخلیه خودکار (autoflush) برای اشیاء گذرای ایجادشده توسط دستور. اگر یک شیء والد از یک فایل زمینه بارگذاری شود، آن شیء والد گذرا نیز تخلیه خواهد شد. تخلیه خودکار همچنین در صورتی که متغیر محیطی TPM2TOOLS_AUTOFLUSH روی yes یا true تنظیم شده باشد، فعال می‌شود. اطلاعاتی که ممکن است بسیاری از کاربران انتظار داشته باشند.

رابط انتقال یا TCTI (Transmission Interface) سازوکار ارتباطی با TPM است. TCTIها را می‌توان برای ارتباط با TPM از طریق بسترهای گوناگون تغییر داد.

برای کنترل TCTI، ابزارها موارد زیر را در نظر می‌گیرند:

1.
گزینه خط فرمان -T یا --tcti
2.
متغیر محیطی: TPM2TOOLS_TCTI.

نکته: گزینه خط فرمان همواره بر متغیر محیطی اولویت دارد.

TCTIهای شناخته‌شده کنونی عبارتند از:

•
tabrmd - مدیر منابع، موسوم به tabrmd. توجه داشته باشید که tabrmd و abrmd به عنوان نام tcti هم‌معنی هستند.
•
mssim - معمولاً برای برقراری ارتباط با شبیه‌ساز نرم‌افزاری TPM استفاده می‌شود.
•
device - هنگام برقراری ارتباط مستقیم با فایل دستگاه TPM استفاده می‌شود.
•
none - هیچ ارتباطی با TPM برقرار نمی‌کند. برخی ابزارها امکان استفاده از گزینه‌های خارج از TPM (off-tpm) را می‌دهند و بنابراین از عدم استفاده از TCTI پشتیبانی می‌کنند. ابزارهایی که از آن پشتیبانی نمی‌کنند، در صورت تلاش برای استفاده بدون اتصال TCTI با خطا مواجه می‌شوند. این مقدار از هیچ گزینه‌ای پشتیبانی نمی‌کند و باید دقیقاً به صورت متن “none” ارائه شود.

آرگومان‌های گزینه خط فرمان یا متغیر محیطی به شکل زیر هستند:

<tcti-name>:<tcti-option-config>

تعیین یک رشته خالی برای هر یک از بخش‌های <tcti-name> یا <tcti-option-config> باعث می‌شود به ترتیب مقدار پیش‌فرض برای آن بخش استفاده شود.

هنگامی که یک TCTI مشخص نشده باشد، TCTI پیش‌فرض با استفاده از سازوکار dlopen(3) جستجو می‌شود. ابزارها به دنبال TCTIهای tabrmd، device و mssim به همین ترتیب می‌گردند و از نخستین موردی که پیدا شد استفاده می‌کنند. می‌توانید با استفاده از گزینه -v برای چاپ اطلاعات نگارش، متوجه شوید کدام TCTI به عنوان پیش‌فرض انتخاب خواهد شد. جفت کلید-مقدار “default-tcti” نشان خواهد داد کدام یک از TCTIهای پیش‌گفته به عنوان پیش‌فرض است.

هر TCTI که رابط پویای TCTI را پیاده‌سازی کند می‌تواند بارگذاری شود. ابزارها در داخل از dlopen(3) استفاده می‌کنند و مقدار خام tcti-name برای جستجو به کار می‌رود. بنابراین، این مقدار می‌تواند مسیری به کتابخانه مشترک یا نام کتابخانه به نحوی که برای سازوکار dlopen(3) قابل فهم باشد، باشد.

این مجموعه گزینه‌ها برای پیکربندی ماژول‌های مختلف TCTI شناخته‌شده در دسترس به کار می‌روند:

•
device: برای TCTI دستگاه (device)، فایل دستگاه نویسه‌ای (character device) TPM برای استفاده توسط این TCTI قابل تعیین است. مقدار پیش‌فرض /dev/tpm0 است.

مثال: -T device:/dev/tpm0 یا export TPM2TOOLS_TCTI=“device:/dev/tpm0”

•
mssim: برای TCTI شبیه‌ساز mssim، نام دامنه یا آدرس IP و شماره درگاه (port) مورد استفاده شبیه‌ساز قابل تعیین است. مقادیر پیش‌فرض 127.0.0.1 و 2321 هستند.

مثال: -T mssim:host=localhost,port=2321 یا export TPM2TOOLS_TCTI=“mssim:host=localhost,port=2321”

•
abrmd: برای TCTI ابزار abrmd، قالب رشته پیکربندی مجموعه‌ای از جفت‌های کلید-مقدار ساده است که با کاراکتر `,' از هم جدا شده‌اند. هر کلید و رشته مقدار با کاراکتر `=' از هم جدا می‌شوند.
•
ماژول TCTI abrmd از دو کلید پشتیبانی می‌کند:
1.
`bus_name' : نام سرویس tabrmd روی گذرگاه (یک رشته).
2.
`bus_type' : نوع نمونه dbus (یک رشته) که محدود به `session' و `system' است.

مشخص کردن نام tcti مربوط به tabrmd و رشته پیکربندی bus_name=com.example.FooBar:

\--tcti=tabrmd:bus_name=com.example.FooBar

مشخص کردن tcti پیش‌فرض (abrmd) و رشته پیکربندی bus_type=session:

\--tcti:bus_type=session

نکته: دو نام abrmd و tabrmd مترادف یکدیگرند. ماژول‌های مختلف TCTI شناخته‌شده.

tpm2_startauthsession -S session.dat
tpm2_policycommandcode -S session.dat -L policy.dat TPM2_CC_Duplicate
tpm2_flushcontext session.dat
tpm2_createprimary -C o -g sha256 -G rsa -c primary.ctxt
tpm2_create -C primary.ctxt -g sha256 -G rsa -r key.prv -u key.pub  -c key.ctxt \
-L policy.dat -a "sensitivedataorigin|userwithauth|decrypt|sign"
tpm2_createprimary -C o -g sha256 -G ecc -c new_parent.ctxt
tpm2_startauthsession \--policy-session -S session.dat
tpm2_policycommandcode -S session.dat -L policy.dat TPM2_CC_Duplicate
tpm2_duplicate -C new_parent.ctxt -c key.ctxt -G null -p "session:session.dat" \
-r duprv.bin -s seed.dat
tpm2_flushcontext session.dat

ایجاد یک شیء والد که برای پوشش‌دهی/انتقال کلید استفاده خواهد شد.

tpm2_createprimary -C o -g sha256 -G rsa -c primary.ctx
tpm2_create  -C primary.ctx -g sha256 -G rsa \
-r new_parent.prv  -u new_parent.pub \
-a "restricted|sensitivedataorigin|decrypt|userwithauth"

کپی کردن new_parent.pub به TPM-A.

ایجاد شیء ریشه و پالیسی احراز هویتی که تنها تکثیر را مجاز می‌داند

tpm2_createprimary -C o -g sha256 -G rsa -c primary.ctx
tpm2_startauthsession -S session.dat
tpm2_policycommandcode -S session.dat -L dpolicy.dat TPM2_CC_Duplicate
tpm2_flushcontext session.dat
rm session.dat

تولید یک جفت‌کلید RSA روی TPM-A که تکثیر خواهد شد (توجه داشته باشید که عبارت عبور `foo' است)

tpm2_create -C primary.ctx -g sha256 -G rsa -p foo -r key.prv \
-u key.pub  -L dpolicy.dat -a "sensitivedataorigin|userwithauth|decrypt|sign"
tpm2_load -C primary.ctx -r key.prv -u key.pub -c key.ctx
tpm2_readpublic -c key.ctx -o dup.pub

آزمایش امضا و رمزنگاری به صورت محلی (تا بعداً بتوانیم مقایسه کنیم که همان کلید منتقل شده است).

echo "meet me at.." >file.txt
tpm2_rsaencrypt -c key.ctx  -o data.encrypted file.txt
tpm2_sign -c key.ctx -g sha256 -f plain -p foo -o sign.raw file.txt

مقایسه هش امضا (بعداً از این برای تأیید انتقال کلید به TPM-B استفاده خواهیم کرد):

sha256sum sign.raw
a1b4e3fbaa29e6e46d95cff498150b6b8e7d9fd21182622e8f5a3ddde257879e

آغاز یک نشست احراز هویت و دستور پالیسی برای مجاز کردن تکثیر

tpm2_startauthsession --policy-session -S session.dat
tpm2_policycommandcode -S session.dat -L dpolicy.dat TPM2_CC_Duplicate

بارگذاری فایل new_parent.pub منتقل‌شده از TPM-B

tpm2_loadexternal -C o -u new_parent.pub -c new_parent.ctx

آغاز عملیات تکثیر

tpm2_duplicate -C new_parent.ctx -c key.ctx -G null  \
-p "session:session.dat" -r dup.dpriv -s dup.seed

کپی کردن فایل‌های زیر به TPM-B: * dup.pub * dup.dpriv * dup.seed * (اختیاراً data.encrypted صرفاً برای آزمایش رمزگشایی)

آغاز یک نشست احراز هویت و پالیسی

tpm2_startauthsession --policy-session -S session.dat
tpm2_policycommandcode -S session.dat -L dpolicy.dat TPM2_CC_Duplicate

بارگذاری کانتکستی که برای انتقال استفاده کردیم

tpm2_flushcontext --transient-object
tpm2_load -C primary.ctx -u new_parent.pub -r new_parent.prv -c new_parent.ctx

وارد کردن کانتکست تکثیرشده در برابر والدی که استفاده کردیم

tpm2_import -C new_parent.ctx -u dup.pub -i dup.dpriv \
-r dup.prv -s dup.seed -L dpolicy.dat

بارگذاری کانتکست کلید تکثیرشده

tpm2_flushcontext --transient-object
tpm2_load -C new_parent.ctx -u dup.pub -r dup.prv -c dup.ctx

آزمایش مطابقت کلید واردشده

•
امضا
echo "meet me at.." >file.txt
tpm2_sign -c dup.ctx -g sha256 -o sig.rss -p foo file.txt
dd if=sig.rss of=sign.raw bs=1 skip=6 count=256

مقایسه هش فایل امضا:

$ sha256sum sign.raw
a1b4e3fbaa29e6e46d95cff498150b6b8e7d9fd21182622e8f5a3ddde257879e
•
رمزگشایی
tpm2_flushcontext --transient-object
tpm2_rsadecrypt -p foo -c dup.ctx -o data.ptext data.encrypted
# cat data.ptext
meet me at..

برای ارسال امن یک کلید RSA تولیدشده توسط OpenSSL به یک TPM راه دور، به‌گونه‌ای که تنها آن TPM راه دور بتواند آن را بارگذاری کند، و بدون افشای کلید خصوصی برای سیستم‌عامل میزبان در ماشین راه دور:

•
در TPM-B مقصد، یک کانتکست اولیه ایجاد کرده و کلید عمومی آن را بخوانید، سپس primary.pub را به ماشین مبدأ ارسال کنید:
tpm2_createprimary -c primary.ctx
tpm2_readpublic -c primary.ctx -o primary.pub
•
در ماشین مبدأ، کلید خصوصی RSA را ایجاد کرده و آن را با کلید عمومی TPM مقصد پوشش دهید (wrap کنید). مشابه با tpm2_makecredential، این مرحله نباید نیازی به TPM داشته باشد.
openssl genrsa -out rsa.pem
tpm2_duplicate -U primary.pub -G rsa -k rsa.pem -u rsa.pub -r rsa.dpriv -s rsa.seed
•
فایل‌های rsa.pub، rsa.dpriv و rsa.seed را به TPM-B مقصد ارسال کرده و فایل‌ها را وارد (import) کنید؛ این کار آن‌ها را با استفاده از primary.ctx رمزگشایی می‌کند تا rsa.priv تولید شود، که سپس می‌تواند به عنوان یک کلید TPM بارگذاری و استفاده شود:
tpm2_import -C primary.ctx -G rsa -i rsa.dpriv -s rsa.seed -u rsa.pub -r rsa.priv
tpm2_load -C primary.ctx -c rsa.ctx -u rsa.pub -r rsa.priv

این فرآیند یک کلید HMAC ایجادشده در داخل TPM-A را فقط به TPM-B صادر می‌کند و با پالیسی‌ای همراه می‌سازد که مانع از اجازه صادرات مجدد توسط TPM-B می‌شود.

•
در TPM-B مقصد، یک کانتکست اولیه ایجاد کنید:
tpm2_createprimary -C o -g sha256 -G rsa -c primary.ctx
tpm2_create  -C primary.ctx -g sha256 -G rsa -r new_parent.prv \
    -u new_parent.pub -a "fixedtpm|fixedparent|restricted|sensitivedataorigin|decrypt|userwithauth"

کپی کردن new_parent.pub به TPM-A.

•
روی TPM-A مبدأ

کلید راه دور را بارگذاری کرده و «نام» (name) آن را ذخیره کنید

tpm2_loadexternal -C o -u new_parent.pub -c new_parent.ctx -n new_parent.name

یک شیء اولیه و یک پالیسی ایجاد کنید که تکثیر را فقط به والد TPM-B محدود کند

tpm2_createprimary -C o -g sha256 -G rsa -c primary.ctx
tpm2_startauthsession -S session.dat
tpm2_policyduplicationselect -S session.dat  -N new_parent.name -L dpolicy.dat
tpm2_flushcontext session.dat

یک کلید HMAC با آن پالیسی ایجاد کنید

tpm2_create -C primary.ctx -g sha256 -G hmac -r key.prv -u key.pub \
   -L dpolicy.dat -a "sensitivedataorigin|userwithauth|sign"

کلید را بارگذاری کرده و «نام» آن را ذخیره کنید. یک HMAC آزمایشی تولید کنید

tpm2_load -C primary.ctx -r key.prv -u key.pub -c key.ctx
tpm2_readpublic -c key.ctx -n dupkey.name
export plain="foo"
echo -n $plain | tpm2_hmac -g sha256 -c key.ctx | xxd -p -c 256
   42a1fad918fa0e4cbea94d759da89ccdfac5a640672d0170f4930cafe14d179c

آغاز نشست احراز هویت برای تکثیر با استفاده از tpm2_policyduplicationselect

tpm2_startauthsession --policy-session -S session.dat
tpm2_policyduplicationselect -S session.dat  -N new_parent.name \
   -L dpolicy.dat  -n dupkey.name
tpm2_duplicate -C new_parent.ctx -c key.ctx -G null \
   -p "session:session.dat" -r dup.dup -s dup.seed

کپی کردن dup.dup، dup.seed و key.pub به TPM-B

•
روی TPM-B مقصد

بارگذاری مجدد والد جدید اولیه و وارد کردن کلید

tpm2_load -C primary.ctx -u new_parent.pub -r new_parent.prv -c new_parent.ctx
tpm2_import -C new_parent.ctx -u key.pub -i dup.dup  -r dup.prv -s dup.seed
tpm2_load -C new_parent.ctx -u key.pub -r dup.prv -c dup.ctx

تولید یک نمونه HMAC

export plain="foo"
echo -n $plain | tpm2_hmac -g sha256 -c dup.ctx | xxd -p -c 256
   42a1fad918fa0e4cbea94d759da89ccdfac5a640672d0170f4930cafe14d179c

ابزارها می‌توانند هر یک از کدهای زیر را بازگردانند:

•
0 - موفقیت‌آمیز.
•
1 - خطای عمومی و نامشخص.
•
2 - خطای مدیریت گزینه‌ها.
•
3 - خطای احراز هویت.
•
4 - خطای مربوط به TCTI.
•
5 - طرح پشتیبانی‌نشده. قابل اعمال بر tpm2_testparams.

مسائل گیت‌هاب (Github Issues)

مشاهده فهرست پستی (Mailing List)

این اثر تحت مجوز بین‌المللی ارجاع ۴٫۰ کریپتیو کامانز (CC BY 4.0).

tpm2-tools