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