title: linux kernel crypto API,In AES-GCM algorithm how to set the length of aad is zero bit?
body: <p>In my work I want to use the aes-gcm algorithm to encrypt data in linux kernel module, so I choose the aead api. In aes gcm the aad data can be setted 0-264 bits,but in the code if i use aead_request_set_ad() function set the data of scatterlist struct is null it will be error. 
  <a href="https://i.stack.imgur.com/lh8e6.png" rel="nofollow noreferrer">AES-GCM algorithm</a></p>
  
  <p>next it's my code in linux kernel 4.10:</p>
  
  <pre><code>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(&amp;sg[0], aad,0);
      sg_set_buf(&amp;sg[1], data, data_len);
      sg_set_buf(&amp;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;
  }
  </code></pre>
  
  <p><strong>And if I use sg_set_page(&amp;sg[0], ZERO_PAGE(0), 0, 0) to set sg[0] it's also wrong.</strong></p>
  
  <p><strong>And if I remove the sg[0] is's also wrong...</strong></p>
  
  <p>In aead_request_set_crypt function the annotations just like this:</p>
  
  <pre><code>/**
   * 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).
   */
  </code></pre>
  
  <p><strong>The assoc data is must be existense, so how can i set it's length is zero??</strong></p>