Монтировать ecryptfs с помощью системного вызова на языке Си
Я пытаюсь смонтировать fs с ecryptfs в программе на C. Но мне не удается дать ключу ядра ключ
int mount_crypt(char* source)
{
int r = -1;
char opt[1024] = "ecryptfs_sig=f83de0de4ecccbb1,ecryptfs_cipher=aes,ecryptfs_key_bytes=16";
r = mount(source, source, "ecryptfs", MS_MGC_VAL, opt);
if (r != 0)
{
perror("EErrr mount cry");
printf("Error mount cry: %d\n", r);
}
return (r);
}
В /var/log/messages:
process_request_key_err: No key
One or more global auth toks could not properly register; rc = [-2]
Я пытаюсь с этим в строке opt:
key=passphrase:passphrase_passwd=MYPASSS
но это не работает
с:
int icloud_mount_crypt(char* source)
{
int r = -1;
char opt[1024] = "key=passphrase:passphrase_passwd=XXXXXX,ecryptfs_sig=f83de0de4ecccbb1,ecryptfs_cipher=aes,ecryptfs_key_bytes=16";
r = mount(source, source, "ecryptfs", MS_MGC_VAL, opt);
if (r != 0)
{
perror("EErrr mount cry");
printf("Error mount cry: %d\n", r);
}
return (r);
}
Вот журнал:
Feb 15 11:15:41 nightmare kernel: [2847133.493005] ecryptfs_parse_options: eCryptfs: unrecognized option [key=passphrase:passphrase_passwd=XXXXXX]
Feb 15 11:15:41 nightmare kernel: [2847133.493022] Could not find key with description: [f83de0de4ecccbb1]
Feb 15 11:15:41 nightmare kernel: [2847133.493028] process_request_key_err: No key
Feb 15 11:15:41 nightmare kernel: [2847133.493032] Could not find valid key in user session keyring for sig specified in mount option: [f83de0de4ecccbb1]
Feb 15 11:15:41 nightmare kernel: [2847133.493035] One or more global auth toks could not properly register; rc = [-2]
Feb 15 11:15:41 nightmare kernel: [2847133.493039] Error parsing options; rc = [-2]
Спасибо за помощь
2 ответа
Вы можете найти исходный код mount.ecryptfs_private.c
полезно, так как он строит строку монтирования, а затем выполняет монтирование. Это двоичный файл setuid, используемый pam_ecryptfs
в Ubuntu для монтирования зашифрованного домашнего каталога пользователя.
Полное раскрытие: я автор mount.ecryptfs_private.c
и сопровождающий eCryptfs.
Фактически, ключ должен быть предоставлен ядру перед использованием mount syscall со средством управления ключами (см. Man keyctl)
см.: https://bazaar.launchpad.net/~ecryptfs/ecryptfs/trunk/view/head:/src/utils/ecryptfs_add_passphrase.c
а также
https://bazaar.launchpad.net/~ecryptfs/ecryptfs/trunk/view/head:/src/libecryptfs/key_management.c
Пример кода:
[...]
from_hex(salt, ECRYPTFS_DEFAULT_SALT_HEX, ECRYPTFS_SALT_SIZE);
r = ecryptfs_generate_passphrase_auth_tok(&auth_tok, auth_tok_sig_hex,
fekek, salt, passphrase);
r = ecryptfs_add_passphrase_key_to_keyring(auth_tok_sig_hex,
passphrase,
salt);
auth_tok_sig_hex[ECRYPTFS_SIG_SIZE_HEX] = '\0';
if ((rc_long = keyctl(KEYCTL_LINK, KEY_SPEC_USER_KEYRING,
KEY_SPEC_SESSION_KEYRING)))
{
syslog(LOG_ERR, "Error attempting to link the user session "
"keyring into the session keyring\n");
}
[...]
r = mount(source, source, "ecryptfs", MS_MGC_VAL, opt);