Mô-đun tiền điện tử GKI có thể chứng nhận FIPS 140-3

Nhân GKI bao gồm một mô-đun nhân Linux có tên fips140.ko tuân thủ các yêu cầu FIPS 140-3 đối với các mô-đun phần mềm mật mã. Mô-đun này có thể được gửi để chứng nhận FIPS nếu sản phẩm chạy hạt nhân GKI yêu cầu nó.

Đặc biệt, các yêu cầu FIPS 140-3 sau đây phải được đáp ứng trước khi có thể sử dụng quy trình mật mã:

  • Mô-đun phải kiểm tra tính toàn vẹn của chính nó trước khi cung cấp các thuật toán mã hóa.
  • Mô-đun phải thực hiện và xác minh các thuật toán mật mã đã được phê duyệt bằng cách sử dụng các bài kiểm tra tự trả lời đã biết trước khi cung cấp chúng.

Tại sao một mô-đun hạt nhân riêng biệt

Xác thực FIPS 140-3 dựa trên ý tưởng rằng một khi mô-đun dựa trên phần mềm hoặc phần cứng đã được chứng nhận thì nó sẽ không bao giờ thay đổi. Nếu thay đổi thì phải chứng nhận lại. Điều này không dễ dàng phù hợp với các quy trình phát triển phần mềm đang được sử dụng ngày nay và do yêu cầu này, các mô-đun phần mềm FIPS thường được thiết kế để tập trung chặt chẽ vào các thành phần mật mã nhất có thể, nhằm đảm bảo rằng những thay đổi không liên quan đến mật mã sẽ được thực hiện. không yêu cầu đánh giá lại mật mã.

Hạt nhân GKI được thiết kế để được cập nhật thường xuyên trong suốt thời gian được hỗ trợ. Điều này làm cho toàn bộ hạt nhân không thể nằm trong ranh giới mô-đun FIPS, vì mô-đun như vậy sẽ cần phải được chứng nhận lại sau mỗi lần cập nhật hạt nhân. Việc xác định "mô-đun FIPS" là tập hợp con của ảnh hạt nhân sẽ giảm thiểu vấn đề này nhưng sẽ không giải quyết được nó, vì nội dung nhị phân của "mô-đun FIPS" vẫn sẽ thay đổi thường xuyên hơn nhiều so với mức cần thiết.

Trước phiên bản kernel 6.1, một điểm cần cân nhắc khác là GKI đã được biên dịch có bật LTO (Tối ưu hóa thời gian liên kết), vì LTO là điều kiện tiên quyết cho Tính toàn vẹn của luồng điều khiển , một tính năng bảo mật quan trọng.

Do đó, tất cả mã đáp ứng yêu cầu FIPS 140-3 đều được đóng gói thành một mô-đun hạt nhân riêng biệt fips140.ko , chỉ dựa trên các giao diện ổn định được cung cấp bởi nguồn hạt nhân GKI mà nó được xây dựng từ đó. Điều này đảm bảo rằng mô-đun có thể được sử dụng với các bản phát hành GKI khác nhau cùng thế hệ và nó phải được cập nhật và gửi lại để chứng nhận chỉ khi có bất kỳ vấn đề nào được khắc phục trong mã do chính mô-đun mang theo.

Khi nào nên sử dụng mô-đun

Bản thân hạt nhân GKI mang mã phụ thuộc vào các quy trình mã hóa cũng được đóng gói trong mô-đun hạt nhân FIPS 140-3. Do đó, các quy trình mã hóa tích hợp không thực sự được chuyển ra khỏi nhân GKI mà được sao chép vào mô-đun. Khi mô-đun được tải, các quy trình mã hóa tích hợp sẽ bị hủy đăng ký khỏi Linux CryptoAPI và được thay thế bằng các quy trình do mô-đun mang theo.

Điều này có nghĩa là mô-đun fips140.ko hoàn toàn không bắt buộc và việc triển khai mô-đun này chỉ hợp lý nếu yêu cầu phải có chứng nhận FIPS 140-3. Ngoài ra, mô-đun này không cung cấp chức năng bổ sung nào và việc tải nó một cách không cần thiết chỉ có khả năng ảnh hưởng đến thời gian khởi động mà không mang lại bất kỳ lợi ích nào.

Cách triển khai mô-đun

Mô-đun này có thể được tích hợp vào bản dựng Android bằng các bước sau:

  • Thêm tên mô-đun vào BOARD_VENDOR_RAMDISK_KERNEL_MODULES . Điều này khiến mô-đun được sao chép vào ramdisk của nhà cung cấp.
  • Thêm tên mô-đun vào BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD . Điều này khiến tên mô-đun được thêm vào modules.load trên mục tiêu. modules.load chứa danh sách các mô-đun được init tải khi thiết bị khởi động.

Tự kiểm tra tính toàn vẹn

Mô-đun hạt nhân FIPS 140-3 lấy bản tóm tắt HMAC-SHA256 của các phần .code.rodata của chính nó tại thời điểm tải mô-đun và so sánh nó với bản tóm tắt được ghi trong mô-đun. Điều này diễn ra sau khi trình tải mô-đun Linux đã thực hiện các sửa đổi thông thường như xử lý tái định vị ELF và các bản vá thay thế cho lỗi CPU đối với các phần đó. Các bước bổ sung sau đây được thực hiện để đảm bảo rằng bản tóm tắt có thể được sao chép chính xác:

  • Việc định vị lại ELF được bảo toàn bên trong mô-đun để chúng có thể được áp dụng ngược lại với đầu vào của HMAC.
  • Tất cả các bản vá mã khác đều bị vô hiệu hóa cho mô-đun, bao gồm các khóa tĩnh và do đó các điểm theo dõi cũng như các hook của nhà cung cấp.

Tự kiểm tra câu trả lời đã biết

Bất kỳ thuật toán được triển khai nào đáp ứng yêu cầu FIPS 140-3 đều phải thực hiện tự kiểm tra câu trả lời đã biết trước khi sử dụng. Theo Hướng dẫn triển khai FIPS 140-3 10.3.A , một vectơ kiểm tra duy nhất cho mỗi thuật toán sử dụng bất kỳ độ dài khóa được hỗ trợ nào là đủ cho mật mã, miễn là cả mã hóa và giải mã đều được kiểm tra.

Linux CryptoAPI có khái niệm về mức độ ưu tiên của thuật toán, trong đó một số triển khai (chẳng hạn như một triển khai sử dụng các hướng dẫn mật mã đặc biệt và dự phòng cho các CPU không triển khai các hướng dẫn đó) của cùng một thuật toán có thể cùng tồn tại. Do đó, cần phải kiểm tra tất cả việc triển khai cùng một thuật toán. Điều này là cần thiết vì Linux CryptoAPI cho phép bỏ qua lựa chọn dựa trên mức độ ưu tiên và thay vào đó sẽ chọn thuật toán có mức độ ưu tiên thấp hơn.

Các thuật toán có trong mô-đun

Tất cả các thuật toán có trong mô-đun FIPS 140-3 được liệt kê như sau. Điều này áp dụng cho các nhánh hạt nhân android12-5.10 , android13-5.10 , android13-5.15 , android14-5.15android14-6.1 , mặc dù sự khác biệt giữa các phiên bản hạt nhân được ghi chú khi thích hợp.

Thuật toán Triển khai Có thể chấp nhận được Sự định nghĩa
aes aes-generic , aes-arm64 , aes-ce , thư viện AES Đúng Mã khối AES đơn giản, không có chế độ hoạt động: Tất cả các kích thước khóa (128 bit, 192 bit và 256 bit) đều được hỗ trợ. Tất cả các triển khai khác ngoài triển khai thư viện có thể được kết hợp với một chế độ hoạt động thông qua một mẫu.
cmac(aes) cmac (mẫu), cmac-aes-neon , cmac-aes-ce Đúng AES-CMAC: Tất cả các kích thước khóa AES đều được hỗ trợ. Mẫu cmac có thể được tạo bằng bất kỳ cách triển khai aes nào bằng cách sử dụng cmac(<aes-impl>) . Các triển khai khác là độc lập.
ecb(aes) ecb (mẫu), ecb-aes-neon , ecb-aes-neonbs , ecb-aes-ce Đúng AES-ECB: Tất cả các kích thước khóa AES đều được hỗ trợ. Mẫu ecb có thể được tạo bằng bất kỳ cách triển khai aes nào bằng cách sử dụng ecb(<aes-impl>) . Các triển khai khác là độc lập.
cbc(aes) cbc (mẫu), cbc-aes-neon , cbc-aes-neonbs , cbc-aes-ce Đúng AES-CBC: Tất cả các kích thước khóa AES đều được hỗ trợ. Mẫu cbc có thể được tạo bằng bất kỳ cách triển khai aes nào bằng cách sử dụng ctr(<aes-impl>) . Các triển khai khác là độc lập.
cts(cbc(aes)) cts (mẫu), cts-cbc-aes-neon , cts-cbc-aes-ce Đúng AES-CBC-CTS hoặc AES-CBC có tính năng đánh cắp văn bản mã hóa: Quy ước được sử dụng là CS3 ; hai khối bản mã cuối cùng được hoán đổi vô điều kiện. Tất cả các kích thước khóa AES đều được hỗ trợ. Mẫu cts có thể được tạo bằng bất kỳ cách triển khai cbc nào bằng cách sử dụng cts(<cbc(aes)-impl>) . Các triển khai khác là độc lập.
ctr(aes) ctr (mẫu), ctr-aes-neon , ctr-aes-neonbs , ctr-aes-ce Đúng AES-CTR: Tất cả các kích thước khóa AES đều được hỗ trợ. Mẫu ctr có thể được tạo bằng bất kỳ cách triển khai aes nào bằng cách sử dụng ctr(<aes-impl>) . Các triển khai khác là độc lập.
xts(aes) xts (mẫu), xts-aes-neon , xts-aes-neonbs , xts-aes-ce Đúng AES-XTS: Tất cả các kích thước khóa AES đều được hỗ trợ. Mẫu xts có thể được tạo bằng bất kỳ cách triển khai ecb(aes) nào bằng cách sử dụng xts(<ecb(aes)-impl>) . Các triển khai khác là độc lập. Tất cả các hoạt động triển khai đều triển khai tính năng kiểm tra khóa yếu theo yêu cầu của FIPS; nghĩa là, các khóa XTS có nửa thứ nhất và nửa thứ hai bằng nhau sẽ bị từ chối.
gcm(aes) gcm (mẫu), gcm-aes-ce số 1 AES-GCM: Tất cả các kích thước khóa AES đều được hỗ trợ. Chỉ hỗ trợ IV 96-bit. Giống như tất cả các chế độ AES khác trong mô-đun này, người gọi có trách nhiệm cung cấp IV. Mẫu gcm có thể được tạo bằng bất kỳ cách triển khai ctr(aes)ghash bằng cách sử dụng gcm_base(<ctr(aes)-impl>,<ghash-impl>) . Các triển khai khác là độc lập.
sha1 sha1-generic , sha1-ce Đúng Hàm băm mật mã SHA-1
sha224 sha224-generic , sha224-arm64 , sha224-ce Đúng Hàm băm mật mã SHA-224: Mã được chia sẻ với SHA-256.
sha256 thư sha256-generic , sha256-arm64 , sha256-ce , SHA-256 Đúng Hàm băm mật mã SHA-256: Giao diện thư viện được cung cấp cho SHA-256 ngoài giao diện CryptoAPI truyền thống. Giao diện thư viện này sử dụng cách triển khai khác.
sha384 sha384-generic , sha384-arm64 , sha384-ce Đúng Hàm băm mật mã SHA-384: Mã được chia sẻ với SHA-512.
sha512 sha512-generic , sha512-arm64 , sha512-ce Đúng Hàm băm mật mã SHA-512
hmac hmac (mẫu) Đúng HMAC (Mã xác thực thông báo băm có khóa): Mẫu hmac có thể được tạo bằng bất kỳ thuật toán hoặc cách triển khai SHA nào bằng cách sử dụng hmac(<sha-alg>) hoặc hmac(<sha-impl>) .
stdrng drbg_pr_hmac_sha1 , drbg_pr_hmac_sha256 , drbg_pr_hmac_sha384 , drbg_pr_hmac_sha512 Đúng HMAC_DRBG được khởi tạo bằng hàm băm được đặt tên và bật tính năng kháng dự đoán: Bao gồm kiểm tra tình trạng. Người dùng giao diện này có được phiên bản DRBG của riêng họ.
stdrng drbg_nopr_hmac_sha1 , drbg_nopr_hmac_sha256 , drbg_nopr_hmac_sha384 , drbg_nopr_hmac_sha512 Đúng Tương tự như thuật toán drbg_pr_* nhưng bị vô hiệu hóa khả năng chống dự đoán. Mã được chia sẻ với biến thể chống dự đoán. Trong phiên bản kernel 5.10, DRBG có mức ưu tiên cao nhất là drbg_nopr_hmac_sha256 . Trong phiên bản kernel 5.15 trở lên, đó là drbg_pr_hmac_sha512 .
jitterentropy_rng jitterentropy_rng KHÔNG Phiên bản 2.2.0 của Jitter RNG : Người dùng giao diện này nhận được các phiên bản Jitter RNG của riêng họ. Họ không sử dụng lại các phiên bản mà DRBG sử dụng.
xcbc(aes) xcbc-aes-neon , xcbc-aes-ce KHÔNG
xctr(aes) xctr-aes-neon , xctr-aes-ce KHÔNG Chỉ có trong phiên bản kernel 5.15 trở lên.
cbcmac(aes) cbcmac-aes-neon , cbcmac-aes-ce KHÔNG
essiv(cbc(aes),sha256) essiv-cbc-aes-sha256-neon , essiv-cbc-aes-sha256-ce KHÔNG

Xây dựng mô-đun từ nguồn

Đối với Android 14 trở lên (bao gồm android-mainline ), hãy xây dựng mô-đun fips140.ko từ nguồn bằng các lệnh sau.

  • Xây dựng với Bazel:

    tools/bazel run //common:fips140_dist
    
  • Xây dựng với build.sh (cũ):

    BUILD_CONFIG=common/build.config.gki.aarch64.fips140 build/build.sh
    

Các lệnh này thực hiện quá trình xây dựng đầy đủ bao gồm hạt nhân và mô-đun fips140.ko có nội dung tóm tắt HMAC-SHA256 được nhúng trong đó.

Hướng dẫn người dùng cuối

Hướng dẫn của Cán bộ tiền điện tử

Để vận hành mô-đun hạt nhân, hệ điều hành phải được giới hạn ở một chế độ hoạt động của một người vận hành. Việc này được Android xử lý tự động bằng phần cứng quản lý bộ nhớ trong bộ xử lý.

Mô-đun hạt nhân không thể được cài đặt riêng; nó được bao gồm như một phần của chương trình cơ sở của thiết bị và được tải tự động khi khởi động. Nó chỉ hoạt động ở chế độ hoạt động đã được phê duyệt.

Nhân viên tiền điện tử có thể chạy tự kiểm tra bất kỳ lúc nào bằng cách khởi động lại thiết bị.

Hướng dẫn sử dụng

Người sử dụng mô-đun hạt nhân là các thành phần hạt nhân khác cần sử dụng thuật toán mã hóa. Mô-đun hạt nhân không cung cấp logic bổ sung trong việc sử dụng các thuật toán và không lưu trữ bất kỳ tham số nào vượt quá thời gian cần thiết để thực hiện thao tác mã hóa.

Việc sử dụng các thuật toán nhằm mục đích tuân thủ FIPS được giới hạn ở các thuật toán đã được phê duyệt. Để đáp ứng yêu cầu "chỉ báo dịch vụ" FIPS 140-3, mô-đun này cung cấp hàm fips140_is_approved_service để cho biết liệu thuật toán có được phê duyệt hay không.

Lỗi tự kiểm tra

Trong trường hợp tự kiểm tra không thành công, mô-đun hạt nhân sẽ khiến hạt nhân hoảng loạn và thiết bị không tiếp tục khởi động. Nếu việc khởi động lại thiết bị không giải quyết được sự cố, thiết bị phải khởi động vào chế độ khôi phục để khắc phục sự cố bằng cách flash lại thiết bị.


  1. Dự kiến ​​việc triển khai AES-GCM của mô-đun có thể được "phê duyệt thuật toán" nhưng không được "phê duyệt mô-đun". Chúng có thể được xác thực, nhưng AES-GCM không thể được coi là thuật toán được phê duyệt theo quan điểm mô-đun FIPS. Điều này là do các yêu cầu mô-đun FIPS dành cho GCM không tương thích với các triển khai GCM không tạo IV của riêng chúng.