ฟังก์ชัน KeyMint

หน้านี้ให้รายละเอียดและหลักเกณฑ์เพิ่มเติมเพื่อช่วยผู้ติดตั้งใช้งานเลเยอร์การแยกแยะฮาร์ดแวร์ (HAL) ของ KeyMint เอกสารประกอบหลักสำหรับ HAL คือข้อกำหนดอินเทอร์เฟซ AIDL

การใช้ API ในทางที่ผิด

ผู้เรียกสามารถสร้างคีย์ KeyMint ด้วยการให้สิทธิ์ที่ถูกต้องสำหรับพารามิเตอร์ API แต่ทำให้คีย์ที่ได้ไม่ปลอดภัยหรือไม่ใช้งานได้ การติดตั้งใช้งาน KeyMint ไม่จำเป็นต้องล้มเหลวหรือแสดงการวินิจฉัยในกรณีดังกล่าว การใช้คีย์ที่มีขนาดเล็กเกินไป การระบุพารามิเตอร์อินพุตที่ไม่เกี่ยวข้อง การใช้ IV หรือ Nonce ซ้ำ การสร้างคีย์ที่ไม่มีวัตถุประสงค์ (จึงไร้ประโยชน์) และอื่นๆ ไม่ควรได้รับการวินิจฉัยจากการใช้งาน

แอป เฟรมเวิร์ก และ Android Keystore มีหน้าที่รับผิดชอบในการตรวจสอบว่าการเรียกใช้โมดูล KeyMint นั้นเหมาะสมและมีประโยชน์

จุดแรกเข้า addRngEntropy

จุดเข้าใช้งาน addRngEntropy จะเพิ่มข้อมูลความผันผวนของผู้เรียกไปยังพูลที่ใช้โดยการติดตั้งใช้งาน KeyMint เพื่อสร้างตัวเลขสุ่มสําหรับคีย์และ IV

การติดตั้งใช้งาน KeyMint ต้องผสมข้อมูลสุ่มที่ระบุไว้ในพูลอย่างปลอดภัย ซึ่งต้องมีข้อมูลสุ่มที่สร้างขึ้นภายในจากเครื่องมือสร้างตัวเลขสุ่มแบบฮาร์ดแวร์ด้วย ควรจัดการการผสมเพื่อให้ผู้โจมตีที่มีการควบคุมบิตที่ addRngEntropy ระบุหรือบิตที่ฮาร์ดแวร์สร้างขึ้นอย่างสมบูรณ์ (แต่ไม่ใช่ทั้ง 2 อย่าง) ไม่มีข้อได้เปรียบที่สำคัญในการคาดการณ์บิตที่สร้างขึ้นจากพูลข้อมูลสุ่ม

ลักษณะสำคัญ

กลไกแต่ละรายการ (generateKey, importKey และ importWrappedKey) ที่สร้างคีย์ KeyMint จะแสดงลักษณะของคีย์ที่สร้างขึ้นใหม่ โดยแบ่งออกเป็นระดับการรักษาความปลอดภัยที่เหมาะสมซึ่งบังคับใช้ลักษณะแต่ละอย่าง ลักษณะที่แสดงผลจะประกอบด้วยพารามิเตอร์ทั้งหมดที่ระบุไว้สําหรับการสร้างคีย์ ยกเว้น Tag::APPLICATION_ID และ Tag::APPLICATION_DATA หากแท็กเหล่านี้รวมอยู่ในพารามิเตอร์คีย์ ระบบจะนำแท็กเหล่านี้ออกจากลักษณะที่ปรากฏขึ้นเพื่อไม่ให้ค้นหาค่าได้โดยการตรวจสอบคีย์บล็อกที่แสดง อย่างไรก็ตาม ค่าเหล่านี้จะเชื่อมโยงกับคีย์บล็อกแบบเข้ารหัส ดังนั้นหากไม่ได้ระบุค่าที่ถูกต้องเมื่อใช้คีย์ การใช้งานก็จะไม่สำเร็จ ในทำนองเดียวกัน Tag::ROOT_OF_TRUST จะเชื่อมโยงกับคีย์แบบเข้ารหัส แต่ไม่สามารถระบุในระหว่างการสร้างหรือนําเข้าคีย์ และระบบจะไม่แสดงTag::ROOT_OF_TRUST

นอกเหนือจากแท็กที่ระบุแล้ว การติดตั้งใช้งาน KeyMint จะเพิ่ม Tag::ORIGIN ซึ่งระบุลักษณะการสร้างคีย์ (KeyOrigin::GENERATED, KeyOrigin::IMPORTED หรือ KeyOrigin::SECURELY_IMPORTED)

ป้องกันการย้อนกลับ

การป้องกันการเปลี่ยนกลับจะแสดงด้วย Tag::ROLLBACK_RESISTANCE ซึ่งหมายความว่าเมื่อลบคีย์ด้วย deleteKey หรือ deleteAllKeys แล้ว ฮาร์ดแวร์ที่มีความปลอดภัยจะตรวจสอบว่าคีย์ดังกล่าวไม่สามารถใช้งานได้อีก

การใช้งาน KeyMint จะแสดงเนื้อหาคีย์ที่สร้างขึ้นหรือนําเข้าต่อผู้เรียกใช้เป็นคีย์บล็อก ซึ่งเป็นรูปแบบที่เข้ารหัสและตรวจสอบสิทธิ์แล้ว เมื่อคีย์สโตร์ลบกลุ่มคีย์แล้ว คีย์จะหายไป แต่ผู้โจมตีที่ก่อนหน้านี้สามารถดึงข้อมูลวัสดุคีย์ได้อาจกู้คืนข้อมูลดังกล่าวลงในอุปกรณ์ได้

คีย์จะป้องกันการย้อนกลับได้หากฮาร์ดแวร์ที่มีความปลอดภัยช่วยให้มั่นใจว่าคีย์ที่ลบไปแล้วจะกู้คืนไม่ได้ในภายหลัง ซึ่งโดยปกติจะทําโดยการเก็บข้อมูลเมตาเพิ่มเติมของคีย์ไว้ในตำแหน่งที่เชื่อถือได้ซึ่งผู้โจมตีไม่สามารถดัดแปลงได้ ในอุปกรณ์เคลื่อนที่ กลไกที่ใช้มักจะเป็นบล็อกหน่วยความจำที่มีการป้องกันการเล่นซ้ำ (RPMB) เนื่องจากจำนวนคีย์ที่สร้างได้นั้นไม่มีขีดจำกัด และพื้นที่เก็บข้อมูลที่เชื่อถือได้ซึ่งใช้เพื่อป้องกันการย้อนกลับอาจมีขนาดจำกัด การติดตั้งใช้งานจึงอาจสร้างคีย์ที่ป้องกันการย้อนกลับไม่ได้เมื่อพื้นที่เก็บข้อมูลเต็ม

เริ่มต้น

จุดแรกเข้า begin() จะเริ่มต้นการดำเนินการเข้ารหัสโดยใช้คีย์ที่ระบุเพื่อวัตถุประสงค์ที่ระบุด้วยพารามิเตอร์ที่ระบุ (ตามความเหมาะสม) โดยจะแสดงผลIKeyMintOperationออบเจ็กต์ Binder ใหม่ที่ใช้เพื่อดำเนินการให้เสร็จสมบูรณ์ นอกจากนี้ ระบบจะแสดงผลค่าคำตอบที่ใช้เป็นส่วนหนึ่งของโทเค็นการตรวจสอบสิทธิ์ในการดำเนินการที่มีการตรวจสอบสิทธิ์

การติดตั้งใช้งาน KeyMint รองรับการดำเนินการพร้อมกันอย่างน้อย 16 รายการ เก็บคีย์ได้สูงสุด 15 รายการ โดยเหลือ 1 รายการไว้ให้ vold ใช้ในการเข้ารหัสรหัสผ่าน เมื่อคีย์สโตร์มีการดำเนินการ 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 อย่างน้อย 1 ค่า และไม่มีค่า Tag::AUTH_TIMEOUT

ในกรณีนี้ คีย์ต้องมีการให้สิทธิ์ต่อการดำเนินการ และเมธอด update() หรือ finish() จะได้รับโทเค็นการให้สิทธิ์ในอาร์กิวเมนต์ authToken การติดตั้งใช้งาน KeyMint จะดำเนินการต่อไปนี้เพื่อให้มั่นใจว่าโทเค็นถูกต้อง

  • ยืนยันลายเซ็น HMAC ในโทเค็นการตรวจสอบสิทธิ์
  • ตรวจสอบว่าโทเค็นมีรหัสผู้ใช้ที่ปลอดภัยซึ่งตรงกับรหัสที่เชื่อมโยงกับคีย์
  • ตรวจสอบว่าประเภทการตรวจสอบสิทธิ์ของโทเค็นตรงกับ Tag::USER_AUTH_TYPE ของคีย์
  • ตรวจสอบว่าโทเค็นมีค่าคำขอยืนยันสําหรับการดำเนินการปัจจุบันในฟิลด์คำขอยืนยัน

หากไม่เป็นไปตามเงื่อนไขเหล่านี้ KeyMint จะแสดงผลเป็น ErrorCode::KEY_USER_NOT_AUTHENTICATED

ผู้โทรจะระบุโทเค็นการตรวจสอบสิทธิ์ในการโทรหา update() และ finish() ทุกครั้ง การติดตั้งใช้งานจะตรวจสอบโทเค็นได้เพียงครั้งเดียว