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