|
@@ -33,8 +33,10 @@ enum {
|
|
|
OSD_CAP_LEN = OSDv1_CAP_LEN,/* FIXME: Pete rev-001 sup */
|
|
|
|
|
|
OSD_SYSTEMID_LEN = 20,
|
|
|
- OSD_CRYPTO_KEYID_SIZE = 20,
|
|
|
+ OSDv1_CRYPTO_KEYID_SIZE = 20,
|
|
|
/*FIXME: OSDv2_CRYPTO_KEYID_SIZE = 32,*/
|
|
|
+ OSDv2_CRYPTO_KEYID_SIZE = 20,
|
|
|
+ OSD_CRYPTO_KEYID_SIZE = OSDv2_CRYPTO_KEYID_SIZE,
|
|
|
OSD_CRYPTO_SEED_SIZE = 4,
|
|
|
OSD_CRYPTO_NONCE_SIZE = 12,
|
|
|
OSD_MAX_SENSE_LEN = 252, /* from SPC-3 */
|
|
@@ -204,29 +206,40 @@ struct osd_cdb_head {
|
|
|
/*80*/
|
|
|
|
|
|
/*160 v1*/
|
|
|
-/*184 v2*/
|
|
|
-struct osd_security_parameters {
|
|
|
-/*160*/u8 integrity_check_value[OSD_CRYPTO_KEYID_SIZE];
|
|
|
+struct osdv1_security_parameters {
|
|
|
+/*160*/u8 integrity_check_value[OSDv1_CRYPTO_KEYID_SIZE];
|
|
|
/*180*/u8 request_nonce[OSD_CRYPTO_NONCE_SIZE];
|
|
|
/*192*/osd_cdb_offset data_in_integrity_check_offset;
|
|
|
/*196*/osd_cdb_offset data_out_integrity_check_offset;
|
|
|
} __packed;
|
|
|
/*200 v1*/
|
|
|
-/*224 v2*/
|
|
|
|
|
|
-/* FIXME: osdv2_security_parameters */
|
|
|
+/*184 v2*/
|
|
|
+struct osdv2_security_parameters {
|
|
|
+/*184*/u8 integrity_check_value[OSDv2_CRYPTO_KEYID_SIZE];
|
|
|
+/*216*/u8 request_nonce[OSD_CRYPTO_NONCE_SIZE];
|
|
|
+/*228*/osd_cdb_offset data_in_integrity_check_offset;
|
|
|
+/*232*/osd_cdb_offset data_out_integrity_check_offset;
|
|
|
+} __packed;
|
|
|
+/*236 v2*/
|
|
|
+
|
|
|
+struct osd_security_parameters {
|
|
|
+ union {
|
|
|
+ struct osdv1_security_parameters v1;
|
|
|
+ struct osdv2_security_parameters v2;
|
|
|
+ };
|
|
|
+};
|
|
|
|
|
|
struct osdv1_cdb {
|
|
|
struct osd_cdb_head h;
|
|
|
u8 caps[OSDv1_CAP_LEN];
|
|
|
- struct osd_security_parameters sec_params;
|
|
|
+ struct osdv1_security_parameters sec_params;
|
|
|
} __packed;
|
|
|
|
|
|
struct osdv2_cdb {
|
|
|
struct osd_cdb_head h;
|
|
|
u8 caps[OSD_CAP_LEN];
|
|
|
- struct osd_security_parameters sec_params;
|
|
|
- /* FIXME: osdv2_security_parameters */
|
|
|
+ struct osdv2_security_parameters sec_params;
|
|
|
} __packed;
|
|
|
|
|
|
struct osd_cdb {
|
|
@@ -429,15 +442,35 @@ struct osd_data_out_integrity_info {
|
|
|
__be64 data_bytes;
|
|
|
__be64 set_attributes_bytes;
|
|
|
__be64 get_attributes_bytes;
|
|
|
- __be64 integrity_check_value;
|
|
|
+ __u8 integrity_check_value[OSD_CRYPTO_KEYID_SIZE];
|
|
|
} __packed;
|
|
|
|
|
|
+/* Same osd_data_out_integrity_info is used for OSD2/OSD1. The only difference
|
|
|
+ * Is the sizeof the structure since in OSD1 the last array is smaller. Use
|
|
|
+ * below for version independent handling of this structure
|
|
|
+ */
|
|
|
+static inline int osd_data_out_integrity_info_sizeof(bool is_ver1)
|
|
|
+{
|
|
|
+ return sizeof(struct osd_data_out_integrity_info) -
|
|
|
+ (is_ver1 * (OSDv2_CRYPTO_KEYID_SIZE - OSDv1_CRYPTO_KEYID_SIZE));
|
|
|
+}
|
|
|
+
|
|
|
struct osd_data_in_integrity_info {
|
|
|
__be64 data_bytes;
|
|
|
__be64 retrieved_attributes_bytes;
|
|
|
- __be64 integrity_check_value;
|
|
|
+ __u8 integrity_check_value[OSD_CRYPTO_KEYID_SIZE];
|
|
|
} __packed;
|
|
|
|
|
|
+/* Same osd_data_in_integrity_info is used for OSD2/OSD1. The only difference
|
|
|
+ * Is the sizeof the structure since in OSD1 the last array is smaller. Use
|
|
|
+ * below for version independent handling of this structure
|
|
|
+ */
|
|
|
+static inline int osd_data_in_integrity_info_sizeof(bool is_ver1)
|
|
|
+{
|
|
|
+ return sizeof(struct osd_data_in_integrity_info) -
|
|
|
+ (is_ver1 * (OSDv2_CRYPTO_KEYID_SIZE - OSDv1_CRYPTO_KEYID_SIZE));
|
|
|
+}
|
|
|
+
|
|
|
struct osd_timestamp {
|
|
|
u8 time[6]; /* number of milliseconds since 1/1/1970 UT (big endian) */
|
|
|
} __packed;
|