@@ -572,6 +572,12 @@ int pkey_sec2protkey(u16 cardnr, u16 domain,
572572 rc = - EIO ;
573573 goto out ;
574574 }
575+ if (prepcblk -> ccp_rscode != 0 ) {
576+ DEBUG_WARN (
577+ "pkey_sec2protkey unwrap secure key warning, card response %d/%d\n" ,
578+ (int ) prepcblk -> ccp_rtcode ,
579+ (int ) prepcblk -> ccp_rscode );
580+ }
575581
576582 /* process response cprb param block */
577583 prepcblk -> rpl_parmb = ((u8 * ) prepcblk ) + sizeof (struct CPRBX );
@@ -761,9 +767,10 @@ static int query_crypto_facility(u16 cardnr, u16 domain,
761767}
762768
763769/*
764- * Fetch just the mkvp value via query_crypto_facility from adapter.
770+ * Fetch the current and old mkvp values via
771+ * query_crypto_facility from adapter.
765772 */
766- static int fetch_mkvp (u16 cardnr , u16 domain , u64 * mkvp )
773+ static int fetch_mkvp (u16 cardnr , u16 domain , u64 mkvp [ 2 ] )
767774{
768775 int rc , found = 0 ;
769776 size_t rlen , vlen ;
@@ -779,9 +786,10 @@ static int fetch_mkvp(u16 cardnr, u16 domain, u64 *mkvp)
779786 rc = query_crypto_facility (cardnr , domain , "STATICSA" ,
780787 rarray , & rlen , varray , & vlen );
781788 if (rc == 0 && rlen > 8 * 8 && vlen > 184 + 8 ) {
782- if (rarray [64 ] == '2' ) {
789+ if (rarray [8 * 8 ] == '2' ) {
783790 /* current master key state is valid */
784- * mkvp = * ((u64 * )(varray + 184 ));
791+ mkvp [0 ] = * ((u64 * )(varray + 184 ));
792+ mkvp [1 ] = * ((u64 * )(varray + 172 ));
785793 found = 1 ;
786794 }
787795 }
@@ -796,14 +804,14 @@ struct mkvp_info {
796804 struct list_head list ;
797805 u16 cardnr ;
798806 u16 domain ;
799- u64 mkvp ;
807+ u64 mkvp [ 2 ] ;
800808};
801809
802810/* a list with mkvp_info entries */
803811static LIST_HEAD (mkvp_list );
804812static DEFINE_SPINLOCK (mkvp_list_lock );
805813
806- static int mkvp_cache_fetch (u16 cardnr , u16 domain , u64 * mkvp )
814+ static int mkvp_cache_fetch (u16 cardnr , u16 domain , u64 mkvp [ 2 ] )
807815{
808816 int rc = - ENOENT ;
809817 struct mkvp_info * ptr ;
@@ -812,7 +820,7 @@ static int mkvp_cache_fetch(u16 cardnr, u16 domain, u64 *mkvp)
812820 list_for_each_entry (ptr , & mkvp_list , list ) {
813821 if (ptr -> cardnr == cardnr &&
814822 ptr -> domain == domain ) {
815- * mkvp = ptr -> mkvp ;
823+ memcpy ( mkvp , ptr -> mkvp , 2 * sizeof ( u64 )) ;
816824 rc = 0 ;
817825 break ;
818826 }
@@ -822,7 +830,7 @@ static int mkvp_cache_fetch(u16 cardnr, u16 domain, u64 *mkvp)
822830 return rc ;
823831}
824832
825- static void mkvp_cache_update (u16 cardnr , u16 domain , u64 mkvp )
833+ static void mkvp_cache_update (u16 cardnr , u16 domain , u64 mkvp [ 2 ] )
826834{
827835 int found = 0 ;
828836 struct mkvp_info * ptr ;
@@ -831,7 +839,7 @@ static void mkvp_cache_update(u16 cardnr, u16 domain, u64 mkvp)
831839 list_for_each_entry (ptr , & mkvp_list , list ) {
832840 if (ptr -> cardnr == cardnr &&
833841 ptr -> domain == domain ) {
834- ptr -> mkvp = mkvp ;
842+ memcpy ( ptr -> mkvp , mkvp , 2 * sizeof ( u64 )) ;
835843 found = 1 ;
836844 break ;
837845 }
@@ -844,7 +852,7 @@ static void mkvp_cache_update(u16 cardnr, u16 domain, u64 mkvp)
844852 }
845853 ptr -> cardnr = cardnr ;
846854 ptr -> domain = domain ;
847- ptr -> mkvp = mkvp ;
855+ memcpy ( ptr -> mkvp , mkvp , 2 * sizeof ( u64 )) ;
848856 list_add (& ptr -> list , & mkvp_list );
849857 }
850858 spin_unlock_bh (& mkvp_list_lock );
@@ -888,8 +896,8 @@ int pkey_findcard(const struct pkey_seckey *seckey,
888896 struct secaeskeytoken * t = (struct secaeskeytoken * ) seckey ;
889897 struct zcrypt_device_matrix * device_matrix ;
890898 u16 card , dom ;
891- u64 mkvp ;
892- int i , rc ;
899+ u64 mkvp [ 2 ] ;
900+ int i , rc , oi = -1 ;
893901
894902 /* mkvp must not be zero */
895903 if (t -> mkvp == 0 )
@@ -910,14 +918,14 @@ int pkey_findcard(const struct pkey_seckey *seckey,
910918 device_matrix -> device [i ].functions & 0x04 ) {
911919 /* an enabled CCA Coprocessor card */
912920 /* try cached mkvp */
913- if (mkvp_cache_fetch (card , dom , & mkvp ) == 0 &&
914- t -> mkvp == mkvp ) {
921+ if (mkvp_cache_fetch (card , dom , mkvp ) == 0 &&
922+ t -> mkvp == mkvp [ 0 ] ) {
915923 if (!verify )
916924 break ;
917925 /* verify: fetch mkvp from adapter */
918- if (fetch_mkvp (card , dom , & mkvp ) == 0 ) {
926+ if (fetch_mkvp (card , dom , mkvp ) == 0 ) {
919927 mkvp_cache_update (card , dom , mkvp );
920- if (t -> mkvp == mkvp )
928+ if (t -> mkvp == mkvp [ 0 ] )
921929 break ;
922930 }
923931 }
@@ -936,14 +944,21 @@ int pkey_findcard(const struct pkey_seckey *seckey,
936944 card = AP_QID_CARD (device_matrix -> device [i ].qid );
937945 dom = AP_QID_QUEUE (device_matrix -> device [i ].qid );
938946 /* fresh fetch mkvp from adapter */
939- if (fetch_mkvp (card , dom , & mkvp ) == 0 ) {
947+ if (fetch_mkvp (card , dom , mkvp ) == 0 ) {
940948 mkvp_cache_update (card , dom , mkvp );
941- if (t -> mkvp == mkvp )
949+ if (t -> mkvp == mkvp [ 0 ] )
942950 break ;
951+ if (t -> mkvp == mkvp [1 ] && oi < 0 )
952+ oi = i ;
943953 }
944954 }
955+ if (i >= MAX_ZDEV_ENTRIES && oi >= 0 ) {
956+ /* old mkvp matched, use this card then */
957+ card = AP_QID_CARD (device_matrix -> device [oi ].qid );
958+ dom = AP_QID_QUEUE (device_matrix -> device [oi ].qid );
959+ }
945960 }
946- if (i < MAX_ZDEV_ENTRIES ) {
961+ if (i < MAX_ZDEV_ENTRIES || oi >= 0 ) {
947962 if (pcardnr )
948963 * pcardnr = card ;
949964 if (pdomain )
0 commit comments