pdb.h 14.2 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * CAAM Protocol Data Block (PDB) definition header file
 *
 * Copyright 2008-2016 Freescale Semiconductor, Inc.
 * Copyright 2018 NXP
 *
 */

#ifndef CAAM_PDB_H
#define CAAM_PDB_H
#include "compat.h"
#include "regs.h"

/*
 * PDB- IPSec ESP Header Modification Options
 */
#define PDBHMO_ESP_DECAP_SHIFT	28
#define PDBHMO_ESP_ENCAP_SHIFT	28
/*
 * Encap and Decap - Decrement TTL (Hop Limit) - Based on the value of the
 * Options Byte IP version (IPvsn) field:
 * if IPv4, decrement the inner IP header TTL field (byte 8);
 * if IPv6 decrement the inner IP header Hop Limit field (byte 7).
*/
#define PDBHMO_ESP_DECAP_DEC_TTL	(0x02 << PDBHMO_ESP_DECAP_SHIFT)
#define PDBHMO_ESP_ENCAP_DEC_TTL	(0x02 << PDBHMO_ESP_ENCAP_SHIFT)
/*
 * Decap - DiffServ Copy - Copy the IPv4 TOS or IPv6 Traffic Class byte
 * from the outer IP header to the inner IP header.
 */
#define PDBHMO_ESP_DIFFSERV		(0x01 << PDBHMO_ESP_DECAP_SHIFT)
/*
 * Encap- Copy DF bit -if an IPv4 tunnel mode outer IP header is coming from
 * the PDB, copy the DF bit from the inner IP header to the outer IP header.
 */
#define PDBHMO_ESP_DFBIT		(0x04 << PDBHMO_ESP_ENCAP_SHIFT)

#define PDBNH_ESP_ENCAP_SHIFT		16
#define PDBNH_ESP_ENCAP_MASK		(0xff << PDBNH_ESP_ENCAP_SHIFT)

#define PDBHDRLEN_ESP_DECAP_SHIFT	16
#define PDBHDRLEN_MASK			(0x0fff << PDBHDRLEN_ESP_DECAP_SHIFT)

#define PDB_NH_OFFSET_SHIFT		8
#define PDB_NH_OFFSET_MASK		(0xff << PDB_NH_OFFSET_SHIFT)

/*
 * PDB - IPSec ESP Encap/Decap Options
 */
#define PDBOPTS_ESP_ARSNONE	0x00 /* no antireplay window */
#define PDBOPTS_ESP_ARS32	0x40 /* 32-entry antireplay window */
#define PDBOPTS_ESP_ARS128	0x80 /* 128-entry antireplay window */
#define PDBOPTS_ESP_ARS64	0xc0 /* 64-entry antireplay window */
#define PDBOPTS_ESP_ARS_MASK	0xc0 /* antireplay window mask */
#define PDBOPTS_ESP_IVSRC	0x20 /* IV comes from internal random gen */
#define PDBOPTS_ESP_ESN		0x10 /* extended sequence included */
#define PDBOPTS_ESP_OUTFMT	0x08 /* output only decapsulation (decap) */
#define PDBOPTS_ESP_IPHDRSRC	0x08 /* IP header comes from PDB (encap) */
#define PDBOPTS_ESP_INCIPHDR	0x04 /* Prepend IP header to output frame */
#define PDBOPTS_ESP_IPVSN	0x02 /* process IPv6 header */
#define PDBOPTS_ESP_AOFL	0x04 /* adjust out frame len (decap, SEC>=5.3)*/
#define PDBOPTS_ESP_TUNNEL	0x01 /* tunnel mode next-header byte */
#define PDBOPTS_ESP_IPV6	0x02 /* ip header version is V6 */
#define PDBOPTS_ESP_DIFFSERV	0x40 /* copy TOS/TC from inner iphdr */
#define PDBOPTS_ESP_UPDATE_CSUM 0x80 /* encap-update ip header checksum */
#define PDBOPTS_ESP_VERIFY_CSUM 0x20 /* decap-validate ip header checksum */

/*
 * General IPSec encap/decap PDB definitions
 */

/**
 * ipsec_encap_cbc - PDB part for IPsec CBC encapsulation
 * @iv: 16-byte array initialization vector
 */
struct ipsec_encap_cbc {
	u8 iv[16];
};

/**
 * ipsec_encap_ctr - PDB part for IPsec CTR encapsulation
 * @ctr_nonce: 4-byte array nonce
 * @ctr_initial: initial count constant
 * @iv: initialization vector
 */
struct ipsec_encap_ctr {
	u8 ctr_nonce[4];
	u32 ctr_initial;
	u64 iv;
};

/**
 * ipsec_encap_ccm - PDB part for IPsec CCM encapsulation
 * @salt: 3-byte array salt (lower 24 bits)
 * @ccm_opt: CCM algorithm options - MSB-LSB description:
 *  b0_flags (8b) - CCM B0; use 0x5B for 8-byte ICV, 0x6B for 12-byte ICV,
 *    0x7B for 16-byte ICV (cf. RFC4309, RFC3610)
 *  ctr_flags (8b) - counter flags; constant equal to 0x3
 *  ctr_initial (16b) - initial count constant
 * @iv: initialization vector
 */
struct ipsec_encap_ccm {
	u8 salt[4];
	u32 ccm_opt;
	u64 iv;
};

/**
 * ipsec_encap_gcm - PDB part for IPsec GCM encapsulation
 * @salt: 3-byte array salt (lower 24 bits)
 * @rsvd: reserved, do not use
 * @iv: initialization vector
 */
struct ipsec_encap_gcm {
	u8 salt[4];
	u32 rsvd1;
	u64 iv;
};

/**
 * ipsec_encap_pdb - PDB for IPsec encapsulation
 * @options: MSB-LSB description
 *  hmo (header manipulation options) - 4b
 *  reserved - 4b
 *  next header - 8b
 *  next header offset - 8b
 *  option flags (depend on selected algorithm) - 8b
 * @seq_num_ext_hi: (optional) IPsec Extended Sequence Number (ESN)
 * @seq_num: IPsec sequence number
 * @spi: IPsec SPI (Security Parameters Index)
 * @ip_hdr_len: optional IP Header length (in bytes)
 *  reserved - 16b
 *  Opt. IP Hdr Len - 16b
 * @ip_hdr: optional IP Header content
 */
struct ipsec_encap_pdb {
	u32 options;
	u32 seq_num_ext_hi;
	u32 seq_num;
	union {
		struct ipsec_encap_cbc cbc;
		struct ipsec_encap_ctr ctr;
		struct ipsec_encap_ccm ccm;
		struct ipsec_encap_gcm gcm;
	};
	u32 spi;
	u32 ip_hdr_len;
	u32 ip_hdr[0];
};

/**
 * ipsec_decap_cbc - PDB part for IPsec CBC decapsulation
 * @rsvd: reserved, do not use
 */
struct ipsec_decap_cbc {
	u32 rsvd[2];
};

/**
 * ipsec_decap_ctr - PDB part for IPsec CTR decapsulation
 * @ctr_nonce: 4-byte array nonce
 * @ctr_initial: initial count constant
 */
struct ipsec_decap_ctr {
	u8 ctr_nonce[4];
	u32 ctr_initial;
};

/**
 * ipsec_decap_ccm - PDB part for IPsec CCM decapsulation
 * @salt: 3-byte salt (lower 24 bits)
 * @ccm_opt: CCM algorithm options - MSB-LSB description:
 *  b0_flags (8b) - CCM B0; use 0x5B for 8-byte ICV, 0x6B for 12-byte ICV,
 *    0x7B for 16-byte ICV (cf. RFC4309, RFC3610)
 *  ctr_flags (8b) - counter flags; constant equal to 0x3
 *  ctr_initial (16b) - initial count constant
 */
struct ipsec_decap_ccm {
	u8 salt[4];
	u32 ccm_opt;
};

/**
 * ipsec_decap_gcm - PDB part for IPsec GCN decapsulation
 * @salt: 4-byte salt
 * @rsvd: reserved, do not use
 */
struct ipsec_decap_gcm {
	u8 salt[4];
	u32 resvd;
};

/**
 * ipsec_decap_pdb - PDB for IPsec decapsulation
 * @options: MSB-LSB description
 *  hmo (header manipulation options) - 4b
 *  IP header length - 12b
 *  next header offset - 8b
 *  option flags (depend on selected algorithm) - 8b
 * @seq_num_ext_hi: (optional) IPsec Extended Sequence Number (ESN)
 * @seq_num: IPsec sequence number
 * @anti_replay: Anti-replay window; size depends on ARS (option flags)
 */
struct ipsec_decap_pdb {
	u32 options;
	union {
		struct ipsec_decap_cbc cbc;
		struct ipsec_decap_ctr ctr;
		struct ipsec_decap_ccm ccm;
		struct ipsec_decap_gcm gcm;
	};
	u32 seq_num_ext_hi;
	u32 seq_num;
	__be32 anti_replay[4];
};

/*
 * IPSec ESP Datapath Protocol Override Register (DPOVRD)
 */
struct ipsec_deco_dpovrd {
#define IPSEC_ENCAP_DECO_DPOVRD_USE 0x80
	u8 ovrd_ecn;
	u8 ip_hdr_len;
	u8 nh_offset;
	u8 next_header; /* reserved if decap */
};

/*
 * IEEE 802.11i WiFi Protocol Data Block
 */
#define WIFI_PDBOPTS_FCS	0x01
#define WIFI_PDBOPTS_AR		0x40

struct wifi_encap_pdb {
	u16 mac_hdr_len;
	u8 rsvd;
	u8 options;
	u8 iv_flags;
	u8 pri;
	u16 pn1;
	u32 pn2;
	u16 frm_ctrl_mask;
	u16 seq_ctrl_mask;
	u8 rsvd1[2];
	u8 cnst;
	u8 key_id;
	u8 ctr_flags;
	u8 rsvd2;
	u16 ctr_init;
};

struct wifi_decap_pdb {
	u16 mac_hdr_len;
	u8 rsvd;
	u8 options;
	u8 iv_flags;
	u8 pri;
	u16 pn1;
	u32 pn2;
	u16 frm_ctrl_mask;
	u16 seq_ctrl_mask;
	u8 rsvd1[4];
	u8 ctr_flags;
	u8 rsvd2;
	u16 ctr_init;
};

/*
 * IEEE 802.16 WiMAX Protocol Data Block
 */
#define WIMAX_PDBOPTS_FCS	0x01
#define WIMAX_PDBOPTS_AR	0x40 /* decap only */

struct wimax_encap_pdb {
	u8 rsvd[3];
	u8 options;
	u32 nonce;
	u8 b0_flags;
	u8 ctr_flags;
	u16 ctr_init;
	/* begin DECO writeback region */
	u32 pn;
	/* end DECO writeback region */
};

struct wimax_decap_pdb {
	u8 rsvd[3];
	u8 options;
	u32 nonce;
	u8 iv_flags;
	u8 ctr_flags;
	u16 ctr_init;
	/* begin DECO writeback region */
	u32 pn;
	u8 rsvd1[2];
	u16 antireplay_len;
	u64 antireplay_scorecard;
	/* end DECO writeback region */
};

/*
 * IEEE 801.AE MacSEC Protocol Data Block
 */
#define MACSEC_PDBOPTS_FCS	0x01
#define MACSEC_PDBOPTS_AR	0x40 /* used in decap only */

struct macsec_encap_pdb {
	u16 aad_len;
	u8 rsvd;
	u8 options;
	u64 sci;
	u16 ethertype;
	u8 tci_an;
	u8 rsvd1;
	/* begin DECO writeback region */
	u32 pn;
	/* end DECO writeback region */
};

struct macsec_decap_pdb {
	u16 aad_len;
	u8 rsvd;
	u8 options;
	u64 sci;
	u8 rsvd1[3];
	/* begin DECO writeback region */
	u8 antireplay_len;
	u32 pn;
	u64 antireplay_scorecard;
	/* end DECO writeback region */
};

/*
 * SSL/TLS/DTLS Protocol Data Blocks
 */

#define TLS_PDBOPTS_ARS32	0x40
#define TLS_PDBOPTS_ARS64	0xc0
#define TLS_PDBOPTS_OUTFMT	0x08
#define TLS_PDBOPTS_IV_WRTBK	0x02 /* 1.1/1.2/DTLS only */
#define TLS_PDBOPTS_EXP_RND_IV	0x01 /* 1.1/1.2/DTLS only */

struct tls_block_encap_pdb {
	u8 type;
	u8 version[2];
	u8 options;
	u64 seq_num;
	u32 iv[4];
};

struct tls_stream_encap_pdb {
	u8 type;
	u8 version[2];
	u8 options;
	u64 seq_num;
	u8 i;
	u8 j;
	u8 rsvd1[2];
};

struct dtls_block_encap_pdb {
	u8 type;
	u8 version[2];
	u8 options;
	u16 epoch;
	u16 seq_num[3];
	u32 iv[4];
};

struct tls_block_decap_pdb {
	u8 rsvd[3];
	u8 options;
	u64 seq_num;
	u32 iv[4];
};

struct tls_stream_decap_pdb {
	u8 rsvd[3];
	u8 options;
	u64 seq_num;
	u8 i;
	u8 j;
	u8 rsvd1[2];
};

struct dtls_block_decap_pdb {
	u8 rsvd[3];
	u8 options;
	u16 epoch;
	u16 seq_num[3];
	u32 iv[4];
	u64 antireplay_scorecard;
};

/*
 * SRTP Protocol Data Blocks
 */
#define SRTP_PDBOPTS_MKI	0x08
#define SRTP_PDBOPTS_AR		0x40

struct srtp_encap_pdb {
	u8 x_len;
	u8 mki_len;
	u8 n_tag;
	u8 options;
	u32 cnst0;
	u8 rsvd[2];
	u16 cnst1;
	u16 salt[7];
	u16 cnst2;
	u32 rsvd1;
	u32 roc;
	u32 opt_mki;
};

struct srtp_decap_pdb {
	u8 x_len;
	u8 mki_len;
	u8 n_tag;
	u8 options;
	u32 cnst0;
	u8 rsvd[2];
	u16 cnst1;
	u16 salt[7];
	u16 cnst2;
	u16 rsvd1;
	u16 seq_num;
	u32 roc;
	u64 antireplay_scorecard;
};

/*
 * DSA/ECDSA Protocol Data Blocks
 * Two of these exist: DSA-SIGN, and DSA-VERIFY. They are similar
 * except for the treatment of "w" for verify, "s" for sign,
 * and the placement of "a,b".
 */
#define DSA_PDB_SGF_SHIFT	24
#define DSA_PDB_SGF_MASK	(0xff << DSA_PDB_SGF_SHIFT)
#define DSA_PDB_SGF_Q		(0x80 << DSA_PDB_SGF_SHIFT)
#define DSA_PDB_SGF_R		(0x40 << DSA_PDB_SGF_SHIFT)
#define DSA_PDB_SGF_G		(0x20 << DSA_PDB_SGF_SHIFT)
#define DSA_PDB_SGF_W		(0x10 << DSA_PDB_SGF_SHIFT)
#define DSA_PDB_SGF_S		(0x10 << DSA_PDB_SGF_SHIFT)
#define DSA_PDB_SGF_F		(0x08 << DSA_PDB_SGF_SHIFT)
#define DSA_PDB_SGF_C		(0x04 << DSA_PDB_SGF_SHIFT)
#define DSA_PDB_SGF_D		(0x02 << DSA_PDB_SGF_SHIFT)
#define DSA_PDB_SGF_AB_SIGN	(0x02 << DSA_PDB_SGF_SHIFT)
#define DSA_PDB_SGF_AB_VERIFY	(0x01 << DSA_PDB_SGF_SHIFT)

#define DSA_PDB_L_SHIFT		7
#define DSA_PDB_L_MASK		(0x3ff << DSA_PDB_L_SHIFT)

#define DSA_PDB_N_MASK		0x7f

struct dsa_sign_pdb {
	u32 sgf_ln; /* Use DSA_PDB_ defintions per above */
	u8 *q;
	u8 *r;
	u8 *g;	/* or Gx,y */
	u8 *s;
	u8 *f;
	u8 *c;
	u8 *d;
	u8 *ab; /* ECC only */
	u8 *u;
};

struct dsa_verify_pdb {
	u32 sgf_ln;
	u8 *q;
	u8 *r;
	u8 *g;	/* or Gx,y */
	u8 *w; /* or Wx,y */
	u8 *f;
	u8 *c;
	u8 *d;
	u8 *tmp; /* temporary data block */
	u8 *ab; /* only used if ECC processing */
};

/* RSA Protocol Data Block */
#define RSA_PDB_SGF_SHIFT       28
#define RSA_PDB_E_SHIFT         12
#define RSA_PDB_E_MASK          (0xFFF << RSA_PDB_E_SHIFT)
#define RSA_PDB_D_SHIFT         12
#define RSA_PDB_D_MASK          (0xFFF << RSA_PDB_D_SHIFT)
#define RSA_PDB_Q_SHIFT         12
#define RSA_PDB_Q_MASK          (0xFFF << RSA_PDB_Q_SHIFT)

#define RSA_PDB_SGF_F           (0x8 << RSA_PDB_SGF_SHIFT)
#define RSA_PDB_SGF_G           (0x4 << RSA_PDB_SGF_SHIFT)
#define RSA_PRIV_PDB_SGF_F      (0x4 << RSA_PDB_SGF_SHIFT)
#define RSA_PRIV_PDB_SGF_G      (0x8 << RSA_PDB_SGF_SHIFT)

#define RSA_PRIV_KEY_FRM_1      0
#define RSA_PRIV_KEY_FRM_2      1
#define RSA_PRIV_KEY_FRM_3      2

/**
 * RSA Encrypt Protocol Data Block
 * @sgf: scatter-gather field
 * @f_dma: dma address of input data
 * @g_dma: dma address of encrypted output data
 * @n_dma: dma address of RSA modulus
 * @e_dma: dma address of RSA public exponent
 * @f_len: length in octets of the input data
 */
struct rsa_pub_pdb {
	u32		sgf;
	caam_dma_addr_t	f_dma;
	caam_dma_addr_t	g_dma;
	caam_dma_addr_t	n_dma;
	caam_dma_addr_t	e_dma;
	u32		f_len;
} __packed;

/**
 * RSA Decrypt PDB - Private Key Form #1
 * @sgf: scatter-gather field
 * @g_dma: dma address of encrypted input data
 * @f_dma: dma address of output data
 * @n_dma: dma address of RSA modulus
 * @d_dma: dma address of RSA private exponent
 */
struct rsa_priv_f1_pdb {
	u32		sgf;
	caam_dma_addr_t	g_dma;
	caam_dma_addr_t	f_dma;
	caam_dma_addr_t	n_dma;
	caam_dma_addr_t	d_dma;
} __packed;

/**
 * RSA Decrypt PDB - Private Key Form #2
 * @sgf     : scatter-gather field
 * @g_dma   : dma address of encrypted input data
 * @f_dma   : dma address of output data
 * @d_dma   : dma address of RSA private exponent
 * @p_dma   : dma address of RSA prime factor p of RSA modulus n
 * @q_dma   : dma address of RSA prime factor q of RSA modulus n
 * @tmp1_dma: dma address of temporary buffer. CAAM uses this temporary buffer
 *            as internal state buffer. It is assumed to be as long as p.
 * @tmp2_dma: dma address of temporary buffer. CAAM uses this temporary buffer
 *            as internal state buffer. It is assumed to be as long as q.
 * @p_q_len : length in bytes of first two prime factors of the RSA modulus n
 */
struct rsa_priv_f2_pdb {
	u32		sgf;
	caam_dma_addr_t	g_dma;
	caam_dma_addr_t	f_dma;
	caam_dma_addr_t	d_dma;
	caam_dma_addr_t	p_dma;
	caam_dma_addr_t	q_dma;
	caam_dma_addr_t	tmp1_dma;
	caam_dma_addr_t	tmp2_dma;
	u32		p_q_len;
} __packed;

/**
 * RSA Decrypt PDB - Private Key Form #3
 * This is the RSA Chinese Reminder Theorem (CRT) form for two prime factors of
 * the RSA modulus.
 * @sgf     : scatter-gather field
 * @g_dma   : dma address of encrypted input data
 * @f_dma   : dma address of output data
 * @c_dma   : dma address of RSA CRT coefficient
 * @p_dma   : dma address of RSA prime factor p of RSA modulus n
 * @q_dma   : dma address of RSA prime factor q of RSA modulus n
 * @dp_dma  : dma address of RSA CRT exponent of RSA prime factor p
 * @dp_dma  : dma address of RSA CRT exponent of RSA prime factor q
 * @tmp1_dma: dma address of temporary buffer. CAAM uses this temporary buffer
 *            as internal state buffer. It is assumed to be as long as p.
 * @tmp2_dma: dma address of temporary buffer. CAAM uses this temporary buffer
 *            as internal state buffer. It is assumed to be as long as q.
 * @p_q_len : length in bytes of first two prime factors of the RSA modulus n
 */
struct rsa_priv_f3_pdb {
	u32		sgf;
	caam_dma_addr_t	g_dma;
	caam_dma_addr_t	f_dma;
	caam_dma_addr_t	c_dma;
	caam_dma_addr_t	p_dma;
	caam_dma_addr_t	q_dma;
	caam_dma_addr_t	dp_dma;
	caam_dma_addr_t	dq_dma;
	caam_dma_addr_t	tmp1_dma;
	caam_dma_addr_t	tmp2_dma;
	u32		p_q_len;
} __packed;

#endif