เคอร์เนล GKI มีโมดูลเคอร์เนล Linux ที่ชื่อ fips140.ko ซึ่งเป็นไปตามข้อกำหนด FIPS 140-3 สำหรับโมดูลซอฟต์แวร์การเข้ารหัส
คุณส่งโมดูลนี้เพื่อขอการรับรอง FIPS ได้หากผลิตภัณฑ์ที่ใช้เคอร์เนล GKI จำเป็นต้องใช้
คุณต้องปฏิบัติตามข้อกำหนด FIPS 140-3 ต่อไปนี้โดยเฉพาะก่อนจึงจะใช้ รูทีนการเข้ารหัสได้
- โมดูลต้องตรวจสอบความสมบูรณ์ของตัวเองก่อนจึงจะใช้อัลกอริทึมการเข้ารหัสลับได้
- โมดูลต้องใช้และยืนยันอัลกอริทึมการเข้ารหัสลับที่ได้รับอนุมัติ โดยใช้การทดสอบด้วยตนเองของอัลกอริทึมการเข้ารหัสลับก่อนที่จะพร้อมใช้งาน
เหตุผลที่ต้องมีโมดูลเคอร์เนลแยกต่างหาก
การตรวจสอบ FIPS 140-3 อิงตามแนวคิดที่ว่าเมื่อโมดูลซอฟต์แวร์หรือฮาร์ดแวร์ ได้รับการรับรองแล้ว จะไม่มีการเปลี่ยนแปลงอีก หากมีการเปลี่ยนแปลง คุณต้อง ขอการรับรองอีกครั้ง ซึ่งไม่ตรงกับกระบวนการพัฒนาซอฟต์แวร์ที่ใช้กันในปัจจุบัน และด้วยข้อกำหนดนี้ โดยทั่วไปแล้ว โมดูลซอฟต์แวร์ FIPS จึงได้รับการออกแบบมาให้มุ่งเน้นที่คอมโพเนนต์วิทยาการเข้ารหัสอย่างเต็มที่ที่สุด เพื่อให้มั่นใจว่าการเปลี่ยนแปลงที่ไม่เกี่ยวข้องกับวิทยาการเข้ารหัสจะไม่ต้องมีการประเมินวิทยาการเข้ารหัสซ้ำ
เราตั้งใจที่จะอัปเดตเคอร์เนล GKI เป็นประจำตลอดอายุการใช้งานที่รองรับ ซึ่งทำให้ไม่สามารถเก็บทั้งเคอร์เนลไว้ภายในขอบเขตของโมดูล FIPS ได้ เนื่องจากโมดูลดังกล่าวจะต้องได้รับการรับรองอีกครั้งเมื่อมีการอัปเดตเคอร์เนลทุกครั้ง การกำหนด "โมดูล FIPS" ให้เป็นชุดย่อยของอิมเมจเคอร์เนลจะช่วยลดปัญหานี้ได้ แต่จะไม่ใช่การแก้ปัญหา เนื่องจากเนื้อหาไบนารีของ "โมดูล FIPS" จะยังคงเปลี่ยนแปลงบ่อยกว่าที่จำเป็นมาก
ก่อนเวอร์ชันเคอร์เนล 6.1 สิ่งที่ควรพิจารณาอีกอย่างคือ GKI ได้รับการคอมไพล์โดยเปิดใช้ LTO (การเพิ่มประสิทธิภาพเวลาลิงก์) เนื่องจาก LTO เป็นข้อกำหนดเบื้องต้นสำหรับการตรวจสอบความสมบูรณ์ของโฟลว์การควบคุม ซึ่งเป็นฟีเจอร์ด้านความปลอดภัยที่สำคัญ
ดังนั้น โค้ดทั้งหมดที่ครอบคลุมตามข้อกำหนด FIPS 140-3 จะรวมอยู่ในโมดูลเคอร์เนลแยกต่างหาก fips140.ko ซึ่งอาศัยเฉพาะอินเทอร์เฟซที่เสถียร
ซึ่งเปิดเผยโดยแหล่งที่มาของเคอร์เนล GKI ที่ใช้สร้าง ซึ่งหมายความว่าสามารถใช้โมดูลกับ GKI รุ่นต่างๆ ของรุ่นเดียวกันได้ และจะต้องอัปเดตและส่งกลับเพื่อรับการรับรองก็ต่อเมื่อมีการแก้ไขปัญหาในโค้ดที่โมดูลนั้นๆ มีอยู่
กรณีที่ควรใช้โมดูล
เคอร์เนล GKI เองมีโค้ดที่ขึ้นอยู่กับรูทีนการเข้ารหัสที่ รวมอยู่ในโมดูลเคอร์เนล FIPS 140-3 ด้วย ดังนั้น ระบบจึงไม่ได้ย้ายรูทีน crypto ในตัวออกจากเคอร์เนล GKI แต่จะคัดลอกไปยังโมดูลแทน เมื่อโหลดโมดูลแล้ว ระบบจะยกเลิกการลงทะเบียนกิจวัตรการเข้ารหัสในตัวจาก Linux CryptoAPI และแทนที่ด้วยกิจวัตรที่โมดูลมี
ซึ่งหมายความว่าfips140.koเป็นโมดูลที่ไม่บังคับโดยสมบูรณ์ และควรติดตั้งใช้งานเฉพาะในกรณีที่ต้องได้รับการรับรอง FIPS 140-3 นอกจากนี้
โมดูลนี้ไม่มีความสามารถเพิ่มเติม และการโหลดโมดูลโดยไม่จำเป็น
มีแนวโน้มที่จะส่งผลต่อเวลาในการบูตเท่านั้นโดยไม่ก่อให้เกิดประโยชน์ใดๆ
วิธีติดตั้งใช้งานโมดูล
คุณรวมโมดูลเข้ากับการสร้าง Android ได้โดยทำตามขั้นตอนต่อไปนี้
- เพิ่มชื่อโมดูลใน
BOARD_VENDOR_RAMDISK_KERNEL_MODULESซึ่งจะทำให้ระบบคัดลอกโมดูลไปยัง Ramdisk ของผู้ให้บริการ - เพิ่มชื่อโมดูลใน
BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOADซึ่งจะ ทำให้มีการเพิ่มชื่อโมดูลไปยังmodules.loadในเป้าหมายmodules.loadมีรายการโมดูลที่initโหลดเมื่ออุปกรณ์บูต
การตรวจสอบความสมบูรณ์ด้วยตนเอง
โมดูลเคอร์เนล FIPS 140-3 จะใช้ไดเจสต์ HMAC-SHA256 ของส่วน .code
และ .rodata ของตัวเองในเวลาที่โหลดโมดูล แล้วเปรียบเทียบกับไดเจสต์
ที่บันทึกไว้ในโมดูล ซึ่งจะเกิดขึ้นหลังจากที่โปรแกรมโหลดโมดูล Linux ได้ทำการแก้ไขตามปกติแล้ว เช่น การประมวลผลการย้าย ELF และการแก้ไขทางเลือกสำหรับข้อผิดพลาดของ CPU ในส่วนเหล่านั้น เราจะทำตาม
ขั้นตอนเพิ่มเติมต่อไปนี้เพื่อให้มั่นใจว่าสามารถสร้างสรุป
ได้อย่างถูกต้อง
- ระบบจะเก็บการย้าย ELF ไว้ภายในโมดูลเพื่อให้ใช้ย้อนกลับกับอินพุตของ HMAC ได้
- โมดูลจะยกเลิกการแก้ไขโค้ดที่เคอร์เนลทำไว้สำหรับ Dynamic Shadow Call Stack กล่าวคือ โมดูลจะแทนที่คำสั่งที่พุชหรือป็อปจากสแต็กการเรียกเงาด้วยคำสั่งรหัสการตรวจสอบสิทธิ์ของพอยน์เตอร์ (PAC) ที่มีอยู่เดิม
- การแก้ไขโค้ดอื่นๆ ทั้งหมดจะปิดใช้สำหรับโมดูล ซึ่งรวมถึงคีย์แบบคงที่และ ดังนั้นจึงรวมถึงจุดติดตามและฮุกของผู้ให้บริการด้วย
อัลกอริทึมการเข้ารหัสจะทดสอบตัวเอง
โมดูลเคอร์เนล FIPS 140-3 เป็นไปตามข้อกำหนดการทดสอบตนเองของอัลกอริทึมการเข้ารหัส ของ FIPS 140-3 โดยการใช้การทดสอบคำตอบที่ทราบ การทดสอบที่ติดตั้งใช้งาน จะแตกต่างกันไปตามอัลกอริทึมและเป็นไปตามคำแนะนำในการติดตั้งใช้งาน FIPS 140-3 10.3.A
โดยทั่วไปแล้ว คุณต้องมีเวกเตอร์ทดสอบเพียงรายการเดียวต่ออัลกอริทึม การทดสอบตนเองของอัลกอริทึมการเข้ารหัส FIPS ออกแบบมาเพื่อตรวจสอบฟังก์ชันพื้นฐาน เท่านั้น การทดสอบที่ครอบคลุมจะเกิดขึ้นแยกกัน โดยใช้โปรแกรมตรวจสอบอัลกอริทึมการเข้ารหัสลับ (Cryptographic Algorithm Validation Program หรือ CAVP) และชุดทดสอบการเข้ารหัสลับของเคอร์เนลต้นทาง
เมื่ออัลกอริทึมมีการใช้งานหลายอย่างที่ผู้ใช้เข้าถึงได้หรือบริการของโมดูลใช้ FIPS 140-3 กำหนดให้การใช้งานทั้งหมดเหล่านั้นต้องผ่านการทดสอบด้วยตนเอง ซึ่งเกี่ยวข้องกับกลยุทธ์การผสานรวมที่ใช้กันโดยทั่วไป
ใน Linux CryptoAPI ซึ่งแต่ละอัลกอริทึมสามารถมีการใช้งานที่ผู้ใช้เข้าถึงได้หลายรายการ
เช่น ในเคอร์เนล android16-6.12 SHA-256 มีการใช้งาน 3 แบบ ได้แก่ sha256-generic, sha256-arm64 และ sha256-ce ใน CPU ที่มี
ส่วนขยายการเข้ารหัส ARMv8 ระบบจะใช้ sha256-ce โดยค่าเริ่มต้น แต่ผู้ใช้ยังคง
เข้าถึงส่วนขยายอื่นๆ ได้อย่างชัดเจน ดังนั้น โมดูลจึงทดสอบการติดตั้งใช้งานทั้ง 3 รายการด้วยตนเอง
ในเคอร์เนล android17-6.18 ขึ้นไป อัลกอริทึมบางอย่างใช้กลยุทธ์การผสานรวมที่ง่ายกว่า
ตัวอย่างเช่น ในเคอร์เนล android17-6.18 SHA-256 มีsha256-libการติดตั้งใช้งานเดียวที่เลือกโค้ดที่เหมาะสมสำหรับ CPU โดยอัตโนมัติในเวลาที่ใช้ในการโหลดโมดูล ดังนั้น โมดูลจึงทดสอบตัวเองเท่านั้น
sha256-lib
อัลกอริทึมที่รวมอยู่ในโมดูล
อัลกอริทึมทั้งหมดที่รวมอยู่ในโมดูล FIPS 140-3 แสดงดังนี้
ซึ่งใช้กับกิ่งก้านของเคอร์เนล android12-5.10, android13-5.10, android13-5.15, android14-5.15, android14-6.1, android15-6.6, android16-6.12 และ android17-6.18 แม้ว่าความแตกต่างระหว่างเวอร์ชันเคอร์เนลจะมีการระบุไว้ในที่ที่เหมาะสม
| อัลกอริทึม | การใช้งาน | อนุมัติได้ | คำจำกัดความ |
|---|---|---|---|
aes |
aes-generic, aes-arm64, aes-ce, ไลบรารี AES |
ได้ | การเข้ารหัสแบบบล็อก AES แบบข้อความธรรมดาโดยไม่มีโหมดการทำงาน: รองรับคีย์ทุกขนาด (128 บิต, 192 บิต และ 256 บิต) การติดตั้งใช้งานอื่นๆ ทั้งหมดนอกเหนือจากการติดตั้งใช้งานไลบรารีสามารถประกอบขึ้นด้วยโหมดการทำงานผ่านเทมเพลต |
cmac(aes) |
cmac (เทมเพลต), cmac-aes-neon, cmac-aes-ce |
ได้ | AES-CMAC: รองรับคีย์ AES ทุกขนาด cmac เทมเพลตสามารถเขียนร่วมกับการติดตั้งใช้งาน aes ใดก็ได้โดยใช้ cmac( ส่วนการติดตั้งใช้งานอื่นๆ จะเป็นแบบสแตนด์อโลน |
ecb(aes) |
ecb (เทมเพลต), ecb-aes-neon, ecb-aes-neonbs, ecb-aes-ce |
ได้ | AES-ECB: รองรับคีย์ AES ทุกขนาด ecb เทมเพลตสามารถเขียนร่วมกับการติดตั้งใช้งาน aes ใดก็ได้โดยใช้ ecb( ส่วนการติดตั้งใช้งานอื่นๆ จะเป็นแบบสแตนด์อโลน |
cbc(aes) |
cbc (เทมเพลต), cbc-aes-neon, cbc-aes-neonbs, cbc-aes-ce |
ได้ | AES-CBC: รองรับคีย์ AES ทุกขนาด cbc เทมเพลตสามารถเขียนร่วมกับการติดตั้งใช้งาน aes ใดก็ได้โดยใช้ cbc( ส่วนการติดตั้งใช้งานอื่นๆ จะเป็นแบบสแตนด์อโลน |
cts(cbc(aes)) |
cts (เทมเพลต), cts-cbc-aes-neon, cts-cbc-aes-ce |
ได้ | AES-CBC-CTS หรือ AES-CBC ที่มีการขโมยข้อความที่เข้ารหัส: รูปแบบที่ใช้คือ CS3 โดยจะสลับบล็อกข้อความที่เข้ารหัส 2 บล็อกสุดท้ายโดยไม่มีเงื่อนไข ระบบรองรับคีย์ AES ทุกขนาด cts เทมเพลตสามารถเขียนร่วมกับการติดตั้งใช้งาน cbc ใดก็ได้โดยใช้ cts( ส่วนการติดตั้งใช้งานอื่นๆ จะเป็นแบบสแตนด์อโลน |
ctr(aes) |
ctr (เทมเพลต), ctr-aes-neon, ctr-aes-neonbs, ctr-aes-ce |
ได้ | AES-CTR: รองรับคีย์ AES ทุกขนาด ctr เทมเพลตสามารถเขียนร่วมกับการติดตั้งใช้งาน aes ใดก็ได้โดยใช้ ctr( ส่วนการติดตั้งใช้งานอื่นๆ จะเป็นแบบสแตนด์อโลน |
xts(aes) |
xts (เทมเพลต), xts-aes-neon, xts-aes-neonbs, xts-aes-ce |
ได้ | AES-XTS: ในเคอร์เนล 6.1 และต่ำกว่า ระบบจะรองรับขนาดคีย์ AES ทั้งหมด ส่วนในเคอร์เนล 6.6 ขึ้นไป ระบบจะรองรับเฉพาะ AES-128 และ AES-256 xts เทมเพลตสามารถเขียนร่วมกับการติดตั้งใช้งาน ecb(aes) ใดก็ได้โดยใช้ xts( ส่วนการติดตั้งใช้งานอื่นๆ จะเป็นแบบสแตนด์อโลน การติดตั้งใช้งานทั้งหมดจะใช้การตรวจสอบคีย์ที่อ่อนแอตามที่ FIPS กำหนด นั่นคือ ระบบจะปฏิเสธคีย์ XTS ที่ครึ่งแรกและครึ่งหลังเท่ากัน |
gcm(aes) |
gcm (เทมเพลต), gcm-aes-ce |
ไม่ 1 | AES-GCM: รองรับคีย์ AES ทุกขนาด รองรับเฉพาะ IV ขนาด 96 บิต เช่นเดียวกับโหมด AES อื่นๆ ทั้งหมดในโมดูลนี้ ผู้เรียกมีหน้าที่รับผิดชอบในการระบุ IV gcm สามารถใช้ร่วมกับการติดตั้งใช้งาน ctr(aes) และ ghash ได้โดยใช้ gcm_base( ส่วนการติดตั้งใช้งานอื่นๆ จะเป็นแบบสแตนด์อโลน |
sha1 |
เคอร์เนล 6.12 และต่ำกว่า: sha1-generic, sha1-ce |
ได้ | ฟังก์ชันแฮชแบบเข้ารหัส SHA-1 นำออกในเคอร์เนล 6.18 ขึ้นไป |
sha224 |
เคอร์เนล 6.18 ขึ้นไป: sha224-lib เคอร์เนล 6.12 และต่ำกว่า: sha224-generic, sha224-arm64, sha224-ce |
ได้ | ฟังก์ชันแฮชที่เข้ารหัสลับ SHA-224: มีการแชร์โค้ดกับ SHA-256 |
sha256 |
เคอร์เนล 6.18 ขึ้นไป: sha256-lib เคอร์เนล 6.12 และต่ำกว่า: sha256-generic, sha256-arm64, sha256-ce, ไลบรารี SHA-256 |
ได้ | ฟังก์ชันแฮชแบบเข้ารหัส SHA-256 |
sha384 |
เคอร์เนล 6.18 ขึ้นไป: sha384-lib เคอร์เนล 6.12 และต่ำกว่า: sha384-generic, sha384-arm64, sha384-ce |
ได้ | ฟังก์ชันแฮชที่เข้ารหัสลับ SHA-384: โค้ดจะแชร์กับ SHA-512 |
sha512 |
เคอร์เนล 6.18 ขึ้นไป: sha512-lib เคอร์เนล 6.12 และต่ำกว่า: sha512-generic, sha512-arm64, sha512-ce |
ได้ | ฟังก์ชันแฮชแบบเข้ารหัส SHA-512 |
sha3-224 |
เคอร์เนล 6.6 ขึ้นไป: sha3-224-generic |
ได้ | ฟังก์ชันแฮชแบบเข้ารหัส SHA3-224 |
sha3-256 |
เคอร์เนล 6.6 ขึ้นไป: sha3-256-generic |
ได้ | เหมือนกับที่กล่าวมาข้างต้น แต่มีความยาวของไดเจสต์ 256 บิต (SHA3-256) ความยาวของข้อมูลสรุปทั้งหมดใช้การติดตั้งใช้งาน Keccak เดียวกัน |
sha3-384 |
เคอร์เนล 6.6 ขึ้นไป: sha3-384-generic |
ได้ | เหมือนกับก่อนหน้า แต่มีความยาวของข้อความที่ย่อยแล้ว 384 บิต (SHA3-384) ความยาวของข้อมูลสรุปทั้งหมดใช้การติดตั้งใช้งาน Keccak เดียวกัน |
sha3-512 |
เคอร์เนล 6.6 ขึ้นไป: sha3-512-generic |
ได้ | เหมือนกับที่กล่าวมาข้างต้น แต่มีความยาวของข้อความที่ย่อย 512 บิต (SHA3-512) ความยาวของข้อมูลสรุปทั้งหมดใช้การติดตั้งใช้งาน Keccak เดียวกัน |
hmac |
hmac (เทมเพลต) |
ได้ | รหัสการตรวจสอบสิทธิ์ข้อความแฮชที่มีการคีย์ (HMAC): hmac เทมเพลตสามารถสร้างด้วยอัลกอริทึมหรือการติดตั้งใช้งาน SHA ใดก็ได้โดยใช้ hmac( หรือ hmac( |
stdrng |
เคอร์เนลทั้งหมด: drbg_pr_hmac_sha256, drbg_pr_hmac_sha384, drbg_pr_hmac_sha512 เคอร์เนล 6.6 และต่ำกว่า: drbg_pr_hmac_sha1 |
ได้ | HMAC_DRBG ที่สร้างขึ้นด้วยฟังก์ชันแฮชที่มีชื่อและเปิดใช้การป้องกันการคาดเดา: มีการตรวจสอบสถานะ ผู้ใช้อินเทอร์เฟซนี้จะได้รับอินสแตนซ์ DRBG ของตนเอง |
stdrng |
เคอร์เนลทั้งหมด: drbg_nopr_hmac_sha256, drbg_nopr_hmac_sha384, drbg_nopr_hmac_sha512 เคอร์เนล 6.6 และต่ำกว่า: drbg_nopr_hmac_sha1 |
ได้ | เหมือนกับอัลกอริทึม drbg_pr_* แต่ปิดใช้การป้องกันการคาดการณ์ โดยจะแชร์โค้ดกับตัวแปรที่ป้องกันการคาดเดา ในเคอร์เนล 5.10 DRBG ที่มีลำดับความสำคัญสูงสุดคือ drbg_nopr_hmac_sha256 ในเคอร์เนล 5.15 ขึ้นไปคือ drbg_pr_hmac_sha512 |
jitterentropy_rng |
jitterentropy_rng |
ไม่ | Jitter RNG เวอร์ชัน 2.2.0 (เคอร์เนลเวอร์ชัน 6.1 และต่ำกว่า) หรือเวอร์ชัน 3.4.0 (เคอร์เนลเวอร์ชัน 6.6 ขึ้นไป) ผู้ใช้อินเทอร์เฟซนี้จะได้รับอินสแตนซ์ Jitter RNG ของตนเอง โดยจะไม่นำอินสแตนซ์ที่ DRBG ใช้มาใช้ซ้ำ |
xcbc(aes) |
xcbc-aes-neon, xcbc-aes-ce |
ไม่ | |
xctr(aes) |
เคอร์เนล 5.15 ขึ้นไป: xctr-aes-neon, xctr-aes-ce |
ไม่ | |
cbcmac(aes) |
cbcmac-aes-neon, cbcmac-aes-ce |
ไม่ | |
essiv(cbc(aes),sha256) |
essiv-cbc-aes-sha256-neon, essiv-cbc-aes-sha256-ce |
ไม่ |
1. การติดตั้งใช้งาน AES-GCM ของโมดูลอาจ ได้รับการอนุมัติอัลกอริทึมแต่ไม่ได้รับการอนุมัติโมดูล ตรวจสอบได้ แต่ AES-GCM ไม่ถือว่าเป็นอัลกอริทึมที่ได้รับอนุมัติจากมุมมองของโมดูล FIPS เนื่องจากข้อกำหนดของโมดูล FIPS สำหรับ GCM ไม่สามารถใช้งานร่วมกับการติดตั้งใช้งาน GCM ที่ไม่ได้สร้าง IV ของตัวเองได้
สร้างโมดูลจากแหล่งที่มา
สำหรับ Android 14 ขึ้นไป (รวมถึง
android-mainline) ให้สร้างโมดูล fips140.ko จากแหล่งที่มาโดยใช้คำสั่งต่อไปนี้
สร้างด้วย Bazel
tools/bazel run //common:fips140_distสร้างด้วย
build.sh(เดิม)BUILD_CONFIG=common/build.config.gki.aarch64.fips140 build/build.sh
คำสั่งเหล่านี้จะทำการสร้างแบบเต็ม ซึ่งรวมถึงเคอร์เนลและfips140.ko
โมดูลที่มีเนื้อหาของข้อมูลสรุป HMAC-SHA256 ฝังอยู่
คำแนะนำสำหรับผู้ใช้ปลายทาง
คำแนะนำสำหรับเจ้าหน้าที่ด้านคริปโต
หากต้องการใช้งานโมดูลเคอร์เนล ระบบปฏิบัติการต้องจำกัดไว้ที่ โหมดการทำงานของผู้ให้บริการรายเดียว Android จะจัดการเรื่องนี้โดยอัตโนมัติ โดยใช้ฮาร์ดแวร์การจัดการหน่วยความจำในโปรเซสเซอร์
คุณติดตั้งโมดูลเคอร์เนลแยกต่างหากไม่ได้ เนื่องจากโมดูลนี้รวมอยู่ใน เฟิร์มแวร์ของอุปกรณ์และจะโหลดโดยอัตโนมัติเมื่อบูต โดยจะทำงานใน โหมดการทำงานที่ได้รับอนุมัติเท่านั้น
เจ้าหน้าที่ดูแลด้านการเข้ารหัสสามารถทำให้ระบบเรียกใช้การทดสอบด้วยตนเองได้ทุกเมื่อโดยการรีสตาร์ท อุปกรณ์
คำแนะนำสำหรับผู้ใช้
ผู้ใช้โมดูลเคอร์เนลคือคอมโพเนนต์เคอร์เนลอื่นๆ ที่ต้องใช้อัลกอริทึมการเข้ารหัส โมดูลเคอร์เนลไม่ได้มีตรรกะเพิ่มเติมในการใช้อัลกอริทึม และไม่ได้จัดเก็บพารามิเตอร์ใดๆ นอกเหนือจากเวลาที่จำเป็นในการดำเนินการเข้ารหัสลับ
การใช้อัลกอริทึมเพื่อวัตถุประสงค์ในการปฏิบัติตามข้อกำหนดของ FIPS จะจำกัดเฉพาะอัลกอริทึมที่ได้รับอนุมัติ
โมดูลมีฟังก์ชัน fips140_is_approved_service ที่ระบุว่าอัลกอริทึมได้รับอนุมัติหรือไม่ เพื่อให้เป็นไปตามข้อกำหนด "ตัวบ่งชี้บริการ" ของ FIPS 140-3
ข้อผิดพลาดในการทดสอบด้วยตนเอง
ในกรณีที่การทดสอบล้มเหลว โมดูลเคอร์เนลจะทำให้เคอร์เนลหยุดทำงานและอุปกรณ์จะไม่บูตต่อ หากการรีบูตอุปกรณ์ไม่ช่วยแก้ปัญหา คุณต้องบูตอุปกรณ์เข้าสู่โหมดการกู้คืนเพื่อแก้ไขปัญหาโดยการแฟลชอุปกรณ์อีกครั้ง