หน้านี้ให้รายละเอียดเพื่อช่วยผู้ติดตั้งใช้งาน Keymaster เลเยอร์การแยกแยะฮาร์ดแวร์ (HAL) ซึ่งครอบคลุมฟังก์ชันแต่ละรายการใน API, แสดงเวอร์ชัน Keymaster ที่ฟังก์ชันพร้อมใช้งาน และอธิบายการใช้งานเริ่มต้น ดูแท็กได้ที่หน้าแท็กการให้สิทธิ์ Keymaster
หลักเกณฑ์การติดตั้งใช้งานทั่วไป
หลักเกณฑ์ต่อไปนี้ใช้กับฟังก์ชันทั้งหมดใน API
พารามิเตอร์เคอร์เซอร์อินพุต
เวอร์ชัน: 1, 2
พารามิเตอร์เคอร์เซอร์อินพุตที่ไม่ได้ใช้กับการเรียกหนึ่งๆ อาจมีค่าเป็น NULL
ผู้โทรไม่จำเป็นต้องระบุตัวยึดตำแหน่ง
ตัวอย่างเช่น ประเภทและโหมดคีย์บางประเภทอาจไม่ใช้ค่าใดๆ จากอาร์กิวเมนต์ inParams
ไปยัง begin
ดังนั้นผู้เรียกอาจตั้งค่า inParams
เป็น NULL
หรือระบุชุดพารามิเตอร์ว่าง ผู้เรียกยังระบุพารามิเตอร์ที่ไม่ได้ใช้ได้ด้วย และเมธอด Keymaster ไม่ควรแสดงข้อผิดพลาด
หากพารามิเตอร์อินพุตที่ต้องระบุคือ NULL
วิธีการของ Keymaster ควรแสดงผลเป็น
ErrorCode::UNEXPECTED_NULL_POINTER
ตั้งแต่ Keymaster 3 เป็นต้นไปจะไม่มีพารามิเตอร์เคอร์เซอร์ พารามิเตอร์ทั้งหมดจะส่งผ่านตามค่าหรือการอ้างอิง const
พารามิเตอร์พอยน์เตอร์เอาต์พุต
เวอร์ชัน: 1, 2
พารามิเตอร์พอยน์เตอร์เอาต์พุตที่ไม่ได้ใช้อาจมีค่าเป็น NULL
ซึ่งคล้ายกับพารามิเตอร์พอยน์เตอร์อินพุต หากเมธอดต้องแสดงผลข้อมูลในพารามิเตอร์เอาต์พุตที่พบว่าเป็น NULL
ก็ควรแสดงผลเป็น ErrorCode::OUTPUT_PARAMETER_NULL
ตั้งแต่ Keymaster 3 เป็นต้นไปจะไม่มีพารามิเตอร์เคอร์เซอร์ พารามิเตอร์ทั้งหมดจะส่งผ่านด้วยค่าหรือการอ้างอิง const
การใช้ API ในทางที่ผิด
เวอร์ชัน: 1, 2, 3
ผู้โทรอาจส่งคำขอที่ไม่สมเหตุสมผลหรือไร้สาระได้หลายวิธี แต่ไม่ได้ผิดทางเทคนิค การติดตั้งใช้งาน Keymaster ไม่จำเป็นต้องล้มเหลวหรือแสดงการวินิจฉัยในกรณีเช่นนี้ การใช้คีย์ที่มีขนาดเล็กเกินไป การระบุพารามิเตอร์อินพุตที่ไม่เกี่ยวข้อง การใช้ IV หรือ Nonce ซ้ำ การสร้างคีย์ที่ไม่มีจุดประสงค์ และอื่นๆ ไม่ควรได้รับการวินิจฉัยจากการใช้งาน คุณต้องวินิจฉัยการละเว้นพารามิเตอร์ที่จำเป็น ข้อกำหนดของพารามิเตอร์ที่จำเป็นที่ไม่ถูกต้อง และข้อผิดพลาดที่คล้ายกัน
แอป เฟรมเวิร์ก และคีย์สโตร์ของ Android มีหน้าที่รับผิดชอบในการตรวจสอบว่าการเรียกใช้โมดูล Keymaster นั้นสมเหตุสมผลและมีประโยชน์
ฟังก์ชัน
getHardwareFeatures
เวอร์ชัน: 3
วิธีการ getHardwareFeatures
ใหม่จะแสดงลักษณะที่สำคัญบางอย่างของฮาร์ดแวร์ที่มีการรักษาความปลอดภัยที่อยู่เบื้องหลังแก่ลูกค้า
เมธอดนี้ไม่ใช้อาร์กิวเมนต์และแสดงผล 4 ค่า ซึ่งเป็นบูลีนทั้งหมด ดังนี้
isSecure
คือtrue
หากคีย์จัดเก็บไว้ในฮาร์ดแวร์ที่มีความปลอดภัย (เช่น TEE) และไม่มีการส่งออกsupportsEllipticCurve
คือtrue
หากฮาร์ดแวร์รองรับการเข้ารหัสด้วยเวกเตอร์รูปไข่ที่มีเวกเตอร์ NIST (P-224, P-256, P-384 และ P-521)supportsSymmetricCryptography
คือtrue
หากฮาร์ดแวร์รองรับการเข้ารหัสแบบสมมาตร ซึ่งรวมถึง AES และ HMACsupportsAttestation
คือtrue
หากฮาร์ดแวร์รองรับการสร้างใบรับรองการรับรองคีย์สาธารณะของ Keymaster ซึ่งลงนามด้วยคีย์ที่แทรกในสภาพแวดล้อมที่ปลอดภัย
รหัสข้อผิดพลาดเพียงรายการเดียวที่เมธอดนี้จะแสดงผลได้คือ ErrorCode:OK
,
ErrorCode::KEYMASTER_NOT_CONFIGURED
หรือรหัสข้อผิดพลาดรายการใดรายการหนึ่งซึ่งบ่งบอกว่าสื่อสารกับฮาร์ดแวร์ที่ไม่ปลอดภัยไม่สำเร็จ
getHardwareFeatures() generates(bool isSecure, bool supportsEllipticCurve, bool supportsSymmetricCryptography, bool supportsAttestation, bool supportsAllDigests, string keymasterName, string keymasterAuthorName);
กำหนดค่า
เวอร์ชัน: 2
ฟังก์ชันนี้เปิดตัวใน Keymaster 2 และเลิกใช้งานใน Keymaster 3 เนื่องจากข้อมูลนี้มีอยู่ในไฟล์พร็อพเพอร์ตี้ของระบบ และการใช้งานของผู้ผลิตจะอ่านไฟล์เหล่านั้นระหว่างการเริ่มต้น
กำหนดค่า Keymaster ระบบจะเรียกใช้เมธอดนี้ 1 ครั้งหลังจากเปิดอุปกรณ์และก่อนที่จะมีการใช้งาน ใช้เพื่อระบุ KM_TAG_OS_VERSION
และ KM_TAG_OS_PATCHLEVEL
ให้กับ Keymaster จนกว่าจะมีการเรียกใช้เมธอดนี้ เมธอดอื่นๆ ทั้งหมดจะแสดงผลเป็น KM_ERROR_KEYMASTER_NOT_CONFIGURED
คีย์มาสเตอร์จะยอมรับค่าที่ได้จากวิธีนี้เพียงครั้งเดียวต่อการบูต การเรียกใช้ครั้งต่อๆ ไปจะแสดงผลลัพธ์เป็น KM_ERROR_OK
แต่ไม่ทําการใดๆ
หากการติดตั้งใช้งาน Keymaster อยู่ในฮาร์ดแวร์ที่มีความปลอดภัย และค่าเวอร์ชันระบบปฏิบัติการและระดับแพตช์ที่ระบุไม่ตรงกับค่าที่บูตโหลดเดอร์ระบุไว้ในฮาร์ดแวร์ที่มีความปลอดภัย (หรือหากบูตโหลดเดอร์ไม่ได้ระบุค่า) วิธีการนี้จะแสดงผลเป็น KM_ERROR_INVALID_ARGUMENT
และวิธีการอื่นๆ ทั้งหมดจะแสดงผลเป็น KM_ERROR_KEYMASTER_NOT_CONFIGURED
ต่อไป
keymaster_error_t (*configure)(const struct keymaster2_device* dev, const keymaster_key_param_set_t* params);
addRngEntropy
เวอร์ชัน: 1, 2, 3
ฟังก์ชันนี้เปิดตัวใน Keymaster 1 โดยใช้ชื่อว่า add_rng_entropy
และเปลี่ยนชื่อใน Keymaster 3
เพิ่มข้อมูลความผันผวนของผู้เรียกไปยังพูลที่ใช้โดยการติดตั้งใช้งาน Keymaster 1 เพื่อใช้สร้างตัวเลขสุ่ม สําหรับคีย์ IV และอื่นๆ
การติดตั้งใช้งาน Keymaster ต้องผสมข้อมูลสุ่มที่ระบุไว้ในพูลอย่างปลอดภัย ซึ่งต้องประกอบด้วยข้อมูลสุ่มที่สร้างขึ้นภายในจากเครื่องมือสร้างตัวเลขสุ่มของฮาร์ดแวร์ด้วย
ควรจัดการการผสมเพื่อให้ผู้โจมตีที่มีการควบคุมอย่างสมบูรณ์ของบิตที่ addRngEntropy
ให้มาหรือบิตที่ฮาร์ดแวร์สร้างขึ้น (แต่ไม่ใช่ทั้ง 2 อย่าง) ไม่มีข้อได้เปรียบที่ไม่ควรมองข้ามในการคาดเดาบิตที่สร้างขึ้นจากพูลข้อมูลสุ่ม
การติดตั้งใช้งาน Keymaster ที่พยายามประมาณความผันผวนในพูลภายในจะถือว่าข้อมูลจากaddRngEntropy
ไม่มีความผันผวน การใช้งาน Keymaster อาจแสดงผล ErrorCode::INVALID_INPUT_LENGTH
หากได้รับข้อมูลมากกว่า 2 KiB ในการเรียกใช้ครั้งเดียว
generateKey
เวอร์ชัน: 1, 2, 3
ฟังก์ชันนี้เปิดตัวใน Keymaster 1 โดยใช้ชื่อว่า generate_key
และเปลี่ยนชื่อใน Keymaster 3
สร้างคีย์การเข้ารหัสใหม่ โดยระบุการให้สิทธิ์ที่เกี่ยวข้องซึ่งเชื่อมโยงกับคีย์อย่างถาวร การติดตั้งใช้งาน Keymaster ทําให้ใช้คีย์ในลักษณะที่ไม่สอดคล้องกับการให้สิทธิ์ที่ระบุไว้ ณ เวลาสร้างไม่ได้ ในส่วนของการให้สิทธิ์ที่ฮาร์ดแวร์ที่มีความปลอดภัยไม่สามารถบังคับใช้ ภาระหน้าที่ของฮาร์ดแวร์ดังกล่าวจะจำกัดอยู่ที่การตรวจสอบว่าการให้สิทธิ์ที่บังคับใช้ไม่ได้ซึ่งเชื่อมโยงกับคีย์นั้นไม่สามารถแก้ไขได้ เพื่อให้การเรียกใช้ getKeyCharacteristics
ทุกครั้งแสดงค่าเดิม นอกจากนี้ ลักษณะที่ generateKey
แสดงจะจัดสรรการให้สิทธิ์อย่างถูกต้องระหว่างรายการที่บังคับใช้ฮาร์ดแวร์และรายการที่บังคับใช้ซอฟต์แวร์ ดูรายละเอียดเพิ่มเติมได้ที่ getKeyCharacteristics
พารามิเตอร์ที่ระบุให้กับ generateKey
จะขึ้นอยู่กับประเภทของคีย์ที่กำลังสร้างขึ้น ส่วนนี้จะสรุปแท็กที่จำเป็นและที่ไม่บังคับสำหรับคีย์แต่ละประเภท Tag::ALGORITHM
ต้องระบุเสมอเพื่อระบุประเภท
คีย์ RSA
ต้องระบุพารามิเตอร์ต่อไปนี้เพื่อสร้างคีย์ RSA
Tag::KEY_SIZE
ระบุขนาดของโมดูลัสสาธารณะเป็นบิต หากไม่ระบุ เมธอดจะแสดงผลErrorCode::UNSUPPORTED_KEY_SIZE
ค่าที่รองรับคือ 1024, 2048, 3072 และ 4096 ค่าที่แนะนำคือขนาดคีย์ทั้งหมดที่หารด้วย 8 ได้Tag::RSA_PUBLIC_EXPONENT
ระบุค่าตัวคูณสาธารณะของ RSA หากไม่ระบุ เมธอดจะแสดงผลErrorCode::INVALID_ARGUMENT
ค่าที่รองรับคือ 3 และ 65537 ค่าที่แนะนำคือค่าจำนวนเฉพาะทั้งหมดที่ไม่เกิน 2^64
พารามิเตอร์ต่อไปนี้ไม่จำเป็นต่อการสร้างคีย์ RSA แต่การสร้างคีย์ RSA โดยไม่มีพารามิเตอร์เหล่านี้จะทำให้คีย์ใช้งานไม่ได้ อย่างไรก็ตาม ฟังก์ชัน generateKey
จะไม่แสดงผลข้อผิดพลาดหากไม่ระบุพารามิเตอร์เหล่านี้
Tag::PURPOSE
ระบุวัตถุประสงค์ที่อนุญาต คีย์ RSA ต้องรองรับวัตถุประสงค์ทั้งหมดในชุดค่าผสมใดก็ได้Tag::DIGEST
ระบุอัลกอริทึมข้อมูลสรุปที่ใช้ได้กับคีย์ใหม่ การติดตั้งใช้งานที่ไม่รองรับอัลกอริทึมข้อมูลสรุปทั้งหมดต้องยอมรับคําขอสร้างคีย์ที่มีข้อมูลสรุปที่ไม่รองรับ ควรใส่ข้อมูลสรุปที่ไม่รองรับไว้ในรายการที่บังคับใช้โดยซอฟต์แวร์ในลักษณะคีย์ที่แสดงผล เนื่องจากคีย์ดังกล่าวใช้ได้กับข้อมูลสรุปอื่นๆ แต่การสรุปข้อมูลจะดำเนินการในซอฟต์แวร์ จากนั้นระบบจะเรียกใช้ฮาร์ดแวร์เพื่อดำเนินการกับDigest::NONE
Tag::PADDING
ระบุโหมดการเติมที่ใช้กับคีย์ใหม่ได้ การใช้งานที่ไม่รองรับอัลกอริทึมข้อมูลสรุปทั้งหมดต้องใส่PaddingMode::RSA_PSS
และPaddingMode::RSA_OAEP
ในรายการลักษณะสำคัญของคีย์ที่บังคับใช้โดยซอฟต์แวร์ หากระบุอัลกอริทึมข้อมูลสรุปที่ไม่รองรับ
คีย์ ECDSA
มีเพียง Tag::KEY_SIZE
เท่านั้นที่จําเป็นต่อการสร้างคีย์ ECDSA ใช้แท็กนี้เพื่อเลือกกลุ่ม EC
ค่าที่รองรับคือ 224, 256, 384 และ 521 ซึ่งแสดงถึงโค้ง NIST p-224, p-256, p-384 และ p521 ตามลำดับ
Tag::DIGEST
ยังเป็นสิ่งจําเป็นสําหรับคีย์ ECDSA ที่มีประโยชน์ด้วย แต่ก็ไม่จำเป็นต้องใช้ในการสร้าง
คีย์ AES
คุณต้องใช้เพียง Tag::KEY_SIZE
เพื่อสร้างคีย์ AES หากไม่ระบุ เมธอดจะแสดงผล ErrorCode::UNSUPPORTED_KEY_SIZE
ค่าที่รองรับคือ 128 และ 256 โดยรองรับคีย์ AES 192 บิต (ไม่บังคับ)
พารามิเตอร์ต่อไปนี้เกี่ยวข้องกับคีย์ AES โดยเฉพาะ แต่ไม่จำเป็นต้องสร้าง
Tag::BLOCK_MODE
ระบุโหมดบล็อกที่ใช้กับคีย์ใหม่ได้Tag::PADDING
ระบุโหมดการเติมที่สามารถใช้ ตัวเลือกนี้ใช้ได้กับโหมด ECB และ CBC เท่านั้น
หากระบุโหมดบล็อก GCM ให้ระบุ Tag::MIN_MAC_LENGTH
หากไม่ระบุ เมธอดจะแสดงผล ErrorCode::MISSING_MIN_MAC_LENGTH
ค่าของแท็กต้องเป็นแบบหลายของ 8 และอยู่ระหว่าง 96 ถึง 128
คีย์ HMAC
ต้องระบุพารามิเตอร์ต่อไปนี้สำหรับการสร้างคีย์ HMAC
Tag::KEY_SIZE
ระบุขนาดคีย์เป็นบิต ระบบไม่รองรับค่าที่น้อยกว่า 64 และค่าที่ไม่ใช่จำนวนที่คูณด้วย 8 ระบบรองรับจำนวนที่หารด้วย 8 ทั้งหมดตั้งแต่ 64 ถึง 512 ระบบอาจรองรับค่าที่มากกว่าTag::MIN_MAC_LENGTH
ระบุความยาวขั้นต่ำของ MAC ที่สามารถสร้างหรือตรวจสอบได้ด้วยคีย์นี้ ค่าเป็นจํานวนเต็มหารด้วย 8 และอย่างน้อย 64Tag::DIGEST
ระบุอัลกอริทึมไดเจสต์สำหรับคีย์ ระบุไฟล์สรุปเพียงไฟล์เดียว มิเช่นนั้นระบบจะแสดงErrorCode::UNSUPPORTED_DIGEST
หาก Trustlet ไม่รองรับข้อมูลสรุป ให้แสดงErrorCode::UNSUPPORTED_DIGEST
ลักษณะสำคัญ
หากอาร์กิวเมนต์ลักษณะไม่ใช่ NULL
generateKey
จะแสดงลักษณะของคีย์ที่สร้างขึ้นใหม่โดยแบ่งออกเป็นรายการที่บังคับใช้ฮาร์ดแวร์และรายการที่บังคับใช้ซอฟต์แวร์อย่างเหมาะสม ดูคำอธิบายลักษณะที่ควรอยู่ในรายการใดได้ที่
getKeyCharacteristics
ลักษณะที่แสดงผลจะรวมพารามิเตอร์ทั้งหมดที่ระบุไว้สำหรับการสร้างคีย์ ยกเว้น Tag::APPLICATION_ID
และ Tag::APPLICATION_DATA
หากแท็กเหล่านี้รวมอยู่ในพารามิเตอร์คีย์ ระบบจะนำแท็กเหล่านี้ออกจากลักษณะที่ปรากฏขึ้นเพื่อไม่ให้ค้นหาค่าของแท็กได้โดยการตรวจสอบ Blob คีย์ที่แสดง อย่างไรก็ตาม ค่าเหล่านี้จะเชื่อมโยงกับบล็อกคีย์แบบเข้ารหัส ดังนั้นหากไม่ได้ระบุค่าที่ถูกต้องเมื่อใช้คีย์ การใช้งานจะดำเนินการไม่สำเร็จ ในทำนองเดียวกัน Tag::ROOT_OF_TRUST
จะเชื่อมโยงกับคีย์แบบเข้ารหัส แต่ไม่สามารถระบุในระหว่างการสร้างหรือนําเข้าคีย์ และระบบจะไม่แสดงผลคีย์ดังกล่าว
นอกจากแท็กที่ระบุแล้ว ทรัสต์เลตจะเพิ่ม Tag::ORIGIN
ด้วยค่า KeyOrigin::GENERATED
และหากคีย์ป้องกันการย้อนกลับ Tag::ROLLBACK_RESISTANT
ป้องกันการย้อนกลับ
การป้องกันการย้อนกลับหมายความว่าเมื่อมีการลบคีย์ด้วย deleteKey
หรือ deleteAllKeys
ฮาร์ดแวร์ที่มีความปลอดภัยจะรับประกันว่าคีย์ดังกล่าวจะใช้ไม่ได้อีก การติดตั้งใช้งานที่ไม่มีการป้องกันการย้อนกลับมักจะแสดงเนื้อหาคีย์ที่สร้างขึ้นหรือนําเข้าต่อผู้เรียกใช้เป็น Blob ของคีย์ ซึ่งเป็นรูปแบบที่เข้ารหัสและตรวจสอบสิทธิ์แล้ว เมื่อคีย์สโตร์ลบบล็อกคีย์แล้ว คีย์จะหายไป แต่ผู้โจมตีที่ก่อนหน้านี้สามารถดึงข้อมูลวัสดุคีย์ได้อาจกู้คืนข้อมูลดังกล่าวลงในอุปกรณ์ได้
คีย์จะป้องกันการย้อนกลับได้หากฮาร์ดแวร์ที่มีความปลอดภัยรับประกันว่าคีย์ที่ลบไปแล้วจะกู้คืนไม่ได้ในภายหลัง ซึ่งโดยทั่วไปจะทําโดยการเก็บข้อมูลเมตาเพิ่มเติมของคีย์ไว้ในตำแหน่งที่เชื่อถือได้ซึ่งผู้โจมตีไม่สามารถดัดแปลงได้ ในอุปกรณ์เคลื่อนที่ กลไกที่ใช้มักจะเป็น Replay Protected Memory Blocked (RPMB) เนื่องจากจำนวนคีย์ที่สร้างได้นั้นไม่มีขีดจำกัด และพื้นที่เก็บข้อมูลที่เชื่อถือได้ซึ่งใช้เพื่อป้องกันการย้อนกลับอาจมีขนาดจำกัด วิธีนี้จึงต้องดำเนินการให้สำเร็จแม้ว่าจะไม่สามารถระบุการป้องกันการย้อนกลับสำหรับคีย์ใหม่ได้ก็ตาม ในกรณีนี้ ไม่ควรเพิ่ม Tag::ROLLBACK_RESISTANT
ลงในคุณลักษณะหลัก
getKeyCharacteristics
เวอร์ชัน: 1, 2, 3
ฟังก์ชันนี้เปิดตัวใน Keymaster 1 โดยใช้ชื่อว่า get_key_characteristics
และเปลี่ยนชื่อใน Keymaster 3
ส่งคืนพารามิเตอร์และการให้สิทธิ์ที่เชื่อมโยงกับคีย์ที่ระบุ ซึ่งแบ่งออกเป็น 2 ชุด ได้แก่ ชุดที่บังคับใช้ฮาร์ดแวร์และชุดที่บังคับใช้ซอฟต์แวร์ คําอธิบายนี้มีผลกับรายการลักษณะเด่นที่ generateKey
และ importKey
แสดงผลเท่าๆ กัน
หากระบุ Tag::APPLICATION_ID
ในระหว่างการสร้างหรือนําเข้าคีย์ ระบบจะส่งค่าเดียวกันให้กับเมธอดนี้ในอาร์กิวเมนต์ clientId
ไม่เช่นนั้น เมธอดจะแสดงผล ErrorCode::INVALID_KEY_BLOB
ในทํานองเดียวกัน หากระบุ Tag::APPLICATION_DATA
ในระหว่างการสร้างหรือนําเข้า ระบบจะส่งค่าเดียวกันให้กับเมธอดนี้ในอาร์กิวเมนต์ appData
ลักษณะที่แสดงผลโดยเมธอดนี้จะอธิบายประเภทและการใช้งานของคีย์ที่ระบุอย่างครบถ้วน
กฎทั่วไปในการตัดสินว่าแท็กหนึ่งๆ อยู่ในรายการที่บังคับใช้ฮาร์ดแวร์หรือซอฟต์แวร์หรือไม่คือ หากความหมายของแท็กได้รับการรับรองโดยสมบูรณ์จากฮาร์ดแวร์ที่มีความปลอดภัย แท็กดังกล่าวจะอยู่ในรายการที่บังคับใช้ฮาร์ดแวร์ มิฉะนั้น ระบบจะใช้นโยบายกับซอฟต์แวร์ ด้านล่างนี้คือรายการแท็กที่เฉพาะเจาะจงซึ่งอาจมีการกําหนดค่าที่ไม่ชัดเจน
Tag::ALGORITHM
,Tag::KEY_SIZE
และTag::RSA_PUBLIC_EXPONENT
เป็นคุณสมบัติพื้นฐานของคีย์ สำหรับคีย์ที่ปลอดภัยด้วยฮาร์ดแวร์ แท็กเหล่านี้จะอยู่ในรายการที่บังคับใช้ฮาร์ดแวร์- ค่า
Tag::DIGEST
ที่ฮาร์ดแวร์ปลอดภัยรองรับจะอยู่ในรายการที่ฮาร์ดแวร์รองรับ ส่วนไดเจสต์ที่ไม่รองรับจะอยู่ในรายการที่ซอฟต์แวร์รองรับ - ค่า
Tag::PADDING
โดยทั่วไปจะอยู่ในรายการที่ฮาร์ดแวร์รองรับ เว้นแต่ว่ามีความเป็นไปได้ที่ซอฟต์แวร์อาจต้องดำเนินการในโหมดการถ่วงน้ำหนักที่เฉพาะเจาะจง ในกรณีนี้ รายการดังกล่าวจะอยู่ในรายการที่บังคับใช้โดยซอฟต์แวร์ ปัญหาดังกล่าวอาจเกิดขึ้นกับคีย์ RSA ที่อนุญาตให้มีการเพิ่มค่าให้กับ PSS หรือ OAEP ด้วยอัลกอริทึมข้อมูลสรุปที่ฮาร์ดแวร์ปลอดภัยไม่รองรับ Tag::USER_SECURE_ID
และTag::USER_AUTH_TYPE
จะใช้กับฮาร์ดแวร์ก็ต่อเมื่อมีการบังคับใช้การตรวจสอบสิทธิ์ผู้ใช้กับฮาร์ดแวร์เท่านั้น ในการทำเช่นนี้ ทั้ง Trustlet ของ Keymaster และ Trustlet การตรวจสอบสิทธิ์ที่เกี่ยวข้องต้องปลอดภัยและแชร์คีย์ HMAC ลับที่ใช้ลงชื่อและตรวจสอบโทเค็นการตรวจสอบสิทธิ์ ดูรายละเอียดได้ในหน้าการตรวจสอบสิทธิ์- แท็ก
Tag::ACTIVE_DATETIME
,Tag::ORIGINATION_EXPIRE_DATETIME
และTag::USAGE_EXPIRE_DATETIME
ต้องเข้าถึงนาฬิกาตั้งโต๊ะที่ถูกต้องซึ่งตรวจสอบได้ ฮาร์ดแวร์ที่ปลอดภัยที่สุดมีสิทธิ์เข้าถึงเฉพาะข้อมูลเวลาที่ได้รับจากระบบปฏิบัติการที่ไม่ปลอดภัย ซึ่งหมายความว่าแท็กจะบังคับใช้โดยซอฟต์แวร์ Tag::ORIGIN
จะอยู่ในรายการฮาร์ดแวร์สำหรับคีย์ที่เชื่อมโยงกับฮาร์ดแวร์เสมอ การที่รายการดังกล่าวอยู่ในรายการนั้นคือวิธีที่เลเยอร์ระดับสูงขึ้นใช้พิจารณาว่าคีย์ได้รับการสนับสนุนจากฮาร์ดแวร์
importKey
เวอร์ชัน: 1, 2, 3
ฟังก์ชันนี้เปิดตัวใน Keymaster 1 โดยใช้ชื่อว่า import_key
และเปลี่ยนชื่อใน Keymaster 3
นําเข้าเนื้อหาคีย์ไปยังฮาร์ดแวร์ Keymaster ระบบจะจัดการพารามิเตอร์การกําหนดคีย์และลักษณะเอาต์พุตเหมือนกับสําหรับ generateKey
โดยมีข้อยกเว้นต่อไปนี้
Tag::KEY_SIZE
และTag::RSA_PUBLIC_EXPONENT
(สำหรับคีย์ RSA เท่านั้น) ไม่จำเป็นต้องระบุในพารามิเตอร์อินพุต หากไม่ได้ระบุไว้ ข้อมูลนี้จะอนุมานค่าจากเนื้อหาคีย์ที่ระบุและเพิ่มแท็กและค่าที่เหมาะสมลงในลักษณะคีย์ หากระบุพารามิเตอร์ไว้ ทรัสต์เลตจะตรวจสอบพารามิเตอร์เหล่านั้นเทียบกับเนื้อหาคีย์ ในกรณีที่ไม่ตรงกัน เมธอดจะแสดงผลErrorCode::IMPORT_PARAMETER_MISMATCH
Tag::ORIGIN
ที่แสดงผลมีค่าเดียวกับKeyOrigin::IMPORTED
exportKey
เวอร์ชัน: 1, 2, 3
ฟังก์ชันนี้เปิดตัวใน Keymaster 1 โดยใช้ชื่อว่า export_key
และเปลี่ยนชื่อใน Keymaster 3
ส่งออกคีย์สาธารณะจากคู่คีย์ RSA หรือ EC ของ Keymaster
หากระบุ Tag::APPLICATION_ID
ไว้ในระหว่างการสร้างหรือนําเข้าคีย์ ระบบจะส่งค่าเดียวกันไปยังเมธอดนี้ในอาร์กิวเมนต์ clientId
ไม่เช่นนั้น เมธอดจะแสดงผล ErrorCode::INVALID_KEY_BLOB
ในทํานองเดียวกัน หากมีการระบุ Tag::APPLICATION_DATA
ในระหว่างการสร้างหรือนําเข้า ระบบจะระบุค่าเดียวกันให้กับเมธอดนี้ในอาร์กิวเมนต์ appData
deleteKey
เวอร์ชัน: 1, 2, 3
ฟังก์ชันนี้เปิดตัวใน Keymaster 1 โดยใช้ชื่อว่า delete_key
และเปลี่ยนชื่อใน Keymaster 3
ลบคีย์ที่ระบุ วิธีการนี้ไม่บังคับและจะใช้ได้เฉพาะกับโมดูล Keymaster ที่ป้องกันการย้อนกลับเท่านั้น
deleteAllKeys
เวอร์ชัน: 1, 2, 3
ฟังก์ชันนี้เปิดตัวใน Keymaster 1 โดยใช้ชื่อว่า delete_all_keys
และเปลี่ยนชื่อใน Keymaster 3
ลบคีย์ทั้งหมด วิธีการนี้เป็นตัวเลือกและจะใช้ได้ก็ต่อเมื่อติดตั้งใช้งานโดยโมดูล Keymaster ที่ป้องกันการย้อนกลับเท่านั้น
destroyAttestationIds
เวอร์ชัน: 3
ระบบจะใช้เมธอด destroyAttestationIds()
เพื่อปิดใช้ฟีเจอร์การรับรองผ่านบัตรประจำตัวใหม่ (ไม่บังคับแต่แนะนำอย่างยิ่ง) เป็นการถาวร หาก TEE ไม่มีวิธีตรวจสอบว่าการรับรองผ่านบัตรประจำตัวถูกปิดใช้อย่างถาวรหลังจากเรียกใช้เมธอดนี้ จะต้องไม่ใช้การรับรองผ่านบัตรประจำตัวเลย ซึ่งในกรณีนี้เมธอดนี้จะไม่ทําการใดๆ และแสดงผลเป็น ErrorCode::UNIMPLEMENTED
หากระบบรองรับการรับรองผ่านบัตรประจำตัว คุณต้องใช้วิธีนี้และปิดใช้การพยายามรับรองผ่านบัตรประจำตัวทั้งหมดในอนาคตอย่างถาวร เรียกเมธอดได้กี่ครั้งก็ได้ หากปิดใช้การรับรองผ่านบัตรประจำตัวอย่างถาวรแล้ว เมธอดจะไม่ดำเนินการใดๆ และแสดงผลลัพธ์เป็น ErrorCode::OK
รหัสข้อผิดพลาดเพียงรายการเดียวที่เมธอดนี้จะแสดงผลได้คือ ErrorCode::UNIMPLEMENTED
(หากระบบไม่รองรับการรับรองผ่านบัตรประจำตัว) ErrorCode:OK
, ErrorCode::KEYMASTER_NOT_CONFIGURED
หรือรหัสข้อผิดพลาดที่ระบุว่าสื่อสารกับฮาร์ดแวร์ที่ไม่ปลอดภัยไม่สำเร็จ
เริ่มต้น
เวอร์ชัน: 1, 2, 3
เริ่มการดำเนินการเข้ารหัสโดยใช้คีย์ที่ระบุเพื่อวัตถุประสงค์ที่ระบุด้วยพารามิเตอร์ที่ระบุ (ตามความเหมาะสม) และแสดงผลแฮนเดิลการดำเนินการที่ใช้กับ update
และ finish
เพื่อดำเนินการให้เสร็จสมบูรณ์ นอกจากนี้ แฮนเดิลการดำเนินการยังใช้เป็นโทเค็นคำขอยืนยันในการดำเนินการที่ตรวจสอบสิทธิ์ และสำหรับการดำเนินการดังกล่าวจะรวมอยู่ในฟิลด์ challenge
ของโทเค็นการตรวจสอบสิทธิ์
การติดตั้งใช้งาน Keymaster รองรับการดำเนินการพร้อมกันอย่างน้อย 16 รายการ คีย์สโตร์ใช้ได้สูงสุด 15 รายการ โดยเหลือไว้ 1 รายการสำหรับ vold เพื่อใช้เข้ารหัสรหัสผ่าน เมื่อคีย์สโตร์มีการดำเนินการ 15 รายการที่อยู่ระหว่างดำเนินการ (มีการเรียกใช้ begin
แต่ยังไม่ได้เรียกใช้ finish
หรือ abort
) และได้รับคําขอเริ่มการดำเนินการที่ 16 ระบบจะเรียกใช้ abort
ในการดำเนินการที่ใช้ล่าสุดน้อยที่สุดเพื่อลดจำนวนการดำเนินการที่ใช้งานอยู่ให้เหลือ 14 รายการก่อนเรียกใช้ begin
เพื่อเริ่มการดำเนินการที่ขอใหม่
หากมีการระบุ Tag::APPLICATION_ID
หรือ Tag::APPLICATION_DATA
ในระหว่างการสร้างหรือนําเข้าคีย์ การเรียกใช้ begin
จะรวมแท็กเหล่านั้นที่มีค่าที่ระบุไว้ตั้งแต่แรกในอาร์กิวเมนต์ inParams
ไปยังเมธอดนี้
การบังคับใช้การให้สิทธิ์
ในระหว่างการใช้วิธีนี้ ทรัสต์เลตจะบังคับใช้การให้สิทธิ์คีย์ต่อไปนี้หากการติดตั้งใช้งานวางไว้ในลักษณะที่บังคับใช้ฮาร์ดแวร์ และหากการดำเนินการไม่ใช่การดำเนินการกับคีย์สาธารณะ อนุญาตให้การดำเนินการกับคีย์สาธารณะ ซึ่งได้แก่ KeyPurpose::ENCRYPT
และ KeyPurpose::VERIFY
ดำเนินการสำเร็จได้แม้ว่าจะไม่เป็นไปตามข้อกำหนดการให้สิทธิ์ก็ตาม
Tag::PURPOSE
: วัตถุประสงค์ที่ระบุในการเรียกใช้begin()
ต้องตรงกับวัตถุประสงค์อย่างใดอย่างหนึ่งในการให้สิทธิ์คีย์ เว้นแต่การดำเนินการที่ขอจะเป็นการดำเนินการกับคีย์สาธารณะ หากวัตถุประสงค์ที่ระบุไม่ตรงกันและการดำเนินการไม่ใช่การดำเนินการกับคีย์สาธารณะbegin
จะแสดงผลเป็นErrorCode::UNSUPPORTED_PURPOSE
การดำเนินการกับคีย์สาธารณะคือการเข้ารหัสแบบอสมมาตรหรือการยืนยันTag::ACTIVE_DATETIME
จะบังคับใช้ได้ก็ต่อเมื่อมีแหล่งที่มาของเวลา UTC ที่เชื่อถือได้ หากวันที่และเวลาปัจจุบันอยู่ก่อนค่าแท็ก เมธอดจะแสดงผลErrorCode::KEY_NOT_YET_VALID
Tag::ORIGINATION_EXPIRE_DATETIME
จะบังคับใช้ได้ก็ต่อเมื่อมีแหล่งที่มาของเวลา UTC ที่เชื่อถือได้ หากวันที่และเวลาปัจจุบันอยู่หลังค่าแท็กและวัตถุประสงค์คือKeyPurpose::ENCRYPT
หรือKeyPurpose::SIGN
วิธีการจะแสดงผลErrorCode::KEY_EXPIRED
Tag::USAGE_EXPIRE_DATETIME
จะบังคับใช้ได้ก็ต่อเมื่อมีแหล่งที่มาของเวลา UTC ที่เชื่อถือได้ หากวันที่และเวลาปัจจุบันอยู่หลังค่าแท็กและวัตถุประสงค์คือKeyPurpose::DECRYPT
หรือKeyPurpose::VERIFY
วิธีการจะแสดงผลErrorCode::KEY_EXPIRED
Tag::MIN_SECONDS_BETWEEN_OPS
เปรียบเทียบกับตัวจับเวลาแบบสัมพัทธ์ที่เชื่อถือได้ซึ่งระบุการใช้งานคีย์ครั้งล่าสุด หากเวลาใช้งานล่าสุดบวกค่าแท็กน้อยกว่าเวลาปัจจุบัน วิธีการจะแสดงผลErrorCode::KEY_RATE_LIMIT_EXCEEDED
ดูรายละเอียดการติดตั้งใช้งานที่สําคัญได้ในส่วนคําอธิบายแท็กTag::MAX_USES_PER_BOOT
จะเปรียบเทียบกับตัวนับที่ปลอดภัยซึ่งติดตามการใช้คีย์ตั้งแต่เวลาบูต หากจํานวนการใช้งานก่อนหน้านี้เกินค่าแท็ก วิธีการจะแสดงผลเป็นErrorCode::KEY_MAX_OPS_EXCEEDED
- ระบบจะใช้วิธีการนี้บังคับใช้
Tag::USER_SECURE_ID
เฉพาะในกรณีที่คีย์มีTag::AUTH_TIMEOUT
ด้วย หากคีย์มีทั้ง 2 รายการ วิธีนี้ต้องได้รับTag::AUTH_TOKEN
ที่ถูกต้องในinParams
เงื่อนไขต่อไปนี้ทั้งหมดต้องเป็นจริงเพื่อให้โทเค็นการตรวจสอบสิทธิ์ถูกต้อง- ช่อง HMAC ตรวจสอบถูกต้อง
- ค่าจากคีย์อย่างน้อย 1 ค่าตรงกับค่าบัตรประจำตัวที่ปลอดภัยอย่างน้อย 1 ค่าในโทเค็น
Tag::USER_SECURE_ID
- คีย์มี
Tag::USER_AUTH_TYPE
ที่ตรงกับประเภทการตรวจสอบสิทธิ์ในโทเค็น
หากไม่เป็นไปตามเงื่อนไขเหล่านี้ วิธีการจะแสดงผลเป็น
ErrorCode::KEY_USER_NOT_AUTHENTICATED
Tag::CALLER_NONCE
อนุญาตให้ผู้โทรระบุ Nonce หรือเวกเตอร์การเริ่มต้น (IV) หากคีย์ไม่มีแท็กนี้ แต่ผู้เรียกใช้ระบุTag::NONCE
ให้กับเมธอดนี้ ระบบจะแสดงผลErrorCode::CALLER_NONCE_PROHIBITED
Tag::BOOTLOADER_ONLY
ระบุว่ามีเพียงโปรแกรมโหลดบูตเท่านั้นที่ใช้คีย์ได้ หากเรียกใช้เมธอดนี้ด้วยคีย์สำหรับบูตโหลดเดอร์เท่านั้นหลังจากที่บูตโหลดเดอร์ทำงานเสร็จแล้ว ระบบจะแสดงผลเป็นErrorCode::INVALID_KEY_BLOB
คีย์ RSA
การดำเนินการกับคีย์ RSA ทั้งหมดจะระบุโหมดการเติมค่าเพียง 1 โหมดใน inParams
หากไม่ระบุหรือระบุมากกว่า 1 ครั้ง เมธอดจะแสดงผล ErrorCode::UNSUPPORTED_PADDING_MODE
การดำเนินการลงนามและการยืนยันด้วย RSA ต้องใช้ข้อมูลสรุป เช่นเดียวกับการเข้ารหัสและการถอดรหัส RSA ด้วยโหมดการเติม OAEP ในกรณีดังกล่าว ผู้เรียกใช้จะระบุข้อมูลสรุป 1 รายการใน inParams
หากไม่ระบุหรือระบุมากกว่า 1 ครั้ง เมธอดจะแสดงผล ErrorCode::UNSUPPORTED_DIGEST
การดำเนินการกับคีย์ส่วนตัว (KeyPurpose::DECYPT
และ KeyPurpose::SIGN
) ต้องได้รับสิทธิ์สำหรับข้อมูลสรุปและการเพิ่มค่า ซึ่งหมายความว่าการให้สิทธิ์คีย์ต้องมีค่าที่ระบุ หากไม่ วิธีการจะแสดงผลเป็น ErrorCode::INCOMPATIBLE_DIGEST
หรือ ErrorCode::INCOMPATIBLE_PADDING
ตามลำดับ อนุญาตให้ดำเนินการกับคีย์สาธารณะ (KeyPurpose::ENCRYPT
และ KeyPurpose::VERIFY
) ด้วยไดเจสต์หรือการเติมที่ไม่อนุญาต
ยกเว้น PaddingMode::NONE
โหมดการเติม RSA ทั้งหมดจะใช้ได้กับวัตถุประสงค์บางอย่างเท่านั้น กล่าวโดยละเอียดคือ PaddingMode::RSA_PKCS1_1_5_SIGN
และ PaddingMode::RSA_PSS
รองรับเฉพาะการรับรองและการยืนยัน ส่วน PaddingMode::RSA_PKCS1_1_1_5_ENCRYPT
และ PaddingMode::RSA_OAEP
รองรับเฉพาะการเข้ารหัสและการถอดรหัส
เมธอดจะแสดงผลเป็น ErrorCode::UNSUPPORTED_PADDING_MODE
หากโหมดที่ระบุไม่รองรับวัตถุประสงค์ที่ระบุ
การโต้ตอบที่สําคัญระหว่างโหมดการเติมและข้อมูลสรุปมีดังนี้
PaddingMode::NONE
บ่งบอกว่ามีการดำเนินการ RSA ดิบ หากมีการลงนามหรือการยืนยัน ระบบจะระบุDigest::NONE
สำหรับข้อมูลสรุป ไม่จำเป็นต้องใช้ข้อมูลสรุปสำหรับการเข้ารหัสหรือการถอดรหัสแบบไม่เพิ่มการเติมPaddingMode::RSA_PKCS1_1_5_SIGN
การเติมต้องระบุข้อมูลสรุป ข้อมูลสรุปอาจเป็นDigest::NONE
ในกรณีนี้ การติดตั้งใช้งาน Keymaster จะสร้างโครงสร้างลายเซ็น PKCS#1 v1.5 ที่เหมาะสมไม่ได้ เนื่องจากเพิ่มโครงสร้าง DigestInfo ไม่ได้ แต่การใช้งานจะสร้าง0x00 || 0x01 || PS || 0x00 || M
โดยที่ M คือข้อความที่ระบุและ PS คือสตริงการเติม ขนาดของคีย์ RSA ต้องใหญ่กว่าข้อความอย่างน้อย 11 ไบต์ มิฉะนั้นเมธอดจะแสดงผลเป็นErrorCode::INVALID_INPUT_LENGTH
PaddingMode::RSA_PKCS1_1_1_5_ENCRYPT
padding ไม่จำเป็นต้องใช้ข้อมูลสรุปPaddingMode::RSA_PSS
ต้องใส่ข้อมูลในตำแหน่งที่ต้องการให้เต็ม ซึ่งDigest::NONE
ไม่สามารถดำเนินการดังกล่าวได้ หากระบุDigest::NONE
เมธอดจะแสดงผลErrorCode::INCOMPATIBLE_DIGEST
นอกจากนี้ ขนาดของคีย์ RSA ต้องใหญ่กว่าขนาดเอาต์พุตของข้อมูลสรุปอย่างน้อย 2 + D ไบต์ โดยที่ D คือขนาดของข้อมูลสรุปเป็นไบต์ ไม่เช่นนั้น วิธีการจะแสดงผลErrorCode::INCOMPATIBLE_DIGEST
ขนาดของเกลือคือ DPaddingMode::RSA_OAEP
ต้องใส่ข้อมูลในตำแหน่งที่ต้องการให้เต็ม ซึ่งDigest::NONE
ไม่สามารถดำเนินการดังกล่าวได้ หากระบุDigest::NONE
เมธอดจะแสดงผลErrorCode::INCOMPATIBLE_DIGEST
คีย์ EC
การดำเนินการกับคีย์ EC จะระบุโหมดการเติมเต็มเพียง 1 โหมดใน inParams
หากไม่ระบุหรือระบุมากกว่า 1 ครั้ง เมธอดจะแสดงผล ErrorCode::UNSUPPORTED_PADDING_MODE
การดำเนินการกับคีย์ส่วนตัว (KeyPurpose::SIGN
) ต้องมีการให้สิทธิ์สำหรับข้อมูลสรุปและการเพิ่มค่า ซึ่งหมายความว่าการให้สิทธิ์คีย์ต้องมีค่าที่ระบุ หากไม่ ให้แสดงผล ErrorCode::INCOMPATIBLE_DIGEST
อนุญาตให้ดำเนินการกับคีย์สาธารณะ (KeyPurpose::VERIFY
) ที่มีข้อมูลสรุปหรือการเติมที่ไม่อนุญาต
คีย์ AES
การดำเนินการกับคีย์ AES จะระบุโหมดบล็อกและโหมดการเติมข้อมูลเพียง 1 โหมดเท่านั้นใน inParams
หากไม่ระบุค่าใดค่าหนึ่งหรือระบุมากกว่า 1 ครั้ง ระบบจะแสดงผล ErrorCode::UNSUPPORTED_BLOCK_MODE
หรือ ErrorCode::UNSUPPORTED_PADDING_MODE
โหมดที่ระบุต้องได้รับสิทธิ์จากคีย์ มิเช่นนั้นเมธอดจะแสดงผลเป็น ErrorCode::INCOMPATIBLE_BLOCK_MODE
หรือ ErrorCode::INCOMPATIBLE_PADDING_MODE
หากโหมดบล็อกคือ BlockMode::GCM
inParams
จะระบุ Tag::MAC_LENGTH
และค่าที่ระบุคือผลคูณของ 8 ซึ่งไม่เกิน 128 หรือน้อยกว่าค่าของ Tag::MIN_MAC_LENGTH
ในการให้สิทธิ์คีย์ สำหรับ MAC ที่มีความยาวมากกว่า 128 หรือไม่ใช่จำนวนที่คูณด้วย 8 ระบบจะแสดงผล ErrorCode::UNSUPPORTED_MAC_LENGTH
สำหรับค่าที่น้อยกว่าความยาวขั้นต่ำของคีย์ ระบบจะแสดงผล ErrorCode::INVALID_MAC_LENGTH
หากโหมดบล็อกคือ BlockMode::GCM
หรือ BlockMode::CTR
โหมดการเว้นวรรคที่ระบุต้องเป็น PaddingMode::NONE
สำหรับ BlockMode::ECB
หรือ BlockMode::CBC
โหมดอาจเป็นPaddingMode::NONE
หรือ PaddingMode::PKCS7
หากโหมดการเติมไม่ตรงตามเงื่อนไขเหล่านี้ ให้แสดงผล ErrorCode::INCOMPATIBLE_PADDING_MODE
หากโหมดบล็อกคือ BlockMode::CBC
, BlockMode::CTR
หรือ BlockMode::GCM
คุณจะต้องมีเวกเตอร์การเริ่มต้นหรือ Nonce
ในกรณีส่วนใหญ่ ผู้เรียกไม่ควรระบุ IV หรือ Nonce ในกรณีนี้ การใช้งาน Keymaster จะสร้าง IV หรือ Nonce แบบสุ่มและแสดงผลพร้อมกับ Tag::NONCE
ใน outParams
CBC และ CTR IV มีขนาด 16 ไบต์ ข้อมูลที่ไม่ซ้ำกันของ GCM มีความยาว 12 ไบต์ หากการให้สิทธิ์ของคีย์มี Tag::CALLER_NONCE
ผู้เรียกจะให้ IV หรือ Nonce ที่มี Tag::NONCE
ใน inParams
ได้ หากระบุ Nonce เมื่อ Tag::CALLER_NONCE
ไม่ได้รับอนุญาต ให้แสดงผล ErrorCode::CALLER_NONCE_PROHIBITED
หากไม่ได้ระบุ Nonce เมื่อมีการให้สิทธิ์ Tag::CALLER_NONCE
ให้สร้าง IV/Nonce แบบสุ่ม
คีย์ HMAC
การดำเนินการกับคีย์ HMAC จะระบุ Tag::MAC_LENGTH
ใน inParams
ค่าที่ระบุต้องเป็นแบบ 8 เท่าซึ่งไม่มากกว่าความยาวของข้อมูลสรุปหรือน้อยกว่าค่าของ Tag::MIN_MAC_LENGTH
ในการให้สิทธิ์คีย์ สำหรับความยาว MAC ที่มากกว่าความยาวของข้อมูลสรุปหรือไม่ใช่จำนวนที่หารด้วย 8 ได้ ระบบจะแสดงผล ErrorCode::UNSUPPORTED_MAC_LENGTH
สำหรับค่าที่น้อยกว่าความยาวขั้นต่ำของคีย์ ระบบจะแสดงผล ErrorCode::INVALID_MAC_LENGTH
อัปเดต
เวอร์ชัน: 1, 2, 3
ให้ข้อมูลเพื่อประมวลผลในการดำเนินการต่อเนื่องที่เริ่มต้นด้วย begin
พารามิเตอร์ operationHandle
จะระบุการดำเนินการ
การใช้งานวิธีการนี้จะมีตัวเลือกในการลดปริมาณข้อมูลที่ใช้ในการบัฟเฟอร์เพื่อให้จัดการบัฟเฟอร์ได้อย่างยืดหยุ่นมากขึ้น ผู้โทรมีหน้าที่รับผิดชอบในการวนเพื่อส่งข้อมูลที่เหลือในการเรียกใช้ครั้งต่อๆ ไป ระบบจะแสดงผลจํานวนอินพุตที่ใช้ในพารามิเตอร์ inputConsumed
การใช้งานจะใช้ไบต์อย่างน้อย 1 ไบต์เสมอ เว้นแต่การดำเนินการจะรับไบต์เพิ่มไม่ได้ หากระบุไบต์มากกว่า 0 ไบต์ แต่ใช้ไบต์ 0 ไบต์ ผู้เรียกใช้จะถือว่านี่เป็นข้อผิดพลาดและยกเลิกการดำเนินการ
การติดตั้งใช้งานยังเลือกปริมาณข้อมูลที่แสดงผลได้อีกด้วย ซึ่งเป็นผลมาจากการอัปเดต การดำเนินการนี้เกี่ยวข้องกับการดำเนินการเข้ารหัสและการถอดรหัสเท่านั้น เนื่องจากการลงนามและการยืนยันจะไม่แสดงข้อมูลจนกว่าจะมี finish
แสดงข้อมูลโดยเร็วที่สุดแทนที่จะบัฟเฟอร์ข้อมูล
การจัดการข้อผิดพลาด
หากเมธอดนี้แสดงผลรหัสข้อผิดพลาดที่ไม่ใช่ ErrorCode::OK
ระบบจะยกเลิกการดำเนินการและทำให้ตัวแฮนเดิลการดำเนินการใช้งานไม่ได้ การใช้แฮนเดิลในอนาคตด้วยเมธอดนี้ finish
หรือ abort
จะแสดงผลเป็น ErrorCode::INVALID_OPERATION_HANDLE
การบังคับใช้การให้สิทธิ์
การบังคับใช้การให้สิทธิ์คีย์จะดำเนินการใน begin
เป็นหลัก
ยกเว้นในกรณีที่คีย์มีลักษณะดังนี้
- มี
Tag::USER_SECURE_IDs
อย่างน้อย 1 รายการ - ไม่มี
Tag::AUTH_TIMEOUT
ในกรณีนี้ คีย์ต้องมีการให้สิทธิ์ต่อการดำเนินการ และเมธอดการอัปเดตจะได้รับ Tag::AUTH_TOKEN
ในอาร์กิวเมนต์ inParams
HMAC จะยืนยันว่าโทเค็นถูกต้องและมีรหัสผู้ใช้ที่ปลอดภัยที่ตรงกัน ตรงกับTag::USER_AUTH_TYPE
ของคีย์ และมีแฮนเดิลการดำเนินการของการดำเนินการปัจจุบันในช่อง challenge
หากไม่เป็นไปตามเงื่อนไขเหล่านี้ ให้แสดงผล
ErrorCode::KEY_USER_NOT_AUTHENTICATED
ผู้โทรจะระบุโทเค็นการตรวจสอบสิทธิ์ในการโทรทุกครั้งไปยัง update
และ finish
การติดตั้งใช้งานต้องตรวจสอบโทเค็นเพียงครั้งเดียว
คีย์ RSA
สำหรับการดำเนินการลงนามและการยืนยันด้วย Digest::NONE
วิธีนี้จะยอมรับการเซ็นชื่อหรือยืนยันทั้งบล็อกในการอัปเดตครั้งเดียว แต่จะบริโภคได้เพียงบางส่วนของบล็อกเท่านั้น อย่างไรก็ตาม หากผู้เรียกเลือกที่จะให้ข้อมูลในการอัปเดตหลายครั้ง วิธีการนี้จะยอมรับข้อมูลดังกล่าว
หากผู้โทรระบุข้อมูลที่จะเซ็นมากกว่าที่ระบบใช้ได้ (ความยาวของข้อมูลเกินขนาดคีย์ RSA) ให้แสดงผลลัพธ์เป็น ErrorCode::INVALID_INPUT_LENGTH
คีย์ ECDSA
สำหรับการดำเนินการลงนามและการยืนยันด้วย Digest::NONE
วิธีนี้จะยอมรับการเซ็นชื่อหรือยืนยันทั้งบล็อกในการอัปเดตครั้งเดียว วิธีการนี้ใช้เพียงบางส่วนของบล็อกไม่ได้
อย่างไรก็ตาม หากผู้โทรเลือกที่จะให้ข้อมูลในการอัปเดตหลายครั้ง วิธีการนี้จะยอมรับข้อมูลดังกล่าว หากผู้โทรให้ข้อมูลสำหรับการลงชื่อมากกว่าที่ระบบใช้ได้ ระบบจะตัดข้อมูลให้สั้นลงโดยอัตโนมัติ (การดำเนินการนี้แตกต่างจากการจัดการข้อมูลที่เกินมาซึ่งระบุไว้ในการดำเนินการ RSA ที่คล้ายกัน เหตุผลที่ต้องทำเช่นนี้คือการเข้ากันได้กับไคลเอ็นต์เดิม)
คีย์ AES
โหมด AES GCM รองรับข้อมูลการตรวจสอบสิทธิ์ที่เกี่ยวข้อง ซึ่งระบุผ่านแท็ก Tag::ASSOCIATED_DATA
ในอาร์กิวเมนต์ inParams
คุณสามารถระบุข้อมูลที่เชื่อมโยงในการเรียกซ้ำได้ (สำคัญในกรณีที่ข้อมูลมีขนาดใหญ่เกินกว่าที่จะส่งในบล็อกเดียว) แต่ต้องอยู่ก่อนข้อมูลที่เข้ารหัสหรือถอดรหัสเสมอ การเรียกใช้การอัปเดตสามารถรับทั้งข้อมูลที่เกี่ยวข้องและข้อมูลที่จะเข้ารหัส/ถอดรหัสได้ แต่การอัปเดตที่ตามมาจะรวมข้อมูลที่เกี่ยวข้องไม่ได้ หากผู้โทรระบุข้อมูลที่เชื่อมโยงกับการเรียกใช้การอัปเดตหลังจากการเรียกใช้ที่มีข้อมูลที่จะเข้ารหัส/ถอดรหัส ให้แสดงผล ErrorCode::INVALID_TAG
สําหรับการเข้ารหัส GCM ระบบจะเพิ่มแท็กต่อท้ายข้อความที่เข้ารหัสโดย finish
ในระหว่างการถอดรหัส Tag::MAC_LENGTH
ไบต์สุดท้ายของข้อมูลที่ส่งไปยังการเรียกใช้การอัปเดตครั้งล่าสุดคือแท็ก เนื่องจากการเรียกใช้ update
หนึ่งๆ ไม่รู้ว่าเป็นการเรียกใช้ครั้งสุดท้ายหรือไม่ ระบบจึงประมวลผลข้อมูลทั้งหมดยกเว้นความยาวแท็กและบัฟเฟอร์ข้อมูลแท็กที่เป็นไปได้ในระหว่าง finish
เสร็จสิ้น
เวอร์ชัน: 1, 2, 3
ดำเนินการที่อยู่ระหว่างดำเนินการซึ่งเริ่มต้นด้วย begin
ให้เสร็จสิ้น โดยประมวลผลข้อมูลทั้งหมดที่ยังไม่ได้ประมวลผลซึ่งได้จากอินสแตนซ์ update
เมธอดนี้เป็นเมธอดสุดท้ายที่เรียกใช้ในการดำเนินการ จึงมีการส่งคืนข้อมูลที่ประมวลผลทั้งหมด
ไม่ว่าจะดำเนินการเสร็จสมบูรณ์หรือแสดงข้อผิดพลาด วิธีการนี้จะดำเนินการให้เสร็จสมบูรณ์และทำให้ตัวแฮนเดิลการดำเนินการที่ระบุใช้งานไม่ได้ การใช้แฮนเดิลในอนาคตด้วยเมธอดนี้หรือ update
หรือ abort
จะแสดงผลเป็น ErrorCode::INVALID_OPERATION_HANDLE
การดำเนินการลงนามจะแสดงผลลายเซ็นเป็นเอาต์พุต การดำเนินการยืนยันจะยอมรับลายเซ็นในพารามิเตอร์ signature
และไม่แสดงผลลัพธ์
การบังคับใช้การให้สิทธิ์
การบังคับใช้การให้สิทธิ์คีย์จะดำเนินการใน begin
เป็นหลัก ยกเว้นในกรณีที่คีย์มีลักษณะทั้ง 2 ประการต่อไปนี้
- มี
Tag::USER_SECURE_IDs
อย่างน้อย 1 รายการ - ไม่มี
Tag::AUTH_TIMEOUT
ในกรณีนี้ คีย์ต้องมีการให้สิทธิ์ต่อการดำเนินการ และเมธอดการอัปเดตจะได้รับ Tag::AUTH_TOKEN
ในอาร์กิวเมนต์ inParams
HMAC จะยืนยันว่าโทเค็นถูกต้องและมีรหัสผู้ใช้ที่ปลอดภัยที่ตรงกัน ตรงกับ Tag::USER_AUTH_TYPE
ของคีย์ และมีแฮนเดิลการดำเนินการของการดำเนินการปัจจุบันในช่อง challenge
หากไม่เป็นไปตามเงื่อนไขเหล่านี้ ให้แสดงผล
ErrorCode::KEY_USER_NOT_AUTHENTICATED
ผู้โทรจะระบุโทเค็นการตรวจสอบสิทธิ์ในการโทรทุกครั้งไปยัง update
และ finish
การติดตั้งใช้งานต้องตรวจสอบโทเค็นเพียงครั้งเดียว
คีย์ RSA
ข้อกำหนดเพิ่มเติมบางประการโดยขึ้นอยู่กับโหมดการเติม
PaddingMode::NONE
. สําหรับการดำเนินการลงนามและการเข้ารหัสแบบไม่เติมค่า ในกรณีที่ข้อมูลที่ให้ไว้สั้นกว่าคีย์ ระบบจะเติมค่า 0 ทางด้านซ้ายก่อนลงนาม/เข้ารหัส หากข้อมูลมีความยาวเท่ากับคีย์แต่มีจำนวนมากกว่า ให้แสดงผลErrorCode::INVALID_ARGUMENT
สําหรับการดำเนินการยืนยันและการถอดรหัส ข้อมูลต้องยาวเท่ากับคีย์ หรือไม่เช่นนั้น ให้แสดงผลErrorCode::INVALID_INPUT_LENGTH.
PaddingMode::RSA_PSS
. สําหรับการดำเนินการกับลายเซ็นที่มีการเติม PSS เกลือ PSS จะมีขนาดเท่ากับข้อมูลสรุปข้อความและสร้างขึ้นแบบสุ่ม ระบบจะใช้ข้อมูลสรุปที่ระบุด้วยTag::DIGEST
ในinputParams
ในbegin
เป็นอัลกอริทึมข้อมูลสรุป PSS และเป็นอัลกอริทึมข้อมูลสรุป MGF1PaddingMode::RSA_OAEP
. ระบบจะใช้ข้อมูลสรุปที่ระบุด้วยTag::DIGEST
ในinputParams
ในbegin
เป็นอัลกอริทึมข้อมูลสรุป OAEP และจะใช้ SHA1 เป็นอัลกอริทึมข้อมูลสรุป MGF1
คีย์ ECDSA
หากข้อมูลสำหรับการลงนามหรือการยืนยันแบบไม่เพิ่มค่าใดๆ ยาวเกินไป ระบบจะตัดข้อมูลนั้น
คีย์ AES
เงื่อนไขเพิ่มเติมบางประการโดยขึ้นอยู่กับโหมดการบล็อก
BlockMode::ECB
หรือBlockMode::CBC
หากการเติมคือPaddingMode::NONE
และความยาวของข้อมูลไม่ใช่จำนวนที่คูณด้วยขนาดบล็อก AES ให้แสดงผลErrorCode::INVALID_INPUT_LENGTH
หากมีการเติมค่าPaddingMode::PKCS7
ให้เติมข้อมูลตามข้อกำหนด PKCS#7 โปรดทราบว่า PKCS#7 แนะนำให้เพิ่มบล็อกการเติมอีก 1 บล็อกหากข้อมูลเป็นจำนวนที่คูณกับความยาวของบล็อกBlockMode::GCM
. ในระหว่างการเข้ารหัส หลังจากประมวลผลข้อความธรรมดาทั้งหมดแล้ว ให้คํานวณแท็ก (Tag::MAC_LENGTH
ไบต์) และเพิ่มต่อท้ายข้อความที่เข้ารหัสที่แสดง ในระหว่างการถอดรหัส ให้ประมวลผลไบต์Tag::MAC_LENGTH
สุดท้ายเป็นแท็ก หากการยืนยันแท็กไม่สำเร็จ ให้กลับไปที่ErrorCode::VERIFICATION_FAILED
ล้มเลิก
เวอร์ชัน: 1, 2, 3
ยกเลิกการดำเนินการที่กำลังดำเนินอยู่ หลังจากการเรียกให้หยุดกลางคันแล้ว ให้แสดงผล ErrorCode::INVALID_OPERATION_HANDLE
สำหรับการใช้ตัวแฮนเดิลการดำเนินการที่ระบุในภายหลังด้วย update
, finish
หรือ abort
get_supported_algorithms
เวอร์ชัน: 1
แสดงรายการอัลกอริทึมที่การติดตั้งใช้งานฮาร์ดแวร์ Keymaster รองรับ การติดตั้งใช้งานซอฟต์แวร์จะแสดงผลรายการว่าง ส่วนการติดตั้งใช้งานแบบผสมจะแสดงผลรายการที่มีเฉพาะอัลกอริทึมที่ฮาร์ดแวร์รองรับ
การติดตั้งใช้งาน Keymaster 1 รองรับ RSA, EC, AES และ HMAC
get_supported_block_modes
เวอร์ชัน: 1
แสดงรายการโหมดบล็อก AES ที่การติดตั้งใช้งานฮาร์ดแวร์ Keymaster รองรับสำหรับอัลกอริทึมและวัตถุประสงค์ที่ระบุ
สำหรับ RSA, EC และ HMAC ซึ่งไม่ใช่การเข้ารหัสบล็อก เมธอดจะแสดงผลเป็นรายการว่างสำหรับวัตถุประสงค์ที่ถูกต้องทั้งหมด วัตถุประสงค์ที่ไม่ถูกต้องควรทําให้เมธอดแสดงผล ErrorCode::INVALID_PURPOSE
การติดตั้งใช้งาน Keymaster 1 รองรับ ECB, CBC, CTR และ GCM สําหรับการเข้ารหัสและถอดรหัส AES
get_supported_padding_modes
เวอร์ชัน: 1
แสดงรายการโหมดการเติมที่รองรับโดยการใช้งานฮาร์ดแวร์ Keymaster สำหรับอัลกอริทึมและวัตถุประสงค์ที่ระบุ
HMAC และ EC ไม่มีแนวคิดเรื่องการเติม ดังนั้นเมธอดจะแสดงผลลิสต์ว่างสำหรับวัตถุประสงค์ที่ถูกต้องทั้งหมด วัตถุประสงค์ที่ไม่ถูกต้องจะทำให้เมธอดแสดงผล ErrorCode::INVALID_PURPOSE
สำหรับ RSA การติดตั้งใช้งาน Keymaster 1 รองรับการดำเนินการต่อไปนี้
- การเข้ารหัส การถอดรหัส การเซ็นชื่อ และการยืนยันแบบไม่เพิ่มค่าใดๆ สําหรับการเข้ารหัสและการรับรองที่ไม่เพิ่มการเติม หากข้อความสั้นกว่าค่าโมดูลสาธารณะ การใช้งานจะต้องเติม 0 ไว้ข้างหน้า สำหรับการถอดรหัสและการยืนยันแบบไม่เพิ่มการเติมความยาวของอินพุตต้องตรงกับขนาดของค่าโมดูลัสสาธารณะ
- โหมดการเติมข้อมูลการเข้ารหัสและการลงนาม PKCS#1 v1.5
- PSS ที่มีความยาวเกลือขั้นต่ำ 20
- OAEP
สำหรับ AES ในโหมด ECB และ CBC การใช้งาน Keymaster 1 จะไม่รองรับการเติมค่าและ PKCS#7 โหมด CTR และ GCM รองรับเฉพาะการไม่ใส่การเติม
get_supported_digests
เวอร์ชัน: 1
แสดงรายการโหมดข้อมูลสรุปที่การติดตั้งใช้งานฮาร์ดแวร์ Keymaster รองรับสําหรับอัลกอริทึมและวัตถุประสงค์ที่ระบุ
ไม่มีโหมด AES ที่รองรับหรือกำหนดให้มีการย่อยข้อมูล ดังนั้นเมธอดจะแสดงผลรายการว่างเพื่อวัตถุประสงค์ที่ถูกต้อง
การติดตั้งใช้งาน Keymaster 1 สามารถใช้ชุดย่อยของข้อมูลสรุปที่กําหนดไว้ การใช้งานมี SHA-256 และสามารถมี MD5, SHA1, SHA-224, SHA-256, SHA384 และ SHA512 (ชุดข้อมูลสรุปที่กําหนดไว้ทั้งหมด)
get_supported_import_formats
เวอร์ชัน: 1
แสดงรายการรูปแบบการนําเข้าที่ฮาร์ดแวร์ Keymaster รองรับการใช้อัลกอริทึมที่ระบุ
การติดตั้งใช้งาน Keymaster 1 รองรับรูปแบบ PKCS#8 (ไม่มีการปกป้องด้วยรหัสผ่าน) สำหรับการนําเข้าคู่คีย์ RSA และ EC และรองรับการนําเข้าข้อมูลคีย์ AES และ HMAC แบบ RAW
get_supported_export_formats
เวอร์ชัน: 1
แสดงรายการรูปแบบการส่งออกที่ฮาร์ดแวร์ Keymaster รองรับการใช้อัลกอริทึมที่ระบุ
การติดตั้งใช้งาน Keymaster1 รองรับรูปแบบ X.509 สำหรับการส่งออกคีย์สาธารณะ RSA และ EC ไม่รองรับการส่งออกคีย์ส่วนตัวหรือคีย์แบบไม่สมมาตร
ฟังก์ชันที่ผ่านมา
Keymaster 0
ฟังก์ชันต่อไปนี้เป็นของคีย์มาสเตอร์ 0 เวอร์ชันเดิม ข้อมูลเหล่านี้อยู่ในโครงสร้าง keymaster1_device_t ของ Keymaster 1 อย่างไรก็ตาม ใน Keymaster 1.0 ไม่ได้ติดตั้งใช้งานและตั้งค่าตัวชี้ฟังก์ชันเป็น NULL
generate_keypair
import_keypair
get_keypair_public
delete_keypair
delete_all
sign_data
Verify_data
Keymaster 1
ฟังก์ชันต่อไปนี้เป็นส่วนหนึ่งของคําจํากัดความของ Keymaster 1 แต่ถูกนําออกใน Keymaster 2 พร้อมกับฟังก์ชัน Keymaster 0 ที่ระบุไว้ข้างต้น
get_supported_algorithms
get_supported_block_modes
get_supported_padding_modes
get_supported_digests
get_supported_import_formats
get_supported_export_formats
Keymaster 2
ฟังก์ชันต่อไปนี้เป็นส่วนหนึ่งของคําจํากัดความของ Keymaster 2 แต่ถูกนําออกใน Keymaster 3 พร้อมกับฟังก์ชัน Keymaster 1 ที่ระบุไว้ข้างต้น
configure