หน้านี้ให้รายละเอียดและหลักเกณฑ์เพิ่มเติมเพื่อช่วยผู้ใช้ เลเยอร์การแยกฮาร์ดแวร์ (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
หากแท็กเหล่านี้รวมอยู่ในพารามิเตอร์คีย์ ระบบจะนำแท็กออกจากลักษณะที่ส่งคืนเพื่อไม่ให้ค้นหาค่าได้โดยการตรวจสอบ KeyBlob ที่ส่งคืน อย่างไรก็ตาม ค่าเหล่านี้จะเชื่อมโยงกับ
KeyBlob ด้วยการเข้ารหัส เพื่อให้หากไม่ได้ระบุค่าที่ถูกต้องเมื่อใช้คีย์
การใช้งานจะล้มเหลว ในทำนองเดียวกัน
Tag::ROOT_OF_TRUST
จะ
เชื่อมโยงกับคีย์ด้วยการเข้ารหัส แต่จะระบุในระหว่าง
การสร้างหรือนำเข้าคีย์ไม่ได้ และจะไม่แสดงผล
นอกเหนือจากแท็กที่ระบุไว้ การติดตั้งใช้งาน KeyMint ยังเพิ่ม Tag::ORIGIN
ซึ่งระบุวิธีการสร้างคีย์ (KeyOrigin::GENERATED
, KeyOrigin::IMPORTED
หรือ KeyOrigin::SECURELY_IMPORTED
)
ป้องกันการย้อนกลับ
Tag::ROLLBACK_RESISTANCE
แสดงถึงความสามารถในการป้องกันการย้อนกลับ
และหมายความว่าเมื่อลบคีย์ด้วย deleteKey
หรือ deleteAllKeys
แล้ว ฮาร์ดแวร์ที่ปลอดภัย
จะทำให้มั่นใจได้ว่าจะไม่สามารถใช้คีย์นั้นได้อีก
การใช้งาน KeyMint จะส่งคืนเนื้อหาคีย์ที่สร้างขึ้นหรือนำเข้าให้กับ ผู้เรียกในรูปแบบของ KeyBlob ซึ่งเป็นรูปแบบที่เข้ารหัสและตรวจสอบสิทธิ์แล้ว เมื่อ Keystore ลบ คีย์บล็อบ คีย์จะหายไป แต่ผู้โจมตีที่เคย ดึงข้อมูลเนื้อหาคีย์ได้ก่อนหน้านี้อาจกู้คืนคีย์ไปยังอุปกรณ์ได้
คีย์จะป้องกันการย้อนกลับได้หากฮาร์ดแวร์ที่ปลอดภัยช่วยให้มั่นใจว่าคีย์ที่ลบไปแล้วจะกู้คืนไม่ได้ในภายหลัง โดยทั่วไปจะทำโดยการจัดเก็บข้อมูลเมตาของคีย์เพิ่มเติม ในตำแหน่งที่เชื่อถือได้ซึ่งผู้โจมตีไม่สามารถดัดแปลงได้ ใน อุปกรณ์เคลื่อนที่ กลไกที่ใช้สำหรับสิ่งนี้มักจะเป็นบล็อกหน่วยความจำที่ป้องกันการเล่นซ้ำ (RPMB) เนื่องจากจำนวนคีย์ที่สร้างได้นั้นไม่จำกัด และพื้นที่เก็บข้อมูลที่เชื่อถือได้ซึ่งใช้เพื่อป้องกันการย้อนกลับอาจมีขนาดจำกัด การติดตั้งใช้งานจึงอาจทำให้คำขอสร้างคีย์ที่ป้องกันการย้อนกลับล้มเหลวเมื่อพื้นที่เก็บข้อมูลเต็ม
เริ่มต้น
begin()
จุดแรกเข้าจะเริ่มการดำเนินการเข้ารหัสโดยใช้คีย์ที่ระบุเพื่อวัตถุประสงค์ที่ระบุพร้อมพารามิเตอร์ที่ระบุ (ตามความเหมาะสม) โดยจะแสดงออบเจ็กต์ IKeyMintOperation
Binder ใหม่
ซึ่งใช้เพื่อดำเนินการให้เสร็จสมบูรณ์ นอกจากนี้ ระบบยังแสดงค่า Challenge ที่ใช้เป็นส่วนหนึ่งของโทเค็นการตรวจสอบสิทธิ์ในการดำเนินการที่ตรวจสอบสิทธิ์แล้วด้วย
การติดตั้งใช้งาน KeyMint รองรับการดำเนินการพร้อมกันอย่างน้อย 16 รายการ
Keystore ใช้สูงสุด 15 รายการ โดยเหลือไว้ 1 รายการสำหรับ 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
อย่างน้อย 1 ค่า และไม่มีค่า Tag::AUTH_TIMEOUT
ในกรณีนี้ คีย์ต้องมีการให้สิทธิ์ต่อการดำเนินการ และเมธอด update()
หรือ finish()
จะรับโทเค็นการให้สิทธิ์ในอาร์กิวเมนต์ authToken
การติดตั้งใช้งาน KeyMint ต้องมีลักษณะดังนี้เพื่อให้มั่นใจว่าโทเค็นถูกต้อง
- ยืนยันลายเซ็น HMAC ในโทเค็นการตรวจสอบสิทธิ์
- ตรวจสอบว่าโทเค็นมีรหัสผู้ใช้ที่ปลอดภัยซึ่งตรงกับรหัสที่เชื่อมโยงกับคีย์
- ตรวจสอบว่าประเภทการให้สิทธิ์ของโทเค็นตรงกับ
Tag::USER_AUTH_TYPE
ของคีย์ - ตรวจสอบว่าโทเค็นมีค่าของคำท้าสำหรับการดำเนินการปัจจุบันใน ฟิลด์คำท้า
หากไม่เป็นไปตามเงื่อนไขเหล่านี้ KeyMint
จะแสดงผล ErrorCode::KEY_USER_NOT_AUTHENTICATED
ผู้โทรจะระบุโทเค็นการตรวจสอบสิทธิ์ในการโทรทุกครั้งไปยัง update()
และ
finish()
การติดตั้งใช้งานจะตรวจสอบโทเค็นได้เพียงครั้งเดียว