text: /* SPDX-License-Identifier: GPL-2.0+ */
  /*
   *  zcrypt 2.1.0
   *
   *  Copyright IBM Corp. 2001, 2006
   *  Author(s): Robert Burroughs
   *	       Eric Rossman (edrossma@us.ibm.com)
   *
   *  Hotplug & misc device support: Jochen Roehrig (roehrig@de.ibm.com)
   *  Major cleanup & driver split: Martin Schwidefsky <schwidefsky@de.ibm.com>
   */
  
  #ifndef _ZCRYPT_CEX2A_H_
  #define _ZCRYPT_CEX2A_H_
  
  /**
   * The type 50 message family is associated with a CEX2A card.
   *
   * The four members of the family are described below.
   *
   * Note that all unsigned char arrays are right-justified and left-padded
   * with zeroes.
   *
   * Note that all reserved fields must be zeroes.
   */
  struct type50_hdr {
  	unsigned char	reserved1;
  	unsigned char	msg_type_code;	/* 0x50 */
  	unsigned short	msg_len;
  	unsigned char	reserved2;
  	unsigned char	ignored;
  	unsigned short	reserved3;
  } __packed;
  
  #define TYPE50_TYPE_CODE	0x50
  
  #define TYPE50_MEB1_FMT		0x0001
  #define TYPE50_MEB2_FMT		0x0002
  #define TYPE50_MEB3_FMT		0x0003
  #define TYPE50_CRB1_FMT		0x0011
  #define TYPE50_CRB2_FMT		0x0012
  #define TYPE50_CRB3_FMT		0x0013
  
  /* Mod-Exp, with a small modulus */
  struct type50_meb1_msg {
  	struct type50_hdr header;
  	unsigned short	keyblock_type;	/* 0x0001 */
  	unsigned char	reserved[6];
  	unsigned char	exponent[128];
  	unsigned char	modulus[128];
  	unsigned char	message[128];
  } __packed;
  
  /* Mod-Exp, with a large modulus */
  struct type50_meb2_msg {
  	struct type50_hdr header;
  	unsigned short	keyblock_type;	/* 0x0002 */
  	unsigned char	reserved[6];
  	unsigned char	exponent[256];
  	unsigned char	modulus[256];
  	unsigned char	message[256];
  } __packed;
  
  /* Mod-Exp, with a larger modulus */
  struct type50_meb3_msg {
  	struct type50_hdr header;
  	unsigned short	keyblock_type;	/* 0x0003 */
  	unsigned char	reserved[6];
  	unsigned char	exponent[512];
  	unsigned char	modulus[512];
  	unsigned char	message[512];
  } __packed;
  
  /* CRT, with a small modulus */
  struct type50_crb1_msg {
  	struct type50_hdr header;
  	unsigned short	keyblock_type;	/* 0x0011 */
  	unsigned char	reserved[6];
  	unsigned char	p[64];
  	unsigned char	q[64];
  	unsigned char	dp[64];
  	unsigned char	dq[64];
  	unsigned char	u[64];
  	unsigned char	message[128];
  } __packed;
  
  /* CRT, with a large modulus */
  struct type50_crb2_msg {
  	struct type50_hdr header;
  	unsigned short	keyblock_type;	/* 0x0012 */
  	unsigned char	reserved[6];
  	unsigned char	p[128];
  	unsigned char	q[128];
  	unsigned char	dp[128];
  	unsigned char	dq[128];
  	unsigned char	u[128];
  	unsigned char	message[256];
  } __packed;
  
  /* CRT, with a larger modulus */
  struct type50_crb3_msg {
  	struct type50_hdr header;
  	unsigned short	keyblock_type;	/* 0x0013 */
  	unsigned char	reserved[6];
  	unsigned char	p[256];
  	unsigned char	q[256];
  	unsigned char	dp[256];
  	unsigned char	dq[256];
  	unsigned char	u[256];
  	unsigned char	message[512];
  } __packed;
  
  /**
   * The type 80 response family is associated with a CEX2A card.
   *
   * Note that all unsigned char arrays are right-justified and left-padded
   * with zeroes.
   *
   * Note that all reserved fields must be zeroes.
   */
  
  #define TYPE80_RSP_CODE 0x80
  
  struct type80_hdr {
  	unsigned char	reserved1;
  	unsigned char	type;		/* 0x80 */
  	unsigned short	len;
  	unsigned char	code;		/* 0x00 */
  	unsigned char	reserved2[3];
  	unsigned char	reserved3[8];
  } __packed;
  
  int zcrypt_cex2a_init(void);
  void zcrypt_cex2a_exit(void);
  
  #endif /* _ZCRYPT_CEX2A_H_ */
  