Skip to content

Commit af40322

Browse files
hfreudeAlexander Gordeev
authored andcommitted
s390/zcrypt: do not retry administrative requests
All kind of administrative requests should not been retried. Some card firmware detects this and assumes a replay attack. This patch checks on failure if the low level functions indicate a retry (EAGAIN) and checks for the ADMIN flag set on the request message. If this both are true, the response code for this message is changed to EIO to make sure the zcrypt API layer does not attempt to retry the request. As of now the ADMIN flag is set for a request message when - for EP11 the field 'flags' of the EP11 CPRB struct has the leftmost bit set. - for CCA when the CPRB minor version is 'T3', 'T5', 'T6' or 'T7'. Please note that the do-not-retry only applies to a request which has been sent to the card (= has been successfully enqueued) but the reply indicates some kind of failure and by default it would be replied. It is totally fine to retry a request if a previous attempt to enqueue the msg into the firmware queue had some kind of failure and thus the card has never seen this request. Reported-by: Frank Uhlig <Frank.Uhlig1@ibm.com> Signed-off-by: Harald Freudenberger <freude@linux.ibm.com> Reviewed-by: Holger Dengler <dengler@linux.ibm.com> Cc: stable@vger.kernel.org Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
1 parent 0fdcc88 commit af40322

1 file changed

Lines changed: 6 additions & 0 deletions

File tree

drivers/s390/crypto/zcrypt_msgtype6.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1133,6 +1133,9 @@ static long zcrypt_msgtype6_send_cprb(bool userspace, struct zcrypt_queue *zq,
11331133
ap_cancel_message(zq->queue, ap_msg);
11341134
}
11351135

1136+
if (rc == -EAGAIN && ap_msg->flags & AP_MSG_FLAG_ADMIN)
1137+
rc = -EIO; /* do not retry administrative requests */
1138+
11361139
out:
11371140
if (rc)
11381141
ZCRYPT_DBF_DBG("%s send cprb at dev=%02x.%04x rc=%d\n",
@@ -1253,6 +1256,9 @@ static long zcrypt_msgtype6_send_ep11_cprb(bool userspace, struct zcrypt_queue *
12531256
ap_cancel_message(zq->queue, ap_msg);
12541257
}
12551258

1259+
if (rc == -EAGAIN && ap_msg->flags & AP_MSG_FLAG_ADMIN)
1260+
rc = -EIO; /* do not retry administrative requests */
1261+
12561262
out:
12571263
if (rc)
12581264
ZCRYPT_DBF_DBG("%s send cprb at dev=%02x.%04x rc=%d\n",

0 commit comments

Comments
 (0)