2017-08-31 7 views
0

In meiner Arbeit möchte ich den AES-Gcm-Algorithmus verwenden, um Daten im Linux-Kernel-Modul zu verschlüsseln, also wähle ich die Aead API. In aes gcm können die aad-Daten auf 0-264 Bit gesetzt werden, aber wenn ich im code die Funktion aead_request_set_ad() verwende, sind die Daten der scatterlist struct null, es wird ein Fehler sein. AES-GCM algorithmLinux Kernel Crypto API, im AES-GCM-Algorithmus, wie die Länge von Aad ist Null Bit?

nächsten, es ist mein Code in Linux-Kernel 4.10:

int aes_gcm_decrypt(struct crypto_aead *tfm, u8 *j_0, u8 *aad, 
       u8 *data, size_t data_len, u8 *mic) 
{ 
    struct scatterlist sg[3]; 
    struct aead_request *aead_req; 
    int reqsize = sizeof(*aead_req) + crypto_aead_reqsize(tfm); 
    int err; 

    if (data_len == 0) 
     return -EINVAL; 

    aead_req = kzalloc(reqsize + GCM_AAD_LEN, GFP_ATOMIC); 
    if (!aead_req) 
     return -ENOMEM; 

    sg_init_table(sg, 3); 
    sg_set_buf(&sg[0], aad,0); 
    sg_set_buf(&sg[1], data, data_len); 
    sg_set_buf(&sg[2], mic, 16); 

    aead_request_set_tfm(aead_req, tfm); 
    aead_request_set_crypt(aead_req, sg, sg, 
       data_len + 16, j_0); 
    aead_request_set_ad(aead_req, sg[0].length); 

    err = crypto_aead_decrypt(aead_req); 
    kzfree(aead_req); 

    return err; 
} 

Und wenn ich sg_set_page verwenden (& sg [0], ZERO_PAGE (0), 0, 0) sg auf [0] es ist auch falsch.

Und wenn ich die sg [0] entfernen, ist es auch falsch ...

In aead_request_set_crypt Funktion die Anmerkungen wie folgt aus:

/** 
* aead_request_set_crypt - set data buffers 
* @req: request handle 
* @src: source scatter/gather list 
* @dst: destination scatter/gather list 
* @cryptlen: number of bytes to process from @src 
* @iv: IV for the cipher operation which must comply with the IV size defined 
*  by crypto_aead_ivsize() 
* 
* Setting the source data and destination data scatter/gather lists which 
* hold the associated data concatenated with the plaintext or ciphertext. See 
* below for the authentication tag. 
* 
* For encryption, the source is treated as the plaintext and the 
* destination is the ciphertext. For a decryption operation, the use is 
* reversed - the source is the ciphertext and the destination is the plaintext. 
* 
* The memory structure for cipher operation has the following structure: 
* 
* - AEAD encryption input: assoc data || plaintext 
* - AEAD encryption output: assoc data || cipherntext || auth tag 
* - AEAD decryption input: assoc data || ciphertext || auth tag 
* - AEAD decryption output: assoc data || plaintext 
* 
* Albeit the kernel requires the presence of the AAD buffer, however, 
* the kernel does not fill the AAD buffer in the output case. If the 
* caller wants to have that data buffer filled, the caller must either 
* use an in-place cipher operation (i.e. same memory location for 
* input/output memory location). 
*/ 

Die Daten Assoc ist, muss existense sein , also wie kann ich einstellen, es ist die Länge ist Null?

Antwort

0

Ich habe dieses Problem myself.just wie folgt gelöst:

struct scatterlist sg[2]; 
... 
sg_set_buf(&sg[0], data, data_len); 
sg_set_buf(&sg[1], mic, 16); 
... 
aead_request_set_ad(aead_req, 0); 

nur zwei scatterlist Struktur definieren und die Anzeige Null.

Verwandte Themen