esp.h 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #ifndef _NET_ESP_H
  2. #define _NET_ESP_H
  3. #include <net/xfrm.h>
  4. #include <asm/scatterlist.h>
  5. #define ESP_NUM_FAST_SG 4
  6. struct esp_data
  7. {
  8. struct scatterlist sgbuf[ESP_NUM_FAST_SG];
  9. /* Confidentiality */
  10. struct {
  11. u8 *key; /* Key */
  12. int key_len; /* Key length */
  13. u8 *ivec; /* ivec buffer */
  14. /* ivlen is offset from enc_data, where encrypted data start.
  15. * It is logically different of crypto_tfm_alg_ivsize(tfm).
  16. * We assume that it is either zero (no ivec), or
  17. * >= crypto_tfm_alg_ivsize(tfm). */
  18. int ivlen;
  19. int padlen; /* 0..255 */
  20. struct crypto_tfm *tfm; /* crypto handle */
  21. } conf;
  22. /* Integrity. It is active when icv_full_len != 0 */
  23. struct {
  24. u8 *key; /* Key */
  25. int key_len; /* Length of the key */
  26. u8 *work_icv;
  27. int icv_full_len;
  28. int icv_trunc_len;
  29. void (*icv)(struct esp_data*,
  30. struct sk_buff *skb,
  31. int offset, int len, u8 *icv);
  32. struct crypto_tfm *tfm;
  33. } auth;
  34. };
  35. extern int skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len);
  36. extern int skb_cow_data(struct sk_buff *skb, int tailbits, struct sk_buff **trailer);
  37. extern void *pskb_put(struct sk_buff *skb, struct sk_buff *tail, int len);
  38. static inline void
  39. esp_hmac_digest(struct esp_data *esp, struct sk_buff *skb, int offset,
  40. int len, u8 *auth_data)
  41. {
  42. struct crypto_tfm *tfm = esp->auth.tfm;
  43. char *icv = esp->auth.work_icv;
  44. memset(auth_data, 0, esp->auth.icv_trunc_len);
  45. crypto_hmac_init(tfm, esp->auth.key, &esp->auth.key_len);
  46. skb_icv_walk(skb, tfm, offset, len, crypto_hmac_update);
  47. crypto_hmac_final(tfm, esp->auth.key, &esp->auth.key_len, icv);
  48. memcpy(auth_data, icv, esp->auth.icv_trunc_len);
  49. }
  50. #endif