2015-02-12 8 views
4

Я пытаюсь монтировать фс с ecryptfs в программе на C. Но мне не удается дать часть ядра ключакрепление 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); 
} 

В/варе/Журнал/сообщения:

process_request_key_err: No key 
One or more global auth toks could not properly register; rc = [-2] 

Я стараюсь с этим в строке отказа:

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] 

Спасибо за помощь

ответ

1

Вы можете найти исходный код mount.ecryptfs_private.c полезен, так как он строит строку монтирования, а затем выполняет монтирование. Это двоичный файл setuid, используемый pam_ecryptfs в Ubuntu для монтирования зашифрованного домашнего каталога пользователя.

Полное раскрытие: Я автор mount.ecryptfs_private.c и сопровождающему eCryptfs.

+0

Спасибо. Но чтение кода, я не вижу, как передать ключ, как: крепление -t ecryptfs/TMP/disk1/TMP/disk1 -o RW, passphrase_passwd = XXXXXX, ecryptfs_sig = f83de0de4ecccbb1, ecryptfs_cipher = АЕС, в сборе syscall Прошу прощения, но я не вижу, как правильно построить строку выбора opt – flav

+0

См. Строку 612: https://bazaar.launchpad.net/~ecryptfs/ecryptfs/trunk/view/head: /src/utils/mount.ecryptfs_private.c#L612 –

1

В самом деле, ключ должен быть предоставить ядру перед использованием монтирования системного вызова с ключом объекта управления (см человека 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);