
ãã©ãã€ã¢ã¯æ±ãããŸããïŒ ããããããã¯æ³åŸã§èšŽè¿œãããŠããŸããã ãã®ãããLinux Kernel 4.1ã§ã¯ãåã
ã®ãã¡ã€ã«ããã³ãã£ã¬ã¯ããªã®ã¬ãã«ã§ext4ãã¡ã€ã«ã·ã¹ãã æå·åã®ãµããŒãã远å ãããŠããŸãã æå·åã§ããã®ã¯ç©ºã®ãã£ã¬ã¯ããªã®ã¿ã§ãã ãã®ãããªãã£ã¬ã¯ããªã«äœæããããã¹ãŠã®ãã¡ã€ã«ãæå·åãããŸãã ãã¡ã€ã«ã§ã¯ãã¡ã€ã«åãšã³ã³ãã³ãã®ã¿ãæå·åãããã¡ã¿ããŒã¿ã¯æå·åãããŸãããã€ã³ã©ã€ã³ããŒã¿ïŒãµã€ãºã60ãã€ããè¶
ããªããã¡ã€ã«ããŒã¿ãinodeã«æ ŒçŽãããå ŽåïŒã¯ãã¡ã€ã«ã§ãµããŒããããŸããã ãã¡ã€ã«ã®ã³ã³ãã³ãã®åŸ©å·åã¯ã¡ã¢ãªå
ã§çŽæ¥å®è¡ããããããæå·åã¯ã¯ã©ã¹ã¿ãŒãµã€ãºãPAGE_SIZEãšäžèŽããå Žåã«ã®ã¿å©çšã§ããŸãã 4Kã«çããã
1.ä»çµã¿
æåã«ãããã€ãã®äŸ¿å©ãªã³ãã³ããåŠã¶å¿
èŠããããŸãã
æå·åãªãã·ã§ã³ã䜿çšããŠããªã¥ãŒã ããã©ãŒããããã# mkfs.ext4 -O encrypt /dev/xxx
æ¢åã®ããªã¥ãŒã ã§æå·åãªãã·ã§ã³ãæå¹ã«ãã # tune2fs -O encrypt /dev/xxx
æå·åããŒãäœæãã # mount /dev/xxx /mnt/xxx $ e4crypt add_key Enter passphrase (echo disabled): Added key with descriptor [8e679e4449bb9235]
ããŒãäœæãããšããæå·åãµããŒãã®ããããªã¥ãŒã ãããŠã³ãããå¿
èŠããããŸããããããªããšãe4cryptã¯ãNo salt values availableããšã©ãŒãçæããŸãã æå·åãªãã·ã§ã³ãæã€è€æ°ã®ããªã¥ãŒã ãããŠã³ããããŠããå Žåãããããã®ããŒãäœæãããŸãã e4cryptãŠãŒãã£ãªãã£ã¯e2fsprogsã®äžéšã§ãã
ããŒã¯Linuxã«ãŒãã«ããŒãªã³ã°ã«è¿œå ãããŸã[1]ã
ããŒã®ãªã¹ããèªã $ keyctl show Session Keyring 771961813
æå·åã«äœ¿çšãããããŒã®ã¿ã€ãã¯ããã°ãªã³ãã§ãã ãã®ã¿ã€ãã®ããŒã®ã³ã³ãã³ãïŒãã€ããŒãïŒã¯ãŠãŒã¶ãŒç©ºéããã¢ã¯ã»ã¹ã§ããŸãã-èªã¿åãããã€ããå°å·ã³ãã³ãã®keyctlã¯ãšã©ãŒãè¿ããŸãã ãã®äŸã§ã¯ãããŒã®ãã¬ãã£ãã¯ã¹ã¯ãext4ãã§ããããfscryptãã«ããããšãã§ããŸãã keyctlãã·ã¹ãã ã«ååšããªãå Žåã¯ãkeyutilsããã±ãŒãžãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã
æå·åããããã£ã¬ã¯ããªã®äœæ $ mkdir /mnt/xxx/encrypted_folder $ e4crypt set_policy 8e679e4449bb9235 /mnt/xxx/encrypted_folder/ Key with descriptor [8e679e4449bb9235] applied to /mnt/xxx/encrypted_folder/.
ããã§ãset_policyã³ãã³ãã«ã¯ããã¬ãã£ãã¯ã¹ïŒext4ïŒãšã¿ã€ãïŒãã°ãªã³ïŒãæå®ããã«ãäœæãããããŒã®ãã³ãã«ãæž¡ãããŸãã è€æ°ã®ãã£ã¬ã¯ããªãåãããŒã§æå·åã§ããŸãã ç°ãªãããŒã䜿çšããŠãç°ãªããã£ã¬ã¯ããªãæå·åã§ããŸãã ãã£ã¬ã¯ããªãæå·åãããŠããããŒã確èªããã«ã¯ã次ã®ã³ãã³ããå®è¡ããå¿
èŠããããŸãã
$ e4crypt get_policy /mnt/xxx/encrypted_folder/ /mnt/xxx/encrypted_folder/: 8e679e4449bb9235
æå·åããããã£ã¬ã¯ããªã«å¥ã®ã»ãã¥ãªãã£ããªã·ãŒãã€ã³ã¹ããŒã«ãããšå€±æããŸãã
$ e4crypt add_key Enter passphrase (echo disabled): Added key with descriptor [9dafe822ae6e7994] $ e4crypt set_policy 9dafe822ae6e7994 /mnt/xxx/encrypted_folder/ Error [Invalid argument] setting policy. The key descriptor [9dafe822ae6e7994] may not match the existing encryption context for directory [/mnt/xxx/encrypted_folder/].
ãã ãããã®ãããªãã£ã¬ã¯ããªã¯ç°¡åã«åé€ã§ããŸãã
$ rm -rf /mnt/xxx/encrypted_folder/ $ ll /mnt/xxx total 24 drwxr-xr-x 3 user user 4096 Apr 21 15:14 ./ drwxr-xr-x 4 root root 4096 Mar 29 15:30 ../ drwx
ãã¡ã€ã«æå·å $ echo "My secret file content" > /mnt/xxx/encrypted_folder/my_secrets.txt $ cat /mnt/xxx/encrypted_folder/my_secrets.txt My secret file content $ ll /mnt/xxx/encrypted_folder/ total 12 drwxr-xr-x 2 user user 4096 Apr 20 14:25 ./ drwxr-xr-x 5 user user 4096 Apr 20 14:15 ../ -rw-r
ãã£ã¬ã¯ããªãæå·åãããããŒã¹ãã¢ã«ããŒãããéãããã£ã¬ã¯ããªå
ã®ãã¡ã€ã«åãšãã¡ã€ã«ã®å
容ã¯å©çšå¯èœã§ãã ããŒãç¡å¹ã«ãããšããã£ã¬ã¯ããªãžã®ã¢ã¯ã»ã¹ã¯å³ããå¶éãããŸãã
$ keyctl revoke 803843970 $ keyctl show Session Keyring 771961813
ããŒã¯ãã£ã³ã»ã«ããããã£ã¬ã¯ããªã®å
容ãèªã¿åããŸãïŒ
$ ll /mnt/xxx/encrypted_folder/ total 12 drwxr-xr-x 2 user user 4096 Apr 20 14:25 ./ drwxr-xr-x 5 user user 4096 Apr 20 14:15 ../ -rw-r
ãã¡ã€ã«åã¯ãã§ã«abyrvalgã§ãã ãããããŸã ãã¡ã€ã«ãèªã¿åãããšããŸãïŒ
$ cat /mnt/xxx/encrypted_folder/BhqTNRNHDBwpa9S1qCaXwC cat: /mnt/xxx/encrypted_folder/BhqTNRNHDBwpa9S1qCaXwC: Required key not available
æ³šïŒ Ubuntu 17.04ïŒã«ãŒãã«4.10.0-19ïŒã§ã¯ãåããŠã³ãããåã«ããŒãåé€ããåŸããã£ã¬ã¯ããªã«ã¢ã¯ã»ã¹ã§ããŸãã
$ keyctl show Session Keyring 771961813 --alswrv 1000 65534 keyring: _uid_ses.1000 771026675 --alswrv 1000 65534 \_ keyring: _uid.1000 $ e4crypt get_policy /mnt/xxx/encrypted_folder/ /mnt/xxx/encrypted_folder/: 8e679e4449bb9235
ãã£ã¬ã¯ããªã¯ãèšè¿°åã8e679e4449bb9235ãã®ããŒã§æå·åãããŸãã ããŒã¯ãªããžããªã«ãããŸããã ããã«ããããããããã¡ã€ã«ã®ãã£ã¬ã¯ããªãšã³ã³ãã³ãã¯èªç±ã«å©çšã§ããŸãã
$ ll /mnt/xxx/encrypted_folder/ total 12 drwxr-xr-x 2 user user 4096 Apr 20 14:25 ./ drwxr-xr-x 5 user user 4096 Apr 20 14:15 ../ -rw-r
åããŠã³ãïŒ
# umount /dev/xxx # mount /dev/xxx /mnt/xxx $ ll /mnt/xxx/encrypted_folder/ total 12 drwxr-xr-x 2 user user 4096 Apr 20 14:25 ./ drwxr-xr-x 5 user user 4096 Apr 20 14:15 ../ -rw-r
2.ãã¡ã€ã«ã·ã¹ãã ã®å€æŽ
ã¹ãŒããŒãããã¯å
ïŒæå·å察å¿ããªã¥ãŒã ã«èšå®ãããs_feature_incompatãªãã·ã§ã³ã«ã¯ãEXT4_FEATURE_INCOMPAT_ENCRYPTãã©ã°ãå«ãŸããŠããŸãã
s_encrypt_algos [4]-æå·åã¢ã«ãŽãªãºã ãä¿åããŸãã çŸæç¹ã§ã¯ããã¯ïŒ
s_encrypt_algos [0] = EXT4_ENCRYPTION_MODE_AES_256_XTS;
s_encrypt_algos [1] = EXT4_ENCRYPTION_MODE_AES_256_CTS;
s_encrypt_pw_salt-ãã©ãŒãããäžã«ãèšå®ãããŸãã
iããŒãïŒi_flagsã«ã¯EXT4_ENCRYPT_FLãã©ã°ãå«ãŸããŠããããããããªããžã§ã¯ããæå·åãããŠãããšå€æã§ããŸãã
æå·åããããã£ã¬ã¯ããªæ§é ãã£ã¬ã¯ããªã®å
容ãèªã¿åãã«ã¯ãiããŒãã«ãã£ãŠãã£ã¹ã¯äžã®å Žæãç¹å®ããå¿
èŠããããŸãã
1. iããŒãçªå·ã®æ±ºå®ïŒ $ stat /mnt/xxx/encrypted_folder/ File: /mnt/xxx/encrypted_folder/ Size: 4096 Blocks: 8 IO Block: 4096 directory Device: 811h/2065d Inode: 14 Links: 2
2. iããŒãããŒãã«ã§iããŒããæ€çŽ¢ããŸããAinod 14ã¯0çªç®ã®ã°ã«ãŒãã«å±ããŠããããã0çªç®ã®ã°ã«ãŒãã®èšè¿°åããŒãã«ãèªã¿åãããã®äžã®iããŒãããŒãã«ã®ãããã¯çªå·ãèŠã€ããå¿
èŠããããŸãã ã°ã«ãŒã0ã®èšè¿°åããŒãã«ã¯ãã¹ãŒããŒãããã¯ã«ç¶ãã¯ã©ã¹ã¿ãŒå
ã«ãããŸãã
# dd if=/dev/xxx of=gdt bs=4096 count=1 skip=1
å³ 1. 0çªç®ã®ã°ã«ãŒãã®ããŒãã«èšè¿°åãŸãããããããããããã¯ã®ã¯ã©ã¹ã¿ãŒçªå·ãšiããŒãã®ãããããããã¹ãããããããŒãã«ã®å
é ãã8ãã€ãã®ãªãã»ããã§iããŒãã®ããŒãã«ã®å
é ã®ã¯ã©ã¹ã¿ãŒçªå·ãèªã¿åããŸã-BigEndian圢åŒã®0x00000424ïŒ1060ïŒã ãã£ã¬ã¯ããªã®inode = 14ãããŒãã«å
ã®256ãã€ãã®inodeãµã€ãºã§ã¯ãå
é ãããªãã»ãã0x0D00ã«ãªããŸãã ãããã£ãŠãinodoããŒãã«ã®æåã®ã¯ã©ã¹ã¿ãŒã®ã¿ãèªã¿åãã ãã§ååã§ãã
# dd if=/dev/xxx of=itable bs=4096 count=1 skip=1060
å³ 2. Ainodæå·åãã£ã¬ã¯ããªãiããŒãã§ãi_block []ãã£ãŒã«ãã®å
é ãæ±ºå®ããŸãã ãªããªã ext4ã®å Žåãi_blockã®æåã®2ãã€ãã¯ãšã¯ã¹ãã³ãããªãŒã®ããããŒ-0xF30Aã§ãã æ¬¡ã«ãæå·åããããã£ã¬ã¯ããªãä¿åãããŠãããããã¯çªå·-0x00000402ïŒ1026ïŒã確èªã§ããŸãã ïŒå³ã§ã¯ãi_blockãã£ãŒã«ãå
šäœãéžæãããŠããã®ã§ã¯ãªããæçãª24ãã€ãã®ã¿ãéžæãããŠããŸããæ®ãã®36ãã€ãã¯ãŒãã§åããããŠããŸããïŒ
3.ãã£ã¬ã¯ããªãããã¯ã®èªã¿åãïŒ # dd if=/dev/xxx of=dirdata bs=4096 count=1 skip=1026
å³ 3.æå·åããããã£ã¬ã¯ããªããã³ãããŸããè©³çŽ°ïŒæåã®2ã€ã®ãšã³ããªïŒèµ€ã§åŒ·èª¿è¡šç€ºïŒã¯ããšã³ããªããããšã..ããããããçŸåšã®ãã£ã¬ã¯ããªãšèŠªãã£ã¬ã¯ããªã§ãã çŸåšã®inodãã£ã¬ã¯ããªã¯0x0000000Eãã¬ã³ãŒãé·ã¯0x000Cãã€ãããã¡ã€ã«åã®æåæ°ã¯01ããšã³ããªã¿ã€ã02ã¯ãã£ã¬ã¯ããªã§ãã 以äžã¯ã4ãã€ãå¢ç-2E000000ïŒ2Eã¯æå 'ã'-ããªãªãã«å¯Ÿå¿ïŒã§æŽåããããã£ã¬ã¯ããªã®ååã§ãã
次ã®èŠªãã£ã¬ã¯ããªã«ã¯iããŒã0x00000002ïŒã«ãŒããã£ã¬ã¯ããªïŒããããåãã¬ã³ãŒãé·ã¯0x000Cãååã¯02æåãã¿ã€ãã02ããã®åŸã«ãã£ã¬ã¯ããªåãç¶ã-2E2E0000ïŒ2ãã€ã³ãïŒã
æåŸã«ããã®ãã£ã¬ã¯ããªã®æåŸã®ãšã³ããªã®iããŒãã¯0x0000000Fãã¬ã³ãŒããµã€ãºã¯0x0FDCãååã®æåæ°ã¯0x10ãã¿ã€ã01-ããã¯æå·åããããã¡ã€ã«ã§ãã ã芧ã®ãšããããã®ååã¯äœæãããmy_secrets.txtãšäžèŽããŸããã ãŸããå
ã®ãã¡ã€ã«åã«ã¯14æåãããªããããã®16æåã§ã¯ãããŸããã
泚ïŒç¹ã«æ³šææ·±ãé»åã®èªè
ã¯ã æå·åããããã¡ã€ã«ã¯ãã£ã¬ã¯ããªã®æåŸã®ãšã³ããªã§ããããã®ã¬ã³ãŒããµã€ãºã¯ãããã¯ã®å¢çãåç
§ããå¿
èŠããããŸãã ãã ãã0xFDCã§ã¯ãªãã0x1000-0xC-0xC = 0xFE8ã§ãã ããã¯ããmetadata_csumããªãã·ã§ã³ã䜿çšããŠããªã¥ãŒã ãäœæãããããã§ãããã®ãªãã·ã§ã³ã¯ãUbuntu 16.10以éã§ããã©ã«ãã§èšå®ãããŠããŸãã ãã®ãªãã·ã§ã³ãæå¹ã«ãããšããã®ãããã¯ã®ãã§ãã¯ãµã ãå«ãåãã£ã¬ã¯ããªãããã¯ã®æåŸã«12ãã€ãã®æ§é ãäœæãããŸãã
4.æå·åããããã¡ã€ã«ãèªã¿åããŸãããã£ã¬ã¯ããªã®ãã³ãããããã¡ã€ã«ã«iããŒã15ïŒ0xFïŒãããããšã確èªããŸãã iããŒãã®ããŒãã«ã§ãããæ¢ããåæ§ã«ãã£ã¹ã¯äžã®äœçœ®ã決å®ããŸãã
å³ 4. Ainodæå·åãã¡ã€ã«ãã¯ã©ã¹ã¿ãŒ0x0000AA00ïŒ43520ïŒã®å
容ãèªã¿åããŸã
# dd if=/dev/xxx of=filedata bs=4096 count=1 skip=43520
å³ 5.æå·åããããã¡ã€ã«ã®å
容ãããŠãããã¯ãã¡ã€ã«ã«èšé²ãããæ
å ±ã«ãŸã£ãã察å¿ããŠããŸããã å®éã®ãã¡ã€ã«ãµã€ãºã¯ãi_size iããŒããã£ãŒã«ãïŒå³4ã®éãé·æ¹åœ¢ã§ããŒã¯ïŒã§èªã¿åãããšãã§ããŸãïŒ0x00000017-ããã¯ããšã³ãŒã³ãã³ããMy secret file contentã+æ¹è¡æå0x0Aã§æžã蟌ãŸããéã§ãã
3.埩å·å
ãã³ãŒããã¡ã€ã«åEXT4 Encryption Design Document [2]ã«ãããšããã¡ã€ã«åã®åŸ©å·åã¯2段éã§å®è¡ãããŸãã
1. DerivedKey = AES-128-ECBïŒããŒã¿= MasterKeyãããŒ= DirNonceïŒ;
2. EncFileName = AES-256-CBC-CTSïŒããŒã¿= DecFileNameãããŒ= DerivedKeyïŒ;
ã€ãŸã æåã®æ®µéã§ã埩å·åçšã®ããŒãååŸããå¿
èŠããããŸãã ãããè¡ãã«ã¯ãããŒãããŒãªã³ã°ã«è¿œå ãããšãã«äœæããããã¹ã¿ãŒããŒã®ããŒã¿ã䜿çšããŸããããã¯ã128ãããã®DirNonceããŒã§AES-ECBã䜿çšããŠæå·åãããŸãã 2çªç®ã®ã¹ããŒãžã§ã¯ããŒãã§æºããããåºå®åæåãã¯ãã«ïŒIVïŒã䜿çšããŸãã AES-ECBã®å Žåãåæåãã¯ãã«ã¯å¿
èŠãããŸããã
DirNonceãšã¯äœã§ããïŒ æå·åããããã£ã¬ã¯ããªã®iããŒãã«æ¡åŒµå±æ§ããããŸãã
å³ 6.æå·åããããã£ã¬ã¯ããªãšãã®æ¡åŒµå±æ§ã®èª¬æinodeãµã€ãºã256ãã€ãã®å ŽåãçŽ100åã®æªäœ¿çšãã€ããæ§é ã«æ®ãïŒ0x100-EXT2_GOOD_OLD_INODE_SIZE-i_extra_sizeïŒãããã«æ
å ±ãä¿åã§ããŸãïŒå³6ã®èµ€ãé åïŒã ãã®é åã®æåã®4ãã€ãã®ããããŒ0xEA020000ãããããããã«ãã€ã³ããã¯ã¹09ã®æ¡åŒµå±æ§ã¯ããã«æ ŒçŽããããã®ããŒã¿ã¯ããããŒãã0x40ãã€ãã ããªãã»ããããããµã€ãºã¯0x1Cã§ãã ããŒã¿é åã¯3ã€ã®ãŸãŒã³ã«åå²ãããŸããæåã®ïŒ01 01 04 00ïŒã§ã¯ãiããŒããæå·åãããã¢ã«ãŽãªãºã ãèšé²ãããŸãã 2çªç®ã®ãã®ã¯8ãã€ãïŒ8E 67 9E 44 49 BB 92 35ïŒãæ ŒçŽããããŒãã³ãã«ãç¹°ãè¿ããŸãã 3çªç®ã®ãã®ã«ã¯ããã¹ã¿ãŒããŒãæå·åãããšãã«äœ¿çšããã16ãã€ãã®ã¯ã³ã¿ã€ã ã³ãŒãïŒé[3]ïŒãå«ãŸããŠããŸãã
ãããã£ãŠããã¡ã€ã«åã埩å·åããã«ã¯ã以äžãè¡ãå¿
èŠããããŸãã
1ïŒã€ã³ããã¯ã¹9ã§ãã£ã¬ã¯ããªã®ååã®ãªãæ¡åŒµå±æ§ã®å€ãèªã¿åããŸã-ãã£ã¬ã¯ããªnonsãååŸããŸãã
2ïŒAES-ECBã¢ã«ãŽãªãºã ã䜿çšããŠã128ãããã®ãã£ã¬ã¯ããªãã³ã»ã³ã¹ãããŒãšããŠäœ¿çšããŠãã¹ã¿ãŒããŒã®ããŒã¿ãæå·åããŸãã
3ïŒAES-CBC-CTSã¢ã«ãŽãªãºã ã䜿çšããŠãåã®æé ã§ååŸããããŒã®æåã®256ãããïŒååïŒãããŒãšããŠäœ¿çšããŠãã¡ã€ã«åã埩å·åããŸãã
ãã¡ã€ã«ã®å
容ã®åŸ©å·åãã¡ã€ã«åã®åŸ©å·åãšåæ§ã«å®è¡ãããŸããããã¡ã€ã«ã®iããŒãããååŸããæ¡åŒµå±æ§å€ãnonseãšããŠäœ¿çšãããç¹ãç°ãªããŸãã ãŸããCBCã®ä»£ããã«ãã³ã³ãã³ãã¯å®å
šãª64ãã€ãã®ããŒãæã€AES-XTSã¢ã«ãŽãªãºã ã䜿çšããŠåŸ©å·åãããŸãã ãã¡ã€ã«ã®å
é ããã®è«çãããã¯ãªãã»ãããIVãšããŠäœ¿çšãããŸãã
å³ 7.æå·åããããã¡ã€ã«ã®Ainodãšãã®æ¡åŒµå±æ§ãæå·åããããã¡ã€ã«ãšãã£ã¬ã¯ããªã®æ¡åŒµå±æ§ã®å€ãæ¯èŒãããšãæå·åã¢ã«ãŽãªãºã ãšããŒèšè¿°åãåãã§ããäžæ¹ã§ããããã®éååãç°ãªãããšãããããŸãïŒå³ã®é»è²ãšéè²ã®ãŸãŒã³ïŒã
ãã¡ã€ã«ã®ã³ã³ãã³ãã¯ããŒãžããšã«æå·åããããããã³ã³ãã³ãã埩å·åããã«ã¯ãiããŒãã®i_sizeãã£ãŒã«ãã§æå®ããããµã€ãºã§ã¯ãªãããã¡ã€ã«ã®ã¯ã©ã¹ã¿ãŒå
šäœïŒ4KïŒã䜿çšããå¿
èŠããããŸãã
4.å®è£
ãã³ãŒããŒã®å®è£
ã¯ãLinux Kernel Crypto API [4]ã«åºã¥ããŠããŸãã ãã§ãŒã³ã¯ãebcïŒaesïŒãctsïŒcbcïŒaesïŒïŒãxtsïŒaesïŒã¢ã«ãŽãªãºã ã®/ proc / cryptoã«èšè¿°ãããŠãããã®ã«å¿ããŠã2çš®é¡ã®æå·åã䜿çšããŸãã ã«ãŒãã«4.10.0-19ãèããŠã¿ãŸããããebcæå·ã¯blkcipherãctsïŒcbcïŒãããã³xtsãä»ããŠskcipherãä»ããŠå®è£
ãããŸãã
$ cat / proc / crypto$ cat / proc / crypto
ååïŒecbïŒaesïŒ
ãã©ã€ããŒïŒecbïŒaes-aesniïŒ
ã¢ãžã¥ãŒã«ïŒã«ãŒãã«
åªå
床ïŒ300
å
éšïŒããã
ã¿ã€ãïŒblkcipher
ãããã¯ãµã€ãºïŒ16
æå°ããŒãµã€ãºïŒ16
æå€§ããŒãµã€ãºïŒ32
ivsizeïŒ0
genivïŒããã©ã«ã
ååïŒctsïŒcbcïŒaesïŒïŒ
ãã©ã€ããŒïŒctsïŒcbc-aes-aesniïŒ
ã¢ãžã¥ãŒã«ïŒã«ãŒãã«
åªå
床ïŒ400
å
éšïŒããã
ã¿ã€ãïŒskcipher
éåæïŒã¯ã
ãããã¯ãµã€ãºïŒ16
æå°ããŒãµã€ãºïŒ16
æå€§ããŒãµã€ãºïŒ32
ivsizeïŒ16
ãã£ã³ã¯ãµã€ãºïŒ16
ååïŒxtsïŒaesïŒ
ãã©ã€ããŒïŒxts-aes-aesni
ã¢ãžã¥ãŒã«ïŒaesni_intel
åªå
床ïŒ401
å
éšïŒããã
ã¿ã€ãïŒskcipher
éåæïŒã¯ã
ãããã¯ãµã€ãºïŒ16
æå°ããŒãµã€ãºïŒ32
æå€§ããŒãµã€ãºïŒ64
ivsizeïŒ16
ãã£ã³ã¯ãµã€ãºïŒ16
blkcipherã«ããæå·åã®å®è£
typedef enum { ENCRYPT, DECRYPT } cipher_mode; static int do_blkcrypt(const u8* cipher, const u8* key, u32 key_len, void* iv, void* dst, void* src, size_t src_len, cipher_mode mode) { int res; struct crypto_blkcipher* blk; struct blkcipher_desc desc; struct scatterlist sg_src, sg_dst; blk = crypto_alloc_blkcipher(cipher, 0, 0); if (IS_ERR(blk)) { printk(KERN_WARNING "Failed to initialize blkcipher mode %s\n", cipher); return PTR_ERR(blk); } res = crypto_blkcipher_setkey(blk, key, key_len); if (res) { printk(KERN_WARNING "Failed to set key. len=%#x\n", key_len); crypto_free_blkcipher(blk); return res; } crypto_blkcipher_set_iv(blk, iv, 16); sg_init_one(&sg_src, src, src_len); sg_init_one(&sg_dst, dst, src_len); desc.tfm = blk; desc.flags = 0; if (mode == ENCRYPT) res = crypto_blkcipher_encrypt(&desc, &sg_dst, &sg_src, src_len); else res = crypto_blkcipher_decrypt(&desc, &sg_dst, &sg_src, src_len); crypto_free_blkcipher(blk); return res; }
skcipherãä»ããæå·åã®å®è£
struct tcrypt_result { struct completion completion; int err; }; static void crypt_complete_cb(struct crypto_async_request* req, int error) { struct tcrypt_result* res = req->data; if (error == -EINPROGRESS) return; res->err = error; complete(&res->completion); } static int do_skcrypt(const u8* cipher, const u8* key, u32 key_len, void* iv, void* dst, void* src, size_t src_len, cipher_mode mode) { struct scatterlist src_sg, dst_sg; struct crypto_skcipher* tfm; struct skcipher_request* req = 0; struct tcrypt_result crypt_res; int res = -EFAULT; tfm = crypto_alloc_skcipher(cipher, 0, 0); if (IS_ERR(tfm)) { printk(KERN_WARNING "Failed to initialize skcipher mode %s\n", cipher); res = PTR_ERR(tfm); tfm = NULL; goto out; } req = skcipher_request_alloc(tfm, GFP_NOFS); if (!req) { printk(KERN_WARNING "Couldn't allocate skcipher handle\n"); res = -ENOMEM; goto out; } skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP, crypt_complete_cb, &crypt_res); if (crypto_skcipher_setkey(tfm, key, key_len)) { printk(KERN_WARNING "Failed to set key\n"); res = -EINVAL; goto out; } sg_init_one(&src_sg, src, src_len); sg_init_one(&dst_sg, dst, src_len); skcipher_request_set_crypt(req, &src_sg, &dst_sg, src_len, iv); init_completion(&crypt_res.completion); if (mode == ENCRYPT) res = crypto_skcipher_encrypt(req); else res = crypto_skcipher_decrypt(req); switch (res) { case 0: break; case -EINPROGRESS: case -EBUSY: wait_for_completion(&crypt_res.completion); if (!res && !crypt_res.err) { reinit_completion(&crypt_res.completion); break; } default: printk("Skcipher %scrypt returned with err = %d, result %#x\n", mode == ENCRYPT ? "en" : "de", res, crypt_res.err); break; } out: if (tfm) crypto_free_skcipher(tfm); if (req) skcipher_request_free(req); return res; }
ãã¹ã¿ãŒããŒã®ããŒã¿ïŒãã€ããŒãïŒã®èªã¿åã #define MASTER_KEY_SIZE 64 static int GetMasterKey(const u8* descriptor, u8* raw) { struct key* keyring_key = NULL; const struct user_key_payload* ukp; struct fscrypt_key* master_key; keyring_key = request_key(&key_type_logon, descriptor, NULL); if (IS_ERR(keyring_key)) return -EINVAL; if (keyring_key->type != &key_type_logon) { printk_once(KERN_WARNING "%s: key type must be 'logon'\n", __func__); return -EINVAL; } down_read(&keyring_key->sem); ukp = user_key_payload(keyring_key); master_key = (struct fscrypt_key*)ukp->data; up_read(&keyring_key->sem); if (master_key->size != MASTER_KEY_SIZE) { printk(KERN_WARNING "Wrong Master key size %#x\n", master_key->size); return -EINVAL; } memcpy(raw, master_key->raw, master_key->size); return 0; }
æ³šïŒ 4.4ããåã®ã«ãŒãã«ããŒãžã§ã³ã§ã¯ãuser_key_payload颿°ããããŸããã ããŒããŒã¿ã¯ãstruct key * keyring_keyããçŽæ¥èªã¿åãããšãã§ããŸãã
ãã³ãŒããã¡ã€ã«å int err; u8 iv[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; u8 nonce_dir[16] = { ... }; u8 master_key[64], derived_key[64]; u8 dec_file_name[] = { ... }; u8 enc_file_name[sizeof(dec_file_name)]; err = do_blkcrypt("ecb(aes)", nonce_dir, 16, iv, derived_key, master_key, MASTER_KEY_SIZE, ENCRYPT); if (err) return err; err = do_skcrypt("cts(cbc(aes))", derived_key, MASTER_KEY_SIZE / 2, iv, dec_file_name, enc_file_name, sizeof(dec_file_name), DECRYPT); return err;
ã³ã³ãã³ãã®åŸ©å·åç°¡åã«ããããã«ãã¡ã¢ãªã䜿çšããäœæ¥ã¯çç¥ãããŠããŸãã ã¹ã¿ãã¯ã§2 x PAGE_SIZEãäžãããããšããŸãã
u8 nonce_file[16] = { ... }; u8 enc_file_data[PAGE_SIZE] = { ... }; u8 dec_file_data[PAGE_SIZE]; err = do_blkcrypt("ecb(aes)", nonce_file, 16, iv, derived_key, master_key, MASTER_KEY_SIZE, ENCRYPT); if (err) return err; err = do_skcrypt("xts(aes)", derived_key, MASTER_KEY_SIZE, iv, dec_file_data, enc_file_data, PAGE_SIZE, DECRYPT); return err;
äœ¿çšæžã¿ããããŒãã¡ã€ã«ïŒ4.10.0-19ã«é¢é£ïŒ #include <linux/kernel.h> #include <linux/module.h> #include <linux/scatterlist.h> #include <linux/fscrypto.h>
ã¡ã€ã¯ãã¡ã€ã« obj-m += ciphertest.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
5.çµæ
ãœãŒã¹ããŒã¿ïŒ
u8 master_key[MASTER_KEY_SIZE] = { 0xa5, 0xb5, 0xc9, 0x23, 0x02, 0x14, 0xfc, 0xf7, 0x28, 0xdc, 0x90, 0x25, 0x24, 0x9e, 0xe6, 0xbc, 0x7c, 0xa8, 0xf8, 0xe1, 0x94, 0xf6, 0x67, 0x32, 0x33, 0xc4, 0xc1, 0xe8, 0x78, 0x59, 0xab, 0xfb, 0xae, 0xb0, 0xbf, 0x5d, 0x2c, 0x69, 0xc3, 0x8f, 0x51, 0x37, 0x26, 0x3f, 0xd1, 0xce, 0x37, 0xef, 0x3f, 0x80, 0xe3, 0x2d, 0xd5, 0xfd, 0x78, 0x45, 0x62, 0xf3, 0xa5, 0x24, 0x6b, 0xcf, 0x4a, 0x88 }; u8 enc_file_name[] = { 0x41, 0xa8, 0x4e, 0x4d, 0xd4, 0x1c, 0x43, 0x00, 0xa7, 0x5a, 0x2f, 0xd5, 0xaa, 0xa0, 0x5d, 0xb0 }; u8 nonce_dir[] = { 0x37, 0xba, 0x14, 0x16, 0x3e, 0xa8, 0xd5, 0x48, 0xd1, 0x3c, 0xb5, 0x6a, 0x01, 0xb7, 0x7c, 0x41 }; u8 nonce_file[] = { 0x61, 0x63, 0xb8, 0x31, 0xf4, 0xf5, 0xfc, 0x99, 0x1e, 0x3c, 0xf1, 0x8a, 0x23, 0xaf, 0x1e, 0xa8 };
ãšã³ã³ãŒãããããã¡ã€ã«åenc_file_nameã¯ããã£ã¬ã¯ããªã®ãã³ãããååŸãããŸãïŒå³3ïŒã
nonce_dirãã£ã¬ã¯ããªã®nonsã¯ããã£ã¬ã¯ããªã®iããŒãã®ãã³ãããååŸãããŸãïŒå³6ïŒ
nonce_fileãã¡ã€ã«ã®nonsã¯ããã¡ã€ã«ã®iããŒãã®ãã³ãããååŸãããŸãïŒå³7ïŒ
ãã¹ã¿ãŒããŒã¯ã説æã®ããã ãã«ããã«ç€ºãããŠããŸãã e4cryptããããã°ããããšã§ååŸã§ããŸãã

äœæããããã©ã€ããŒã®çµæ
