Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0+ */
0002 /*
0003  *  Copyright IBM Corp. 2001, 2012
0004  *  Author(s): Robert Burroughs
0005  *         Eric Rossman (edrossma@us.ibm.com)
0006  *
0007  *  Hotplug & misc device support: Jochen Roehrig (roehrig@de.ibm.com)
0008  *  Major cleanup & driver split: Martin Schwidefsky <schwidefsky@de.ibm.com>
0009  *  MSGTYPE restruct:         Holger Dengler <hd@linux.vnet.ibm.com>
0010  */
0011 
0012 #ifndef _ZCRYPT_MSGTYPE6_H_
0013 #define _ZCRYPT_MSGTYPE6_H_
0014 
0015 #include <asm/zcrypt.h>
0016 
0017 #define MSGTYPE06_NAME          "zcrypt_msgtype6"
0018 #define MSGTYPE06_VARIANT_DEFAULT   0
0019 #define MSGTYPE06_VARIANT_NORNG     1
0020 #define MSGTYPE06_VARIANT_EP11      2
0021 
0022 /**
0023  * The type 6 message family is associated with CEXxC/CEXxP cards.
0024  *
0025  * It contains a message header followed by a CPRB, both of which
0026  * are described below.
0027  *
0028  * Note that all reserved fields must be zeroes.
0029  */
0030 struct type6_hdr {
0031     unsigned char reserved1;    /* 0x00             */
0032     unsigned char type;     /* 0x06             */
0033     unsigned char reserved2[2]; /* 0x0000           */
0034     unsigned char right[4];     /* 0x00000000           */
0035     unsigned char reserved3[2]; /* 0x0000           */
0036     unsigned char reserved4[2]; /* 0x0000           */
0037     unsigned char apfs[4];      /* 0x00000000           */
0038     unsigned int  offset1;      /* 0x00000058 (offset to CPRB)  */
0039     unsigned int  offset2;      /* 0x00000000           */
0040     unsigned int  offset3;      /* 0x00000000           */
0041     unsigned int  offset4;      /* 0x00000000           */
0042     unsigned char agent_id[16]; /* 0x4341000000000000       */
0043                     /* 0x0000000000000000       */
0044     unsigned char rqid[2];      /* rqid.  internal to 603   */
0045     unsigned char reserved5[2]; /* 0x0000           */
0046     unsigned char function_code[2]; /* for PKD, 0x5044 (ascii 'PD') */
0047     unsigned char reserved6[2]; /* 0x0000           */
0048     unsigned int  tocardlen1;   /* (request CPRB len + 3) & -4  */
0049     unsigned int  tocardlen2;   /* db len 0x00000000 for PKD    */
0050     unsigned int  tocardlen3;   /* 0x00000000           */
0051     unsigned int  tocardlen4;   /* 0x00000000           */
0052     unsigned int  fromcardlen1; /* response buffer length   */
0053     unsigned int  fromcardlen2; /* db len 0x00000000 for PKD    */
0054     unsigned int  fromcardlen3; /* 0x00000000           */
0055     unsigned int  fromcardlen4; /* 0x00000000           */
0056 } __packed;
0057 
0058 /**
0059  * The type 86 message family is associated with CEXxC/CEXxP cards.
0060  *
0061  * It contains a message header followed by a CPRB.  The CPRB is
0062  * the same as the request CPRB, which is described above.
0063  *
0064  * If format is 1, an error condition exists and no data beyond
0065  * the 8-byte message header is of interest.
0066  *
0067  * The non-error message is shown below.
0068  *
0069  * Note that all reserved fields must be zeroes.
0070  */
0071 struct type86_hdr {
0072     unsigned char reserved1;    /* 0x00             */
0073     unsigned char type;     /* 0x86             */
0074     unsigned char format;       /* 0x01 (error) or 0x02 (ok)    */
0075     unsigned char reserved2;    /* 0x00             */
0076     unsigned char reply_code;   /* reply code (see above)   */
0077     unsigned char reserved3[3]; /* 0x000000         */
0078 } __packed;
0079 
0080 #define TYPE86_RSP_CODE 0x86
0081 #define TYPE87_RSP_CODE 0x87
0082 #define TYPE86_FMT2 0x02
0083 
0084 struct type86_fmt2_ext {
0085     unsigned char     reserved[4];  /* 0x00000000           */
0086     unsigned char     apfs[4];  /* final status         */
0087     unsigned int      count1;   /* length of CPRB + parameters  */
0088     unsigned int      offset1;  /* offset to CPRB       */
0089     unsigned int      count2;   /* 0x00000000           */
0090     unsigned int      offset2;  /* db offset 0x00000000 for PKD */
0091     unsigned int      count3;   /* 0x00000000           */
0092     unsigned int      offset3;  /* 0x00000000           */
0093     unsigned int      count4;   /* 0x00000000           */
0094     unsigned int      offset4;  /* 0x00000000           */
0095 } __packed;
0096 
0097 int prep_cca_ap_msg(bool userspace, struct ica_xcRB *xcrb,
0098             struct ap_message *ap_msg,
0099             unsigned int *fc, unsigned short **dom);
0100 int prep_ep11_ap_msg(bool userspace, struct ep11_urb *xcrb,
0101              struct ap_message *ap_msg,
0102              unsigned int *fc, unsigned int *dom);
0103 int prep_rng_ap_msg(struct ap_message *ap_msg,
0104             int *fc, unsigned int *dom);
0105 
0106 #define LOW 10
0107 #define MEDIUM  100
0108 #define HIGH    500
0109 
0110 int speed_idx_cca(int);
0111 int speed_idx_ep11(int);
0112 
0113 /**
0114  * Prepare a type6 CPRB message for random number generation
0115  *
0116  * @ap_dev: AP device pointer
0117  * @ap_msg: pointer to AP message
0118  */
0119 static inline void rng_type6cprb_msgx(struct ap_message *ap_msg,
0120                       unsigned int random_number_length,
0121                       unsigned int *domain)
0122 {
0123     struct {
0124         struct type6_hdr hdr;
0125         struct CPRBX cprbx;
0126         char function_code[2];
0127         short int rule_length;
0128         char rule[8];
0129         short int verb_length;
0130         short int key_length;
0131     } __packed * msg = ap_msg->msg;
0132     static struct type6_hdr static_type6_hdrX = {
0133         .type       = 0x06,
0134         .offset1    = 0x00000058,
0135         .agent_id   = {'C', 'A'},
0136         .function_code  = {'R', 'L'},
0137         .tocardlen1 = sizeof(*msg) - sizeof(msg->hdr),
0138         .fromcardlen1   = sizeof(*msg) - sizeof(msg->hdr),
0139     };
0140     static struct CPRBX local_cprbx = {
0141         .cprb_len   = 0x00dc,
0142         .cprb_ver_id    = 0x02,
0143         .func_id    = {0x54, 0x32},
0144         .req_parml  = sizeof(*msg) - sizeof(msg->hdr) -
0145                   sizeof(msg->cprbx),
0146         .rpl_msgbl  = sizeof(*msg) - sizeof(msg->hdr),
0147     };
0148 
0149     msg->hdr = static_type6_hdrX;
0150     msg->hdr.fromcardlen2 = random_number_length;
0151     msg->cprbx = local_cprbx;
0152     msg->cprbx.rpl_datal = random_number_length;
0153     memcpy(msg->function_code, msg->hdr.function_code, 0x02);
0154     msg->rule_length = 0x0a;
0155     memcpy(msg->rule, "RANDOM  ", 8);
0156     msg->verb_length = 0x02;
0157     msg->key_length = 0x02;
0158     ap_msg->len = sizeof(*msg);
0159     *domain = (unsigned short)msg->cprbx.domain;
0160 }
0161 
0162 void zcrypt_msgtype6_init(void);
0163 void zcrypt_msgtype6_exit(void);
0164 
0165 #endif /* _ZCRYPT_MSGTYPE6_H_ */