توابع KeyMint

این صفحه جزئیات و دستورالعمل های بیشتری را برای کمک به اجراکنندگان لایه انتزاعی سخت افزار KeyMint (HAL) ارائه می دهد. مستندات اولیه برای HAL، مشخصات رابط AIDL است.

سوء استفاده از API

تماس گیرندگان می توانند کلیدهای KeyMint را با مجوزهایی ایجاد کنند که به عنوان پارامترهای API معتبر هستند، اما کلیدهای حاصل را ناامن یا غیرقابل استفاده می کنند. نیازی به اجرای KeyMint نیست که در چنین مواردی شکست بخورند یا عیب یابی صادر کنند. استفاده از کلیدهای خیلی کوچک، مشخص کردن پارامترهای ورودی نامربوط، استفاده مجدد از IV ها یا nonces، تولید کلیدهای بدون هدف (بنابراین بی فایده) و مواردی از این قبیل نباید توسط پیاده سازی ها تشخیص داده شوند.

این مسئولیت برنامه‌ها، چارچوب و Android Keystore است که اطمینان حاصل کنند که تماس‌های ماژول‌های KeyMint معقول و مفید هستند.

نقطه ورود addRngEntropy

نقطه ورود addRngEntropy آنتروپی ارائه شده توسط تماس گیرنده را به مجموعه ای که توسط KeyMint برای تولید اعداد تصادفی، برای کلیدها و IV ها استفاده می شود، اضافه می کند.

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

ویژگی های کلیدی

هر یک از مکانیزم‌ها ( generateKey ، importKey ، و importWrappedKey ) که کلیدهای KeyMint را ایجاد می‌کنند، ویژگی‌های کلید جدید ایجاد شده را برمی‌گرداند که به طور مناسب به سطوح امنیتی که هر مشخصه را اعمال می‌کنند تقسیم می‌شوند. ویژگی های برگردانده شده شامل تمام پارامترهای مشخص شده برای ایجاد کلید است، به جز Tag::APPLICATION_ID و Tag::APPLICATION_DATA . اگر این تگ‌ها در پارامترهای کلیدی گنجانده شوند، از ویژگی‌های بازگشتی حذف می‌شوند تا با بررسی صفحه کلید برگشتی، مقادیر آنها را پیدا نکنید. با این حال، آنها از نظر رمزنگاری به keyblob متصل هستند، به طوری که اگر مقادیر صحیح در هنگام استفاده از کلید ارائه نشود، استفاده با شکست مواجه می شود. به طور مشابه، Tag::ROOT_OF_TRUST از نظر رمزنگاری به کلید متصل است، اما نمی توان آن را در هنگام ایجاد یا وارد کردن کلید مشخص کرد و هرگز بازگردانده نمی شود.

علاوه بر برچسب‌های ارائه شده، پیاده‌سازی KeyMint Tag::ORIGIN نیز اضافه می‌کند، که نشان‌دهنده نحوه ایجاد کلید است ( KeyOrigin::GENERATED ، KeyOrigin::IMPORTED ، یا KeyOrigin::SECURELY_IMPORTED ).

مقاومت عقبگرد

مقاومت برگشتی با Tag::ROLLBACK_RESISTANCE نشان داده می‌شود، و به این معنی است که وقتی کلیدی با deleteKey یا deleteAllKeys حذف می‌شود، سخت‌افزار امن تضمین می‌کند که دیگر هرگز قابل استفاده نیست.

پیاده سازی های KeyMint مواد کلیدی تولید شده یا وارد شده را به عنوان یک صفحه کلید، یک فرم رمزگذاری شده و احراز هویت شده به تماس گیرنده برمی گرداند. وقتی Keystore صفحه کلید را حذف می‌کند، کلید از بین می‌رود، اما مهاجمی که قبلاً موفق به بازیابی مواد کلیدی شده است، می‌تواند به طور بالقوه آن را به دستگاه بازیابی کند.

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

آغاز شود

نقطه ورود begin() شروع یک عملیات رمزنگاری را با استفاده از کلید مشخص شده، برای هدف مشخص شده، با پارامترهای مشخص شده (در صورت لزوم) آغاز می کند. یک شیء جدید IKeyMintOperation Binder را برمی گرداند که برای تکمیل عملیات استفاده می شود. علاوه بر این، یک مقدار چالش برگردانده می شود که به عنوان بخشی از نشانه احراز هویت در عملیات احراز هویت استفاده می شود.

پیاده سازی KeyMint حداقل از 16 عملیات همزمان پشتیبانی می کند. Keystore تا 15 مورد استفاده می کند، و یکی را برای vold باقی می گذارد تا برای رمزگذاری رمز عبور استفاده شود. هنگامی که Keystore دارای 15 عملیات در حال انجام است ( begin() فراخوانی شده است، اما finish یا abort فراخوانی نشده است) و درخواستی برای شروع یک 16 دریافت می کند، abort() را بر روی عملیاتی که اخیراً کمتر استفاده شده است فراخوانی می کند تا تعداد عملیات فعال را به 14 کاهش دهد، قبل از فراخوانی begin() برای شروع عملیات جدید درخواست شده.

اگر Tag::APPLICATION_ID یا Tag::APPLICATION_DATA در طول تولید یا وارد کردن کلید مشخص شده باشد، فراخوانی های begin() باید شامل آن تگ ها با مقادیر مشخص شده اولیه در آرگومان params این متد باشد.

رسیدگی به خطا

اگر روشی در یک IKeyMintOperation یک کد خطایی غیر از ErrorCode::OK را برگرداند، عملیات لغو می‌شود و شیء Binder باطل می‌شود. هر گونه استفاده در آینده از شیء ErrorCode::INVALID_OPERATION_HANDLE را برمی گرداند.

اجرای مجوز

اجرای مجوزهای کلیدی عمدتاً در begin() انجام می شود. تنها استثنا موردی است که کلید دارای یک یا چند مقدار Tag::USER_SECURE_ID است و مقدار Tag::AUTH_TIMEOUT ندارد.

در این مورد، کلید به یک مجوز برای هر عملیات نیاز دارد و متدهای update() یا finish() یک نشانه اعتبار در آرگومان authToken دریافت می کنند. برای اطمینان از معتبر بودن توکن، پیاده سازی KeyMint:

  • امضای HMAC را در توکن تأیید اعتبار تأیید می کند.
  • بررسی می کند که رمز حاوی شناسه کاربری ایمن منطبق با کلید باشد.
  • بررسی می‌کند که نوع تأیید رمز با Tag::USER_AUTH_TYPE .
  • بررسی می کند که نشانه حاوی مقدار چالش برای عملیات جاری در فیلد چالش باشد.

اگر این شرایط رعایت نشود، KeyMint ErrorCode::KEY_USER_NOT_AUTHENTICATED را برمی‌گرداند.

تماس گیرنده برای هر فراخوانی رمز احراز هویت برای update() و finish() ارائه می کند. پیاده سازی فقط یک بار می تواند توکن را تأیید کند.