หน้านี้ให้รายละเอียดและหลักเกณฑ์เพิ่มเติมเพื่อช่วยผู้ติดตั้งใช้งานเลเยอร์การแยกแยะฮาร์ดแวร์ (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()
ทุกครั้ง การติดตั้งใช้งานจะตรวจสอบโทเค็นได้เพียงครั้งเดียว