전체 디스크 암호화

전체 디스크 암호화는 암호화된 키를 사용하여 Android 기기에서 사용자 데이터를 인코딩하는 프로세스입니다. 기기가 암호화되면 사용자가 생성한 모든 데이터는 디스크에 커밋되기 전에 자동으로 암호화되며 모든 읽기 작업은 데이터를 호출 프로세스로 반환하기 전에 자동으로 복호화합니다.

전체 디스크 암호화는 Android 4.4에서 도입되었지만 Android 5.0에는 아래와 같은 새로운 기능이 도입되었습니다.

  • 첫 번째 부팅이 오래 걸리는 것을 방지하기 위해 데이터 파티션에서 사용된 블록만 암호화하는 빠른 암호화를 구축했습니다. 현재는 ext4 및 f2fs 파일 시스템에서만 빠른 암호화를 지원합니다.
  • 첫 번째 부팅에서 암호화되도록 forceencrypt fstab 플래그를 추가했습니다.
  • 비밀번호가 없는 패턴 및 암호화 지원을 추가했습니다.
  • TEE(신뢰할 수 있는 실행 환경) 서명 기능(예: TrustZone)을 사용하는 암호화 키와 관련된 하드웨어 지원 저장소를 추가했습니다. 자세한 내용은 암호화된 키 저장을 참조하세요.

주의: Android 5.0으로 업그레이드된 후 암호화된 기기는 초기화 후 암호화되지 않은 상태로 되돌릴 수 있습니다. 최초 부팅 시에 암호화된 새 Android 5.0 기기는 암호화되지 않은 상태로 되돌릴 수 없습니다.

Android 전체 디스크 암호화의 원리

Android 전체 디스크 암호화는 블록 기기 레이어에서 작동하는 커널 기능인 dm-crypt에 기반합니다. 따라서 암호화는 삽입된 MultiMediaCard(eMMC) 및 커널에 블록 기기로 제시되는 유사한 플래시 기기와 호환됩니다. 원시 NAND 플래시 칩과 직접적으로 통신하는 YAFFS의 경우에는 암호화가 불가능합니다.

암호화 알고리즘은 암호 블록 체인(CBC) 및 ESSIV:SHA256이 있는 128 고급 암호화 표준(AES)입니다. 마스터 키는 OpenSSL 라이브러리 호출을 통해 128비트 AES로 암호화됩니다. 키에 128비트 이상을 사용해야 하며 256은 선택사항입니다.

참고: OEM은 마스터 키 암호화에 128비트 이상을 사용할 수 있습니다.

Android 5.0 버전에는 다음 4개의 암호화 상태가 있습니다.

  • 기본값
  • PIN
  • 비밀번호
  • 패턴

처음 부팅하면 기기는 임의로 생성된 128비트 마스터 키를 생성하여 기본 비밀번호와 저장된 솔트로 해시합니다. 기본 비밀번호는 'default_password'입니다. 그러나 결과로 반환되는 해시는 서명 해시를 사용하여 마스터 키를 암호화하는 TEE(예: TrustZone)를 통해서도 서명됩니다.

Android 오픈소스 프로젝트 cryptfs.cpp 파일에서 정의된 기본 비밀번호를 확인할 수 있습니다.

사용자가 기기에서 PIN/패스 또는 비밀번호를 설정하면 128비트 키만 다시 암호화되어 저장됩니다 즉, 사용자 PIN/패스/패턴이 변경되더라도 사용자 데이터가 다시 암호화되지 않습니다. 관리 기기에는 PIN, 패턴 또는 비밀번호 제한이 적용될 수 있습니다.

암호화는 initvold에서 관리합니다. initvold를 호출하며 vold는 init에서 이벤트를 트리거하는 속성을 설정합니다. 시스템의 다른 부분에서도 속성을 확인하여 보고서 상태와 같은 작업을 실행하거나 비밀번호를 요구하거나 치명적인 오류 발생 시에는 초기화하라는 메시지를 표시합니다. vold에서 암호화 기능을 호출하기 위해 시스템은 명령줄 도구 vdccryptfs 명령어인 checkpw, restart, enablecrypto, changepw, cryptocomplete, verifypw, setfield, getfield, mountdefaultencrypted, getpwtype, getpw, clearpw를 사용합니다.

/data를 암호화, 복호화 또는 완전 삭제하려면 /data를 마운트하면 안 됩니다. 그러나 모든 사용자 인터페이스(UI)를 표시하려면 프레임워크가 시작되어야 하며 프레임워크는 /data를 실행해야 합니다. 이 문제를 해결하기 위해 임시 파일 시스템이 /data에 마운트됩니다. 그러면 Android에서 필요에 따라 비밀번호를 요구하거나 진행률을 표시하거나 데이터 완전 삭제를 제안할 수 있습니다. 임시 파일 시스템에서 실제 /data 파일 시스템으로 전환하려면 시스템이 임시 파일 시스템에서 파일이 열려 있는 모든 프로세스를 중지하고 실제 /data 파일 시스템에서 그러한 프로세스를 다시 시작해야 하는 제한이 있습니다. 이렇게 하려면 모든 서비스가 core, main, late_start라는 세 가지 그룹 중 하나에 있어야 합니다.

  • core: 시작되면 종료되지 않습니다.
  • main: 디스크 비밀번호가 입력되면 종료된 다음 다시 시작됩니다.
  • late_start: /data가 복호화 및 마운트될 때까지 시작되지 않습니다.

이러한 작업을 트리거하기 위해 vold.decrypt 속성이 다양한 문자열로 설정됩니다. 서비스를 종료하고 다시 시작하려면 다음과 같은 init 명령어를 사용합니다.

  • class_reset: 서비스를 중지하지만 class_start로 다시 시작할 수 있습니다.
  • class_start: 서비스를 다시 시작합니다.
  • class_stop: 서비스를 중지하고 SVC_DISABLED 플래그를 추가합니다. 중지된 서비스는 class_start에 응답하지 않습니다.

흐름

암호화된 기기에는 네 가지 흐름이 있습니다. 기기는 한 번만 암호화되고 일반적인 부팅 흐름을 따릅니다.

  • 이전에 암호화되지 않은 기기를 암호화
    • forceencrypt로 새 기기를 암호화: 최초 부팅 시의 필수 암호화(Android L부터)
    • 기존 기기 암호화: 사용자가 시작한 암호화(Android K 이하)
  • 암호화된 기기 부팅
    • 비밀번호가 없는 암호화된 기기를 시작: 설정된 비밀번호가 없는 암호화된 기기를 부팅(Android 5.0 이상을 실행하는 기기와 관련 있음)
    • 비밀번호가 있는 암호화된 기기 시작: 설정된 비밀번호가 있는 암호화된 기기를 부팅

이러한 흐름 외에 기기에서는 /data 암호화에도 실패할 수 있습니다. 각 흐름은 아래에 자세히 설명되어 있습니다.

forceencrypt로 새 기기 암호화

Android 5.0 기기를 위한 일반적인 최초 부팅입니다.

  1. forceencrypt 플래그로 암호화되지 않은 파일 시스템 감지

    /data는 암호화되어 있지 않지만 암호화되어야 합니다. forceencrypt에서 명령하기 때문입니다. /data를 마운트 해제합니다.

  2. /data 암호화 시작

    vold.decrypt = "trigger_encryption"init.rc를 트리거하므로 vold가 비밀번호 없이 /data를 암호화하게 됩니다. 새 기기이므로 설정되는 내용은 없습니다.

  3. tmpfs 마운트

    voldro.crypto.tmpfs_options에서 tmpfs 옵션을 사용하여 tmpfs /data를 마운트하고 속성 vold.encrypt_progress를 0으로 설정합니다. vold가 암호화된 시스템을 부팅하기 위해 tmpfs /data를 준비하고 속성 vold.decrypttrigger_restart_min_framework로 설정합니다.

  4. 진행률 표시를 위한 프레임워크 불러오기

    이 기기에는 암호화할 데이터가 거의 없으며 암호화가 매우 빠르게 발생하므로 진행률 표시줄이 실제로 표시되지 않을 때가 많습니다. 진행률 UI에 관한 자세한 내용은 기존 기기 암호화를 참조하세요.

  5. /data가 암호화되면 프레임워크 중단

    volddefaultcrypto 서비스를 시작하는 trigger_default_encryption으로 vold.decrypt를 설정합니다. 이 경우 암호화된 기본 사용자 데이터를 마운트하기 위한 아래 흐름이 시작됩니다. trigger_default_encryption은 암호화 유형을 검사하여 /data가 비밀번호로 또는 비밀번호 없이 암호화되었는지 확인합니다. Android 5.0 기기는 최초 부팅 시에 암호화되므로 설정된 비밀번호가 없어야 합니다. 따라서 /data를 복호화 및 마운트합니다.

  6. /data 마운트

    그러면 initinit.rc에서 설정된 ro.crypto.tmpfs_options에서 선택하는 매개변수를 사용하여 tmpfs RAMDisk에 /data를 마운트합니다.

  7. 프레임워크 시작

    voldtrigger_restart_framework로 설정하여 일반적인 부팅 프로세스를 계속합니다.

기존 기기 암호화

L로 이전된 암호화되지 않은 Android K 또는 이전 버전의 기기를 암호화할 때 발생하는 상황입니다.

이 프로세스는 사용자에 의해 시작되며 코드에서는 '인플레이스 암호화'라고 합니다. 사용자가 기기를 암호화하기로 하면 UI에서는 암호화 프로세스 완료를 위한 전력이 충분한지 보기 위해 배터리가 완전히 충전되었고 AC 어댑터가 연결되어 있는지 확인합니다.

경고: 암호화가 끝나기 전에 기기가 방전 및 종료되면 파일 데이터가 일부만 암호화된 상태로 남습니다. 이 경우 기기를 초기화해야 하며 모든 데이터가 사라집니다.

인플레이스 암호화를 사용 설정하기 위해 vold는 루프를 시작하여 실제 블록 기기의 각 섹터를 읽고 암호화 블록 기기에 씁니다. vold는 섹터를 읽고 쓰기 전에 섹터가 사용되고 있는지 확인하므로 데이터가 거의 없거나 전혀 없는 새 기기에서 암호화가 훨씬 빠르게 이루어집니다.

기기 상태: ro.crypto.state = "unencrypted"를 설정하고 on nonencrypted init 트리거를 실행하여 부팅을 계속합니다.

  1. 비밀번호 확인

    UI는 passwd가 사용자의 잠금 화면 비밀번호인 cryptfs enablecrypto inplace 명령어를 사용하여 vold를 호출합니다.

  2. 프레임워크 중단

    vold가 오류를 확인하고 암호화할 수 없는 경우 -1을 반환하며 로그에 이유를 출력합니다. 암호화할 수 있는 경우 속성 vold.decrypttrigger_shutdown_framework로 설정합니다. 이로 인해 init.rc가 클래스 late_startmain에서 서비스를 중지합니다.

  3. 암호화 바닥글 생성
  4. 현재 위치 파일 생성
  5. 재부팅
  6. 현재 위치 파일 감지
  7. /data 암호화 시작

    그러면 vold가 암호화 매핑을 설정하여 실제 블록 기기에 매핑되지만 각 섹터를 작성된 대로 암호화하고 읽은 대로 복호화하는 가상 암호화 블록 기기를 생성합니다. 그런 다음 vold는 암호화 메타데이터를 생성 및 작성합니다.

  8. 암호화 도중 tmpfs 마운트

    voldro.crypto.tmpfs_options에서 tmpfs 옵션을 사용하여 tmpfs /data를 마운트하고 속성 vold.encrypt_progress를 0으로 설정합니다. vold가 암호화된 시스템을 부팅하기 위해 tmpfs /data를 준비하고 속성 vold.decrypttrigger_restart_min_framework로 설정합니다.

  9. 진행률 표시를 위한 프레임워크 불러오기

    trigger_restart_min_framework 로 인해 init.rc에서 서비스의 main 클래스가 시작됩니다. vold.encrypt_progress가 0으로 설정된 것을 확인한 프레임워크는 진행률 표시줄 UI를 불러오며 UI에서는 속성을 5초마다 쿼리하여 진행률 표시줄을 업데이트합니다. 암호화 루프는 다른 백분율의 파티션을 암호화할 때마다 vold.encrypt_progress를 업데이트합니다.

  10. /data가 암호화되면 암호화 바닥글 업데이트

    /data가 성공적으로 암호화되면 vold는 메타데이터에서 ENCRYPTION_IN_PROGRESS 플래그를 삭제합니다.

    기기가 성공적으로 잠금 해제되면 비밀번호를 사용하여 마스터 키를 암호화하고 암호화 바닥글이 업데이트됩니다.

    어떤 이유로 재부팅에 실패하면 vold는 속성 vold.encrypt_progresserror_reboot_failed로 설정하며 UI에는 사용자에게 버튼을 눌러 재부팅하라는 메시지가 표시됩니다. 이는 발생할 것으로 예상되지 않습니다.

기본 암호화로 암호화된 기기를 시작

비밀번호가 없는 암호화된 기기를 부팅하는 경우에 발생하는 상황입니다. Android 5.0 기기는 최초 부팅 시에 암호화되므로 설정된 비밀번호가 없으며 따라서 이는 기본 암호화 상태입니다.

  1. 비밀번호 없이 암호화된 /data 감지

    /data를 마운트할 수 없고 플래그 encryptable 또는 forceencrypt중 하나가 설정되어 있으므로 Android 기기가 암호화되었다고 감지합니다.

    volddefaultcrypto 서비스를 시작하는 trigger_default_encryption으로 vold.decrypt를 설정합니다. trigger_default_encryption은 암호화 유형을 검사하여 /data가 비밀번호로 또는 비밀번호 없이 암호화되었는지 확인합니다.

  2. /data 복호화

    기기를 사용할 수 있도록 블록 기기를 통해 dm-crypt 기기를 생성합니다.

  3. /data 마운트

    그러면 vold는 복호화된 실제 /data 파티션을 마운트한 다음 새 파티션을 준비합니다. 속성 vold.post_fs_data_done을 0으로 설정하고 vold.decrypttrigger_post_fs_data로 설정합니다. 이로 인해 init.rcpost-fs-data 명령어를 실행하게 됩니다. 명령어는 필요한 모든 디렉터리 또는 링크를 생성한 다음 vold.post_fs_data_done을 1로 설정합니다.

    vold가 이 속성에서 1을 확인하면 속성 vold.decrypttrigger_restart_framework.로 설정합니다. 이로 인해 init.rc가 클래스 main에서 서비스를 다시 시작하고 부팅 이후 처음으로 클래스 late_start에서도 서비스를 시작하게 됩니다.

  4. 프레임워크 시작

    이제 프레임워크에서 복호화된 /data를 사용하여 모든 서비스를 부팅하고 시스템을 사용할 수 있습니다.

기본 암호화 없이 암호화된 기기를 시작

비밀번호가 설정된 암호화된 기기를 부팅하면 발생하는 상황입니다. 기기의 비밀번호는 PIN, 패턴이나 비밀번호일 수 있습니다.

  1. 비밀번호로 암호화된 기기 감지

    플래그 ro.crypto.state = "encrypted" 때문에 Android 기기가 암호화되었다고 감지합니다.

    voldvold.decrypttrigger_restart_min_framework로 설정합니다. /data가 비밀번호로 암호화되었기 때문입니다.

  2. tmpfs 마운트

    init는 다섯 개의 속성을 설정하여 init.rc에서 전달된 매개변수로 /data에 주어진 초기 마운트 옵션을 저장합니다. vold는 이러한 속성을 사용하여 암호화 매핑을 설정합니다.

    1. ro.crypto.fs_type
    2. ro.crypto.fs_real_blkdev
    3. ro.crypto.fs_mnt_point
    4. ro.crypto.fs_options
    5. ro.crypto.fs_flags (0x 뒤에 붙는 ASCII 8자리 16진수)
  3. 비밀번호를 요구하도록 프레임워크 시작

    프레임워크가 시작되고 vold.decrypttrigger_restart_min_framework로 설정되어 있음을 확인합니다. 이를 통해 프레임워크가 tmpfs /data 디스크에서 부팅되고 사용자 비밀번호를 가져와야 한다고 인지합니다.

    그러나 먼저 디스크가 제대로 암호화되었는지 확인해야 합니다. 명령어 cryptfs cryptocompletevold로 전송합니다. vold는 암호화가 성공적으로 완료된 경우 0을 반환하며 내부 오류 발생 시에는 -1을, 암호화가 성공적으로 완료되지 않은 경우에는 -2를 반환합니다. voldCRYPTO_ENCRYPTION_IN_PROGRESS 플래그의 암호화 메타데이터를 확인하여 이를 파악합니다. 설정된 경우에는 암호화 프로세스가 중단된 것이므로 기기에서 사용할 수 있는 데이터가 없습니다. vold가 오류를 반환하는 경우에는 UI에서는 기기를 재부팅하고 초기화하라는 메시지를 사용자에게 표시하고 사용자가 이를 실행할 수 있도록 버튼을 제공해야 합니다.

  4. 비밀번호로 데이터 복호화

    cryptfs cryptocomplete가 성공하면 프레임워크에 디스크 비밀번호를 요구하는 UI가 표시됩니다. UI는 명령어 cryptfs checkpwvold로 전송하여 비밀번호를 확인합니다. 비밀번호가 올바르면(복호화된 /data를 임시 위치에 성공적으로 마운트한 다음 마운트 해제하여 판단됨) vold는 복호화된 블록 기기의 이름을 속성 ro.crypto.fs_crypto_blkdev에 저장하고 UI에 상태 0을 반환합니다. 비밀번호가 올바르지 않으면 UI에 -1을 반환합니다.

  5. 프레임워크 중지

    UI는 암호화 부팅 그래픽을 배치한 다음 명령어 cryptfs restartvold를 호출합니다. vold는 속성 vold.decrypttrigger_reset_main으로 설정하므로 init.rcclass_reset main을 실행하게 됩니다. 이렇게 하면 기본 클래스의 모든 서비스가 중지되어 tmpfs /data를 마운트 해제할 수 있습니다.

  6. /data 마운트

    그러면 vold는 복호화된 실제 /data 파티션을 마운트하고 새 파티션을 준비합니다(최초 버전에서 지원되지 않는 완전 삭제 옵션으로 암호화된 경우에는 준비될 수 없었음). 속성 vold.post_fs_data_done을 0으로 설정하고 vold.decrypttrigger_post_fs_data로 설정합니다. 이로 인해 init.rcpost-fs-data 명령어를 실행하게 됩니다. 명령어는 필요한 모든 디렉터리 또는 링크를 생성한 다음 vold.post_fs_data_done을 1로 설정합니다. vold가 이 속성에서 1을 확인하면 속성 vold.decrypttrigger_restart_framework로 설정합니다. 이로 인해 init.rc가 클래스 main에서 서비스를 다시 시작하고 부팅 이후 처음으로 클래스 late_start에서도 서비스를 시작합니다.

  7. 전체 프레임워크 시작

    이제 프레임워크에서 복호화된 /data 파일 시스템을 사용하여 모든 서비스를 부팅하고 시스템을 사용할 수 있습니다.

실패

복호화에 실패한 기기에는 다음과 같은 이유로 오류가 발생할 수 있습니다. 기기는 부팅을 위한 정상적인 일련의 단계에 걸쳐 시작됩니다.

  1. 비밀번호로 암호화된 기기 감지
  2. tmpfs 마운트
  3. 비밀번호를 요구하도록 프레임워크 시작

하지만 프레임워크가 열리면 기기에 다음과 같은 오류가 발생할 수 있습니다.

  • 비밀번호가 일치하지만 데이터를 복호화할 수 없음
  • 사용자가 잘못된 비밀번호를 30회 입력함

이러한 오류가 해결되지 않을 경우 사용자에게 초기화 관련 메시지가 표시됩니다.

vold가 암호화 프로세스 중에 오류를 감지하고 아직 어떤 데이터도 제거되지 않고 프레임워크가 실행되는 경우 vold는 속성 vold.encrypt_progress error_not_encrypted로 설정합니다. UI는 사용자에게 재부팅하라는 메시지를 표시하고 암호화 프로세스가 시작되지 않았음을 알립니다. 프레임워크가 해제되었지만 아직 진행률 표시줄 UI는 실행되지 않은 상태에서 오류가 발생하면 vold는 시스템을 재부팅합니다. 재부팅이 실패하면 vold.encrypt_progresserror_shutting_down으로 설정하고 -1을 반환하지만 오류를 포착할 수 있는 요소는 없습니다. 이러한 상황은 발생하지 않을 것으로 예상됩니다.

vold는 암호화 프로세스 중에 오류를 감지하면 vold.encrypt_progresserror_partially_encrypted로 설정하고 -1을 반환합니다. 그러면 UI는 암호화에 실패했다는 메시지를 표시하고 사용자가 기기를 초기화할 수 있도록 버튼을 제공합니다.

암호화된 키 저장

암호화된 키는 암호화 메타데이터에 저장됩니다. 하드웨어 지원은 TEE(신뢰할 수 있는 실행 환경) 서명 기능을 사용하여 구현됩니다. 이전에는 scrypt를 사용자의 비밀번호와 저장된 솔트에 적용하여 생성된 키로 마스터 키를 암호화했습니다. Google은 키를 오프박스 공격으로부터 보호하기 위해 결과로 반환된 키를 저장된 TEE 키로 서명하여 알고리즘을 확장했습니다. 그러면 결과로 반환된 서명이 scrypt의 추가 적용으로 인해 적절한 길이의 키로 변환됩니다. 그리고 이 키는 마스터 키를 암호화하고 복호화하는 데 사용됩니다. 이 키를 저장하는 방법은 다음과 같습니다.

  1. 임의의 16바이트 디스크 암호화 키(DEK)와 16바이트 솔트를 생성합니다.
  2. scrypt를 사용자 비밀번호와 솔트에 적용하여 32비트 중간 키 1(IK1)을 생성합니다.
  3. 제로바이트의 IK1을 하드웨어에 결합된 비공개 키(HBK)의 크기에 패딩합니다. 구체적인 패딩 방식: 00 || IK1 || 00..00, 1제로바이트, 32 IK1바이트, 223제로바이트
  4. 패딩된 IK1을 HBK로 서명하여 256바이트 IK2를 생성합니다.
  5. scrypt를 IK2 및 솔트(2단계와 동일한 솔트)에 적용하여 32바이트 IK3을 생성합니다.
  6. IK3의 최초 16바이트를 KEK로, 마지막 16바이트를 IV로 사용합니다.
  7. AES_CBC, 키 KEK, 초기화 벡터 IV로 DEK를 암호화합니다.

비밀번호 변경

사용자가 설정에서 비밀번호를 변경하거나 제거하기로 하면 UI는 명령어 cryptfs changepwvold로 전송하며 vold는 새 비밀번호로 디스크 마스터 키를 다시 암호화합니다.

암호화 속성

voldinit는 속성을 설정하여 서로 통신합니다. 다음은 암호화에 사용 가능한 속성 목록입니다.

Vold 속성

속성 설명
vold.decrypt trigger_encryption 비밀번호 없이 드라이브를 암호화합니다.
vold.decrypt trigger_default_encryption 드라이브가 비밀번호 없이 암호화되었는지 확인합니다. 비밀번호 없이 암호화된 경우 드라이브를 복호화하여 마운트하고 그렇지 않은 경우에는 vold.decrypt를 trigger_restart_min_framework로 설정합니다.
vold.decrypt trigger_reset_main vold에 의해 설정되며 디스크 비밀번호를 요구하는 UI를 종료합니다.
vold.decrypt trigger_post_fs_data vold에 의해 설정되며 필요한 디렉터리 등으로 /data를 준비합니다.
vold.decrypt trigger_restart_framework vold에 의해 설정되며 실제 프레임워크와 모든 서비스를 시작합니다.
vold.decrypt trigger_shutdown_framework vold에 의해 설정되며 전체 프레임워크를 종료하여 암호화를 시작합니다.
vold.decrypt trigger_restart_min_framework vold에 의해 설정되며 ro.crypto.state의 값에 따라 암호화를 위한 진행률 표시줄 UI를 시작하거나 비밀번호를 요구합니다.
vold.encrypt_progress 프레임워크가 시작되면 이 속성이 설정된 경우 진행률 표시줄 UI 모드로 전환됩니다.
vold.encrypt_progress 0 to 100 진행률 표시줄 UI에 설정된 백분율 값이 표시되어야 합니다.
vold.encrypt_progress error_partially_encrypted 진행률 표시줄 UI에 암호화 실패 메시지가 표시되어야 하며 사용자에게 기기 초기화를 위한 옵션을 제공해야 합니다.
vold.encrypt_progress error_reboot_failed 진행률 표시줄 UI에 암호화 완료 메시지가 표시되어야 하며 사용자에게 기기 재부팅을 위한 버튼을 제공해야 합니다. 이 오류는 발생하지 않을 것으로 예상됩니다.
vold.encrypt_progress error_not_encrypted 진행률 표시줄 UI에 오류가 발생했으며 암호화되었거나 손실된 데이터가 없다는 메시지가 표시되어야 하며 사용자에게 시스템 재부팅을 위한 버튼을 제공해야 합니다.
vold.encrypt_progress error_shutting_down 진행률 표시줄 UI가 실행되지 않고 있으므로 이 오류에 누가 응답할지 알 수 없습니다. 어차피 발생하면 안 되는 상황입니다.
vold.post_fs_data_done 0 vold.decrypttrigger_post_fs_data로 설정하기 직전에 vold에 의해 설정됩니다.
vold.post_fs_data_done 1 init.rc에 의해 설정되거나 작업 post-fs-data를 끝낸 직후에 init.rc에 의해 설정됩니다.

init 속성

속성 설명
ro.crypto.fs_crypto_blkdev 나중에 vold 명령어 restart에 의해 사용될 수 있도록 vold 명령어 checkpw에 의해 설정됩니다.
ro.crypto.state unencrypted 이 시스템이 암호화되지 않은 /data ro.crypto.state encrypted로 실행되는 것을 나타내기 위해 init에 의해 설정됩니다. 이 시스템이 암호화된 /data로 실행되는 것을 나타내기 위해 init에 의해 설정됩니다.

ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags

이러한 다섯 가지 속성은 init.rc에서 전달된 매개변수로 /data를 마운트하려고 할 때 init에 의해 설정됩니다. vold는 이러한 속성을 사용하여 암호화 매핑을 설정합니다.
ro.crypto.tmpfs_options tmpfs /data 파일 시스템을 마운트할 때 init에서 사용해야 하는 옵션과 함께 init.rc에 의해 설정됩니다.

Init 작업

on post-fs-data
on nonencrypted
on property:vold.decrypt=trigger_reset_main
on property:vold.decrypt=trigger_post_fs_data
on property:vold.decrypt=trigger_restart_min_framework
on property:vold.decrypt=trigger_restart_framework
on property:vold.decrypt=trigger_shutdown_framework
on property:vold.decrypt=trigger_encryption
on property:vold.decrypt=trigger_default_encryption