1 /* 2 * CAAM Protocol Data Block (PDB) definition header file 3 * 4 * Copyright 2008-2016 Freescale Semiconductor, Inc. 5 * 6 */ 7 8 #ifndef CAAM_PDB_H 9 #define CAAM_PDB_H 10 #include "compat.h" 11 12 /* 13 * PDB- IPSec ESP Header Modification Options 14 */ 15 #define PDBHMO_ESP_DECAP_SHIFT 28 16 #define PDBHMO_ESP_ENCAP_SHIFT 28 17 /* 18 * Encap and Decap - Decrement TTL (Hop Limit) - Based on the value of the 19 * Options Byte IP version (IPvsn) field: 20 * if IPv4, decrement the inner IP header TTL field (byte 8); 21 * if IPv6 decrement the inner IP header Hop Limit field (byte 7). 22 */ 23 #define PDBHMO_ESP_DECAP_DEC_TTL (0x02 << PDBHMO_ESP_DECAP_SHIFT) 24 #define PDBHMO_ESP_ENCAP_DEC_TTL (0x02 << PDBHMO_ESP_ENCAP_SHIFT) 25 /* 26 * Decap - DiffServ Copy - Copy the IPv4 TOS or IPv6 Traffic Class byte 27 * from the outer IP header to the inner IP header. 28 */ 29 #define PDBHMO_ESP_DIFFSERV (0x01 << PDBHMO_ESP_DECAP_SHIFT) 30 /* 31 * Encap- Copy DF bit -if an IPv4 tunnel mode outer IP header is coming from 32 * the PDB, copy the DF bit from the inner IP header to the outer IP header. 33 */ 34 #define PDBHMO_ESP_DFBIT (0x04 << PDBHMO_ESP_ENCAP_SHIFT) 35 36 #define PDBNH_ESP_ENCAP_SHIFT 16 37 #define PDBNH_ESP_ENCAP_MASK (0xff << PDBNH_ESP_ENCAP_SHIFT) 38 39 #define PDBHDRLEN_ESP_DECAP_SHIFT 16 40 #define PDBHDRLEN_MASK (0x0fff << PDBHDRLEN_ESP_DECAP_SHIFT) 41 42 #define PDB_NH_OFFSET_SHIFT 8 43 #define PDB_NH_OFFSET_MASK (0xff << PDB_NH_OFFSET_SHIFT) 44 45 /* 46 * PDB - IPSec ESP Encap/Decap Options 47 */ 48 #define PDBOPTS_ESP_ARSNONE 0x00 /* no antireplay window */ 49 #define PDBOPTS_ESP_ARS32 0x40 /* 32-entry antireplay window */ 50 #define PDBOPTS_ESP_ARS128 0x80 /* 128-entry antireplay window */ 51 #define PDBOPTS_ESP_ARS64 0xc0 /* 64-entry antireplay window */ 52 #define PDBOPTS_ESP_ARS_MASK 0xc0 /* antireplay window mask */ 53 #define PDBOPTS_ESP_IVSRC 0x20 /* IV comes from internal random gen */ 54 #define PDBOPTS_ESP_ESN 0x10 /* extended sequence included */ 55 #define PDBOPTS_ESP_OUTFMT 0x08 /* output only decapsulation (decap) */ 56 #define PDBOPTS_ESP_IPHDRSRC 0x08 /* IP header comes from PDB (encap) */ 57 #define PDBOPTS_ESP_INCIPHDR 0x04 /* Prepend IP header to output frame */ 58 #define PDBOPTS_ESP_IPVSN 0x02 /* process IPv6 header */ 59 #define PDBOPTS_ESP_AOFL 0x04 /* adjust out frame len (decap, SEC>=5.3)*/ 60 #define PDBOPTS_ESP_TUNNEL 0x01 /* tunnel mode next-header byte */ 61 #define PDBOPTS_ESP_IPV6 0x02 /* ip header version is V6 */ 62 #define PDBOPTS_ESP_DIFFSERV 0x40 /* copy TOS/TC from inner iphdr */ 63 #define PDBOPTS_ESP_UPDATE_CSUM 0x80 /* encap-update ip header checksum */ 64 #define PDBOPTS_ESP_VERIFY_CSUM 0x20 /* decap-validate ip header checksum */ 65 66 /* 67 * General IPSec encap/decap PDB definitions 68 */ 69 70 /** 71 * ipsec_encap_cbc - PDB part for IPsec CBC encapsulation 72 * @iv: 16-byte array initialization vector 73 */ 74 struct ipsec_encap_cbc { 75 u8 iv[16]; 76 }; 77 78 /** 79 * ipsec_encap_ctr - PDB part for IPsec CTR encapsulation 80 * @ctr_nonce: 4-byte array nonce 81 * @ctr_initial: initial count constant 82 * @iv: initialization vector 83 */ 84 struct ipsec_encap_ctr { 85 u8 ctr_nonce[4]; 86 u32 ctr_initial; 87 u64 iv; 88 }; 89 90 /** 91 * ipsec_encap_ccm - PDB part for IPsec CCM encapsulation 92 * @salt: 3-byte array salt (lower 24 bits) 93 * @ccm_opt: CCM algorithm options - MSB-LSB description: 94 * b0_flags (8b) - CCM B0; use 0x5B for 8-byte ICV, 0x6B for 12-byte ICV, 95 * 0x7B for 16-byte ICV (cf. RFC4309, RFC3610) 96 * ctr_flags (8b) - counter flags; constant equal to 0x3 97 * ctr_initial (16b) - initial count constant 98 * @iv: initialization vector 99 */ 100 struct ipsec_encap_ccm { 101 u8 salt[4]; 102 u32 ccm_opt; 103 u64 iv; 104 }; 105 106 /** 107 * ipsec_encap_gcm - PDB part for IPsec GCM encapsulation 108 * @salt: 3-byte array salt (lower 24 bits) 109 * @rsvd: reserved, do not use 110 * @iv: initialization vector 111 */ 112 struct ipsec_encap_gcm { 113 u8 salt[4]; 114 u32 rsvd1; 115 u64 iv; 116 }; 117 118 /** 119 * ipsec_encap_pdb - PDB for IPsec encapsulation 120 * @options: MSB-LSB description 121 * hmo (header manipulation options) - 4b 122 * reserved - 4b 123 * next header - 8b 124 * next header offset - 8b 125 * option flags (depend on selected algorithm) - 8b 126 * @seq_num_ext_hi: (optional) IPsec Extended Sequence Number (ESN) 127 * @seq_num: IPsec sequence number 128 * @spi: IPsec SPI (Security Parameters Index) 129 * @ip_hdr_len: optional IP Header length (in bytes) 130 * reserved - 16b 131 * Opt. IP Hdr Len - 16b 132 * @ip_hdr: optional IP Header content 133 */ 134 struct ipsec_encap_pdb { 135 u32 options; 136 u32 seq_num_ext_hi; 137 u32 seq_num; 138 union { 139 struct ipsec_encap_cbc cbc; 140 struct ipsec_encap_ctr ctr; 141 struct ipsec_encap_ccm ccm; 142 struct ipsec_encap_gcm gcm; 143 }; 144 u32 spi; 145 u32 ip_hdr_len; 146 u32 ip_hdr[0]; 147 }; 148 149 /** 150 * ipsec_decap_cbc - PDB part for IPsec CBC decapsulation 151 * @rsvd: reserved, do not use 152 */ 153 struct ipsec_decap_cbc { 154 u32 rsvd[2]; 155 }; 156 157 /** 158 * ipsec_decap_ctr - PDB part for IPsec CTR decapsulation 159 * @ctr_nonce: 4-byte array nonce 160 * @ctr_initial: initial count constant 161 */ 162 struct ipsec_decap_ctr { 163 u8 ctr_nonce[4]; 164 u32 ctr_initial; 165 }; 166 167 /** 168 * ipsec_decap_ccm - PDB part for IPsec CCM decapsulation 169 * @salt: 3-byte salt (lower 24 bits) 170 * @ccm_opt: CCM algorithm options - MSB-LSB description: 171 * b0_flags (8b) - CCM B0; use 0x5B for 8-byte ICV, 0x6B for 12-byte ICV, 172 * 0x7B for 16-byte ICV (cf. RFC4309, RFC3610) 173 * ctr_flags (8b) - counter flags; constant equal to 0x3 174 * ctr_initial (16b) - initial count constant 175 */ 176 struct ipsec_decap_ccm { 177 u8 salt[4]; 178 u32 ccm_opt; 179 }; 180 181 /** 182 * ipsec_decap_gcm - PDB part for IPsec GCN decapsulation 183 * @salt: 4-byte salt 184 * @rsvd: reserved, do not use 185 */ 186 struct ipsec_decap_gcm { 187 u8 salt[4]; 188 u32 resvd; 189 }; 190 191 /** 192 * ipsec_decap_pdb - PDB for IPsec decapsulation 193 * @options: MSB-LSB description 194 * hmo (header manipulation options) - 4b 195 * IP header length - 12b 196 * next header offset - 8b 197 * option flags (depend on selected algorithm) - 8b 198 * @seq_num_ext_hi: (optional) IPsec Extended Sequence Number (ESN) 199 * @seq_num: IPsec sequence number 200 * @anti_replay: Anti-replay window; size depends on ARS (option flags) 201 */ 202 struct ipsec_decap_pdb { 203 u32 options; 204 union { 205 struct ipsec_decap_cbc cbc; 206 struct ipsec_decap_ctr ctr; 207 struct ipsec_decap_ccm ccm; 208 struct ipsec_decap_gcm gcm; 209 }; 210 u32 seq_num_ext_hi; 211 u32 seq_num; 212 __be32 anti_replay[4]; 213 }; 214 215 /* 216 * IPSec ESP Datapath Protocol Override Register (DPOVRD) 217 */ 218 struct ipsec_deco_dpovrd { 219 #define IPSEC_ENCAP_DECO_DPOVRD_USE 0x80 220 u8 ovrd_ecn; 221 u8 ip_hdr_len; 222 u8 nh_offset; 223 u8 next_header; /* reserved if decap */ 224 }; 225 226 /* 227 * IEEE 802.11i WiFi Protocol Data Block 228 */ 229 #define WIFI_PDBOPTS_FCS 0x01 230 #define WIFI_PDBOPTS_AR 0x40 231 232 struct wifi_encap_pdb { 233 u16 mac_hdr_len; 234 u8 rsvd; 235 u8 options; 236 u8 iv_flags; 237 u8 pri; 238 u16 pn1; 239 u32 pn2; 240 u16 frm_ctrl_mask; 241 u16 seq_ctrl_mask; 242 u8 rsvd1[2]; 243 u8 cnst; 244 u8 key_id; 245 u8 ctr_flags; 246 u8 rsvd2; 247 u16 ctr_init; 248 }; 249 250 struct wifi_decap_pdb { 251 u16 mac_hdr_len; 252 u8 rsvd; 253 u8 options; 254 u8 iv_flags; 255 u8 pri; 256 u16 pn1; 257 u32 pn2; 258 u16 frm_ctrl_mask; 259 u16 seq_ctrl_mask; 260 u8 rsvd1[4]; 261 u8 ctr_flags; 262 u8 rsvd2; 263 u16 ctr_init; 264 }; 265 266 /* 267 * IEEE 802.16 WiMAX Protocol Data Block 268 */ 269 #define WIMAX_PDBOPTS_FCS 0x01 270 #define WIMAX_PDBOPTS_AR 0x40 /* decap only */ 271 272 struct wimax_encap_pdb { 273 u8 rsvd[3]; 274 u8 options; 275 u32 nonce; 276 u8 b0_flags; 277 u8 ctr_flags; 278 u16 ctr_init; 279 /* begin DECO writeback region */ 280 u32 pn; 281 /* end DECO writeback region */ 282 }; 283 284 struct wimax_decap_pdb { 285 u8 rsvd[3]; 286 u8 options; 287 u32 nonce; 288 u8 iv_flags; 289 u8 ctr_flags; 290 u16 ctr_init; 291 /* begin DECO writeback region */ 292 u32 pn; 293 u8 rsvd1[2]; 294 u16 antireplay_len; 295 u64 antireplay_scorecard; 296 /* end DECO writeback region */ 297 }; 298 299 /* 300 * IEEE 801.AE MacSEC Protocol Data Block 301 */ 302 #define MACSEC_PDBOPTS_FCS 0x01 303 #define MACSEC_PDBOPTS_AR 0x40 /* used in decap only */ 304 305 struct macsec_encap_pdb { 306 u16 aad_len; 307 u8 rsvd; 308 u8 options; 309 u64 sci; 310 u16 ethertype; 311 u8 tci_an; 312 u8 rsvd1; 313 /* begin DECO writeback region */ 314 u32 pn; 315 /* end DECO writeback region */ 316 }; 317 318 struct macsec_decap_pdb { 319 u16 aad_len; 320 u8 rsvd; 321 u8 options; 322 u64 sci; 323 u8 rsvd1[3]; 324 /* begin DECO writeback region */ 325 u8 antireplay_len; 326 u32 pn; 327 u64 antireplay_scorecard; 328 /* end DECO writeback region */ 329 }; 330 331 /* 332 * SSL/TLS/DTLS Protocol Data Blocks 333 */ 334 335 #define TLS_PDBOPTS_ARS32 0x40 336 #define TLS_PDBOPTS_ARS64 0xc0 337 #define TLS_PDBOPTS_OUTFMT 0x08 338 #define TLS_PDBOPTS_IV_WRTBK 0x02 /* 1.1/1.2/DTLS only */ 339 #define TLS_PDBOPTS_EXP_RND_IV 0x01 /* 1.1/1.2/DTLS only */ 340 341 struct tls_block_encap_pdb { 342 u8 type; 343 u8 version[2]; 344 u8 options; 345 u64 seq_num; 346 u32 iv[4]; 347 }; 348 349 struct tls_stream_encap_pdb { 350 u8 type; 351 u8 version[2]; 352 u8 options; 353 u64 seq_num; 354 u8 i; 355 u8 j; 356 u8 rsvd1[2]; 357 }; 358 359 struct dtls_block_encap_pdb { 360 u8 type; 361 u8 version[2]; 362 u8 options; 363 u16 epoch; 364 u16 seq_num[3]; 365 u32 iv[4]; 366 }; 367 368 struct tls_block_decap_pdb { 369 u8 rsvd[3]; 370 u8 options; 371 u64 seq_num; 372 u32 iv[4]; 373 }; 374 375 struct tls_stream_decap_pdb { 376 u8 rsvd[3]; 377 u8 options; 378 u64 seq_num; 379 u8 i; 380 u8 j; 381 u8 rsvd1[2]; 382 }; 383 384 struct dtls_block_decap_pdb { 385 u8 rsvd[3]; 386 u8 options; 387 u16 epoch; 388 u16 seq_num[3]; 389 u32 iv[4]; 390 u64 antireplay_scorecard; 391 }; 392 393 /* 394 * SRTP Protocol Data Blocks 395 */ 396 #define SRTP_PDBOPTS_MKI 0x08 397 #define SRTP_PDBOPTS_AR 0x40 398 399 struct srtp_encap_pdb { 400 u8 x_len; 401 u8 mki_len; 402 u8 n_tag; 403 u8 options; 404 u32 cnst0; 405 u8 rsvd[2]; 406 u16 cnst1; 407 u16 salt[7]; 408 u16 cnst2; 409 u32 rsvd1; 410 u32 roc; 411 u32 opt_mki; 412 }; 413 414 struct srtp_decap_pdb { 415 u8 x_len; 416 u8 mki_len; 417 u8 n_tag; 418 u8 options; 419 u32 cnst0; 420 u8 rsvd[2]; 421 u16 cnst1; 422 u16 salt[7]; 423 u16 cnst2; 424 u16 rsvd1; 425 u16 seq_num; 426 u32 roc; 427 u64 antireplay_scorecard; 428 }; 429 430 /* 431 * DSA/ECDSA Protocol Data Blocks 432 * Two of these exist: DSA-SIGN, and DSA-VERIFY. They are similar 433 * except for the treatment of "w" for verify, "s" for sign, 434 * and the placement of "a,b". 435 */ 436 #define DSA_PDB_SGF_SHIFT 24 437 #define DSA_PDB_SGF_MASK (0xff << DSA_PDB_SGF_SHIFT) 438 #define DSA_PDB_SGF_Q (0x80 << DSA_PDB_SGF_SHIFT) 439 #define DSA_PDB_SGF_R (0x40 << DSA_PDB_SGF_SHIFT) 440 #define DSA_PDB_SGF_G (0x20 << DSA_PDB_SGF_SHIFT) 441 #define DSA_PDB_SGF_W (0x10 << DSA_PDB_SGF_SHIFT) 442 #define DSA_PDB_SGF_S (0x10 << DSA_PDB_SGF_SHIFT) 443 #define DSA_PDB_SGF_F (0x08 << DSA_PDB_SGF_SHIFT) 444 #define DSA_PDB_SGF_C (0x04 << DSA_PDB_SGF_SHIFT) 445 #define DSA_PDB_SGF_D (0x02 << DSA_PDB_SGF_SHIFT) 446 #define DSA_PDB_SGF_AB_SIGN (0x02 << DSA_PDB_SGF_SHIFT) 447 #define DSA_PDB_SGF_AB_VERIFY (0x01 << DSA_PDB_SGF_SHIFT) 448 449 #define DSA_PDB_L_SHIFT 7 450 #define DSA_PDB_L_MASK (0x3ff << DSA_PDB_L_SHIFT) 451 452 #define DSA_PDB_N_MASK 0x7f 453 454 struct dsa_sign_pdb { 455 u32 sgf_ln; /* Use DSA_PDB_ defintions per above */ 456 u8 *q; 457 u8 *r; 458 u8 *g; /* or Gx,y */ 459 u8 *s; 460 u8 *f; 461 u8 *c; 462 u8 *d; 463 u8 *ab; /* ECC only */ 464 u8 *u; 465 }; 466 467 struct dsa_verify_pdb { 468 u32 sgf_ln; 469 u8 *q; 470 u8 *r; 471 u8 *g; /* or Gx,y */ 472 u8 *w; /* or Wx,y */ 473 u8 *f; 474 u8 *c; 475 u8 *d; 476 u8 *tmp; /* temporary data block */ 477 u8 *ab; /* only used if ECC processing */ 478 }; 479 480 /* RSA Protocol Data Block */ 481 #define RSA_PDB_SGF_SHIFT 28 482 #define RSA_PDB_E_SHIFT 12 483 #define RSA_PDB_E_MASK (0xFFF << RSA_PDB_E_SHIFT) 484 #define RSA_PDB_D_SHIFT 12 485 #define RSA_PDB_D_MASK (0xFFF << RSA_PDB_D_SHIFT) 486 487 #define RSA_PDB_SGF_F (0x8 << RSA_PDB_SGF_SHIFT) 488 #define RSA_PDB_SGF_G (0x4 << RSA_PDB_SGF_SHIFT) 489 #define RSA_PRIV_PDB_SGF_F (0x4 << RSA_PDB_SGF_SHIFT) 490 #define RSA_PRIV_PDB_SGF_G (0x8 << RSA_PDB_SGF_SHIFT) 491 492 #define RSA_PRIV_KEY_FRM_1 0 493 494 /** 495 * RSA Encrypt Protocol Data Block 496 * @sgf: scatter-gather field 497 * @f_dma: dma address of input data 498 * @g_dma: dma address of encrypted output data 499 * @n_dma: dma address of RSA modulus 500 * @e_dma: dma address of RSA public exponent 501 * @f_len: length in octets of the input data 502 */ 503 struct rsa_pub_pdb { 504 u32 sgf; 505 dma_addr_t f_dma; 506 dma_addr_t g_dma; 507 dma_addr_t n_dma; 508 dma_addr_t e_dma; 509 u32 f_len; 510 } __packed; 511 512 /** 513 * RSA Decrypt PDB - Private Key Form #1 514 * @sgf: scatter-gather field 515 * @g_dma: dma address of encrypted input data 516 * @f_dma: dma address of output data 517 * @n_dma: dma address of RSA modulus 518 * @d_dma: dma address of RSA private exponent 519 */ 520 struct rsa_priv_f1_pdb { 521 u32 sgf; 522 dma_addr_t g_dma; 523 dma_addr_t f_dma; 524 dma_addr_t n_dma; 525 dma_addr_t d_dma; 526 } __packed; 527 528 #endif 529