หน้านี้ให้รายละเอียดเพื่อช่วยผู้ติดตั้งใช้งาน Keymaster Hardware Abstraction Layers (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
หากฮาร์ดแวร์รองรับการเข้ารหัสแบบ Elliptic Curve กับเส้นโค้ง 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);
เพิ่มRngEntropy
เวอร์ชัน: 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 ในการเรียกใช้ครั้งเดียว
คีย์สร้าง
เวอร์ชัน: 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 และอย่างน้อย 64
- Tag::DIGEST
ระบุอัลกอริทึมไดเจสต์สำหรับคีย์ ระบุไดเจสต์เพียง 1 รายการเท่านั้น มิเช่นนั้นแสดงผล
ErrorCode::UNSUPPORTED_DIGEST
หาก Trustlet ไม่รองรับข้อมูลสรุป ให้แสดงErrorCode::UNSUPPORTED_DIGEST
ลักษณะสำคัญ
หากอาร์กิวเมนต์ลักษณะไม่ใช่ค่า NULL generateKey
จะแสดงลักษณะของคีย์ที่สร้างขึ้นใหม่โดยแบ่งออกเป็นรายการที่บังคับใช้ฮาร์ดแวร์และรายการที่บังคับใช้ซอฟต์แวร์อย่างเหมาะสม ดูคำอธิบายลักษณะที่ควรอยู่ในรายการใดได้จาก getKeyCharacteristics ลักษณะที่แสดงผลจะรวมพารามิเตอร์ทั้งหมดที่ระบุไว้ในการสร้างคีย์ ยกเว้น Tag::APPLICATION_ID และ Tag::APPLICATION_DATA
หากแท็กเหล่านี้รวมอยู่ในพารามิเตอร์คีย์ ระบบจะนำแท็กเหล่านี้ออกจากลักษณะที่ปรากฏ ระบบจึงไม่สามารถค้นหาค่าของแท็กเหล่านี้ได้โดยการตรวจสอบบล็อกคีย์ที่แสดง อย่างไรก็ตาม ค่าเหล่านี้จะเชื่อมโยงกับบล็อกคีย์แบบเข้ารหัส ดังนั้นหากไม่ได้ระบุค่าที่ถูกต้องเมื่อใช้คีย์ การใช้งานจะดำเนินการไม่สำเร็จ ในทำนองเดียวกัน Tag::ROOT_OF_TRUST จะเชื่อมโยงกับคีย์แบบเข้ารหัส แต่ไม่สามารถระบุในระหว่างการสร้างหรือนําเข้าคีย์ และระบบจะไม่แสดงค่านี้
นอกเหนือจากแท็กที่มีให้ Trustlet ยังเพิ่ม Tag::ORIGIN ด้วยค่า KeyOrigin::GENERATED
และหากคีย์ป้องกันการย้อนกลับ
ป้องกันการย้อนกลับ
การป้องกันการย้อนกลับหมายความว่าเมื่อลบคีย์ด้วย deleteKey หรือ deleteAllKeys ฮาร์ดแวร์ที่มีความปลอดภัยจะรับประกันว่าคีย์ดังกล่าวจะใช้ไม่ได้อีก โดยทั่วไปการใช้งานที่ไม่มีการต้านทานการย้อนกลับจะแสดงผลเนื้อหาคีย์ที่สร้างขึ้นหรือนำเข้าไปยังผู้เรียกใช้ในรูปแบบคีย์ BLOB ซึ่งเป็นแบบฟอร์มที่เข้ารหัสและตรวจสอบสิทธิ์ เมื่อคีย์สโตร์ลบ Blob ของคีย์ คีย์จะหายไป แต่ผู้โจมตีที่ก่อนหน้านี้สามารถดึงข้อมูลวัสดุคีย์ได้อาจกู้คืนข้อมูลดังกล่าวลงในอุปกรณ์ได้
คีย์จะป้องกันการย้อนกลับได้หากฮาร์ดแวร์ที่มีความปลอดภัยรับประกันว่าคีย์ที่ลบไปแล้วจะกู้คืนไม่ได้ในภายหลัง ซึ่งโดยทั่วไปจะทําโดยการเก็บข้อมูลเมตาคีย์เพิ่มเติมไว้ในตำแหน่งที่เชื่อถือได้ซึ่งผู้โจมตีไม่สามารถควบคุมได้ ในอุปกรณ์เคลื่อนที่ กลไกที่ใช้ในการตรวจสอบมักจะเป็นการเล่นซ้ำบล็อกหน่วยความจำที่มีการป้องกัน (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 ต้องเข้าถึงนาฬิกาที่ถูกต้องซึ่งตรวจสอบได้ ฮาร์ดแวร์ที่ปลอดภัยที่สุดมีสิทธิ์เข้าถึงเฉพาะข้อมูลเวลาที่ได้รับจากระบบปฏิบัติการที่ไม่ปลอดภัย ซึ่งหมายความว่าแท็กจะบังคับใช้โดยซอฟต์แวร์
- แท็ก::ORIGIN อยู่ในรายการฮาร์ดแวร์สำหรับคีย์ที่เชื่อมโยงกับฮาร์ดแวร์เสมอ การที่รายการดังกล่าวอยู่ในรายการนั้นคือวิธีที่เลเยอร์ระดับสูงขึ้นใช้พิจารณาว่าคีย์ได้รับการสนับสนุนจากฮาร์ดแวร์
คีย์นำเข้า
เวอร์ชัน: 1, 2, 3
ฟังก์ชันนี้เปิดตัวใน Keymaster 1 โดยใช้ชื่อว่า import_key
และเปลี่ยนชื่อใน Keymaster 3
นําเข้าเนื้อหาคีย์ไปยังฮาร์ดแวร์ Keymaster ระบบจะจัดการพารามิเตอร์คำจำกัดความหลักและลักษณะของเอาต์พุตเช่นเดียวกับ generateKey
โดยมีข้อยกเว้นต่อไปนี้
- Tag::KEY_SIZE และ Tag::RSA_PUBLIC_EXPONENT (สำหรับคีย์ RSA เท่านั้น) ไม่จำเป็นต้องอยู่ในพารามิเตอร์อินพุต หากไม่ได้ระบุไว้ ข้อมูลนี้จะอนุมานค่าจากเนื้อหาคีย์ที่ระบุและเพิ่มแท็กและค่าที่เหมาะสมลงในลักษณะคีย์ หากระบุพารามิเตอร์ไว้ ทรัสต์เลตจะตรวจสอบพารามิเตอร์เหล่านั้นกับเนื้อหาคีย์ ในกรณีที่ไม่ตรงกัน เมธอดจะแสดงผล
ErrorCode::IMPORT_PARAMETER_MISMATCH
- แท็ก::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
หรือรหัสข้อผิดพลาดที่ระบุว่าสื่อสารกับฮาร์ดแวร์ที่ไม่ปลอดภัยไม่สำเร็จ
begin
เวอร์ชัน: 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
- แท็ก::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 ตรวจสอบถูกต้อง
- ค่า Tag::USER_SECURE_ID อย่างน้อย 1 ค่าจากคีย์ตรงกับค่ารหัสที่ปลอดภัยอย่างน้อย 1 ค่าในโทเค็น
- คีย์มี Tag::USER_AUTH_TYPE ที่ตรงกับประเภทการตรวจสอบสิทธิ์ในโทเค็น
หากไม่เป็นไปตามเงื่อนไขเหล่านี้ วิธีการจะแสดงผลเป็น
ErrorCode::KEY_USER_NOT_AUTHENTICATED
- Tag::CALLER_NONCE
อนุญาตให้ผู้โทรระบุ Nonce หรือเวกเตอร์การเริ่มต้น (IV) หากคีย์ไม่มีแท็กนี้ แต่ผู้โทรระบุ Tag::NONCE ไว้ในเมธอดนี้ ระบบจะแสดงผล
ErrorCode::CALLER_NONCE_PROHIBITED
- Tag::BOOTLOADER_ONLY
ระบุว่ามีเฉพาะ Bootloader เท่านั้นที่ใช้คีย์ได้ หากเรียกใช้เมธอดนี้ด้วยคีย์สำหรับ Bootloader เท่านั้นหลังจากที่ Bootloader ทำงานเสร็จแล้ว ระบบจะแสดงผลลัพธ์เป็น
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 ไบต์ ผู้เรียกใช้จะถือว่านี่เป็นข้อผิดพลาดและยกเลิกการดำเนินการ
การใช้งานยังเลือกปริมาณข้อมูลที่จะแสดงซึ่งเป็นผลมาจากการอัปเดตได้ด้วย ซึ่งเกี่ยวข้องกับการดำเนินการเข้ารหัสและการถอดรหัสเท่านั้น เนื่องจากการลงนามและการยืนยันจะไม่ส่งคืนข้อมูลจนกว่าจะเสร็จสิ้น แสดงผลข้อมูลให้เร็วที่สุดเท่าที่จะทำได้ แทนที่จะบัฟเฟอร์ไว้
การจัดการข้อผิดพลาด
หากเมธอดนี้แสดงผลรหัสข้อผิดพลาดที่ไม่ใช่ ErrorCode::OK
ระบบจะยกเลิกการดำเนินการและทำให้ตัวแฮนเดิลการดำเนินการใช้งานไม่ได้ การใช้แฮนเดิลในอนาคตด้วยเมธอดนี้ finish หรือ abort จะแสดงผลเป็น ErrorCode::INVALID_OPERATION_HANDLE
การบังคับใช้การให้สิทธิ์
การบังคับใช้การให้สิทธิ์คีย์จะดำเนินการใน begin เป็นหลัก ยกเว้นในกรณีที่คีย์มี
- Tag::USER_SECURE_IDs อย่างน้อย 1 รายการ และ
- ไม่มี Tag::AUTH_TIMEOUT
ในกรณีนี้ คีย์ต้องมีการให้สิทธิ์ต่อการดำเนินการ และเมธอดการอัปเดตจะได้รับ Tag::AUTH_TOKEN ในอาร์กิวเมนต์ inParams
HMAC จะยืนยันว่าโทเค็นถูกต้องและมีรหัสผู้ใช้ที่ปลอดภัยซึ่งตรงกับแท็ก::USER_AUTH_TYPE ของคีย์ และมีแฮนเดิลการดำเนินการของการดำเนินการปัจจุบันในช่องคำขอ หากไม่เป็นไปตามเงื่อนไขเหล่านี้ ให้แสดงผล
ErrorCode::KEY_USER_NOT_AUTHENTICATED
ผู้โทรจะระบุโทเค็นการตรวจสอบสิทธิ์ในการเรียกใช้ทุกครั้งเพื่ออัปเดตและสิ้นสุด การติดตั้งใช้งานต้องตรวจสอบโทเค็นเพียงครั้งเดียวเท่านั้นหากต้องการ
คีย์ 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 แล้ว ซึ่งเป็นการประมวลผลข้อมูลที่ยังไม่ได้ประมวลผลทั้งหมดที่ได้รับจากการอัปเดต
เมธอดนี้เป็นเมธอดสุดท้ายที่เรียกใช้ในการดำเนินการ จึงมีการส่งคืนข้อมูลที่ประมวลผลทั้งหมด
ไม่ว่าจะดำเนินการเสร็จสมบูรณ์หรือแสดงข้อผิดพลาด วิธีการนี้จะดำเนินการให้เสร็จสมบูรณ์และทำให้ตัวแฮนเดิลการดำเนินการที่ระบุใช้งานไม่ได้ การใช้แฮนเดิลในอนาคตด้วยเมธอดนี้หรืออัปเดตหรือยกเลิกจะแสดงผลเป็น ErrorCode::INVALID_OPERATION_HANDLE
การดำเนินการลงนามจะแสดงผลลายเซ็นเป็นเอาต์พุต การดำเนินการยืนยันจะยอมรับลายเซ็นในพารามิเตอร์ signature
และไม่แสดงผลลัพธ์
การบังคับใช้การให้สิทธิ์
การบังคับใช้การให้สิทธิ์คีย์จะดำเนินการใน begin เป็นหลัก ยกเว้นกรณีที่คีย์มีลักษณะดังนี้
- แท็ก::USER_SECURE_IDs อย่างน้อย 1 รายการ และ
- ไม่มี Tag::AUTH_TIMEOUT
ในกรณีนี้ คีย์ต้องมีการให้สิทธิ์ต่อการดำเนินการ และเมธอดการอัปเดตจะได้รับ Tag::AUTH_TOKEN ในอาร์กิวเมนต์ inParams
โดย HMAC จะยืนยันว่าโทเค็นถูกต้องและมีรหัสผู้ใช้ที่ปลอดภัยที่ตรงกัน ตรงกับแท็ก::USER_AUTH_TYPE ของคีย์ และมีแฮนเดิลการดำเนินการของการดำเนินการปัจจุบันในช่องภารกิจ หากไม่เป็นไปตามเงื่อนไขเหล่านี้ ให้แสดงผล ErrorCode::KEY_USER_NOT_AUTHENTICATED
ผู้โทรจะระบุโทเค็นการตรวจสอบสิทธิ์ในการเรียกใช้ทุกครั้งเพื่ออัปเดตและเสร็จสิ้น การติดตั้งใช้งานต้องตรวจสอบโทเค็นเพียงครั้งเดียวเท่านั้นหากต้องการ
คีย์ RSA
ข้อกำหนดเพิ่มเติมบางส่วนขึ้นอยู่กับโหมดระยะห่างจากขอบ
PaddingMode::NONE
. สําหรับการดำเนินการลงนามและการเข้ารหัสแบบไม่เติมค่า ในกรณีที่ข้อมูลที่ให้ไว้สั้นกว่าคีย์ ระบบจะเติมค่า 0 ทางด้านซ้ายก่อนลงนาม/เข้ารหัส หากข้อมูลมีความยาวเท่ากับคีย์แต่เป็นตัวเลขขนาดใหญ่ ให้แสดงผลErrorCode::INVALID_ARGUMENT
สําหรับการดำเนินการยืนยันและการถอดรหัส ข้อมูลต้องยาวเท่ากับคีย์ หรือไม่เช่นนั้น ให้แสดงผลErrorCode::INVALID_INPUT_LENGTH.
PaddingMode::RSA_PSS
สำหรับการดำเนินการลายเซ็นที่เพิ่ม PSS นั้น Salt ของ 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 แนะนำให้เพิ่มบล็อกระยะห่างจากขอบเพิ่มเติม หากข้อมูลมีขนาดหลายเท่าของความยาวบล็อกBlockMode::GCM
. ในระหว่างการเข้ารหัส หลังจากประมวลผลข้อความธรรมดาทั้งหมดแล้ว ให้คํานวณแท็ก (Tag::MAC_LENGTH ไบต์) และเพิ่มแท็กต่อท้ายข้อความที่เข้ารหัสที่แสดงผล ในระหว่างการถอดรหัส ให้ประมวลผลไบต์ Tag::MAC_LENGTH สุดท้ายเป็นแท็ก หากการยืนยันแท็กไม่สำเร็จ ให้กลับไปที่ErrorCode::VERIFICATION_FAILED
ล้มเลิก
เวอร์ชัน: 1, 2, 3
ยกเลิกการดำเนินการที่กำลังดำเนินอยู่ หลังจากการเรียกให้หยุดดำเนินการ ให้แสดงผล ErrorCode::INVALID_OPERATION_HANDLE
สำหรับการใช้ตัวแฮนเดิลการดำเนินการที่ระบุในภายหลังด้วย update, finish หรือ abort
อัลกอริทึม get_supported_
เวอร์ชัน: 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
ฟังก์ชันต่อไปนี้เป็นของคำจำกัดความ Keymaster 0 ต้นฉบับ โดยมีอยู่ในโครงสร้างคีย์มาสเตอร์ 1_อุปกรณ์_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