LCOV - code coverage report
Current view: top level - drivers/common/dpaax/caamflib/rta - protocol_cmd.h (source / functions) Hit Total Coverage
Test: Code coverage Lines: 0 113 0.0 %
Date: 2024-01-22 16:26:08 Functions: 0 18 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 80 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
       2                 :            :  *
       3                 :            :  * Copyright 2008-2016 Freescale Semiconductor Inc.
       4                 :            :  * Copyright 2016,2019,2023 NXP
       5                 :            :  *
       6                 :            :  */
       7                 :            : 
       8                 :            : #ifndef __RTA_PROTOCOL_CMD_H__
       9                 :            : #define __RTA_PROTOCOL_CMD_H__
      10                 :            : 
      11                 :            : extern enum rta_sec_era rta_sec_era;
      12                 :            : 
      13                 :            : static inline int
      14                 :          0 : __rta_ssl_proto(uint16_t protoinfo)
      15                 :            : {
      16         [ #  # ]:          0 :         switch (protoinfo) {
      17                 :            :         case OP_PCL_TLS_RSA_EXPORT_WITH_RC4_40_MD5:
      18                 :            :         case OP_PCL_TLS_RSA_WITH_RC4_128_MD5:
      19                 :            :         case OP_PCL_TLS_RSA_WITH_RC4_128_SHA:
      20                 :            :         case OP_PCL_TLS_DH_anon_EXPORT_WITH_RC4_40_MD5:
      21                 :            :         case OP_PCL_TLS_DH_anon_WITH_RC4_128_MD5:
      22                 :            :         case OP_PCL_TLS_KRB5_WITH_RC4_128_SHA:
      23                 :            :         case OP_PCL_TLS_KRB5_WITH_RC4_128_MD5:
      24                 :            :         case OP_PCL_TLS_KRB5_EXPORT_WITH_RC4_40_SHA:
      25                 :            :         case OP_PCL_TLS_KRB5_EXPORT_WITH_RC4_40_MD5:
      26                 :            :         case OP_PCL_TLS_PSK_WITH_RC4_128_SHA:
      27                 :            :         case OP_PCL_TLS_DHE_PSK_WITH_RC4_128_SHA:
      28                 :            :         case OP_PCL_TLS_RSA_PSK_WITH_RC4_128_SHA:
      29                 :            :         case OP_PCL_TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
      30                 :            :         case OP_PCL_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
      31                 :            :         case OP_PCL_TLS_ECDH_RSA_WITH_RC4_128_SHA:
      32                 :            :         case OP_PCL_TLS_ECDHE_RSA_WITH_RC4_128_SHA:
      33                 :            :         case OP_PCL_TLS_ECDH_anon_WITH_RC4_128_SHA:
      34                 :            :         case OP_PCL_TLS_ECDHE_PSK_WITH_RC4_128_SHA:
      35                 :            :         case OP_PCL_TLS_RSA_EXPORT_WITH_DES40_CBC_SHA:
      36                 :            :         case OP_PCL_TLS_RSA_WITH_DES_CBC_SHA:
      37                 :            :         case OP_PCL_TLS_RSA_WITH_3DES_EDE_CBC_SHA:
      38                 :            :         case OP_PCL_TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA:
      39                 :            :         case OP_PCL_TLS_DH_DSS_WITH_DES_CBC_SHA:
      40                 :            :         case OP_PCL_TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA:
      41                 :            :         case OP_PCL_TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA:
      42                 :            :         case OP_PCL_TLS_DH_RSA_WITH_DES_CBC_SHA:
      43                 :            :         case OP_PCL_TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA:
      44                 :            :         case OP_PCL_TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA:
      45                 :            :         case OP_PCL_TLS_DHE_DSS_WITH_DES_CBC_SHA:
      46                 :            :         case OP_PCL_TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA:
      47                 :            :         case OP_PCL_TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA:
      48                 :            :         case OP_PCL_TLS_DHE_RSA_WITH_DES_CBC_SHA:
      49                 :            :         case OP_PCL_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
      50                 :            :         case OP_PCL_TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA:
      51                 :            :         case OP_PCL_TLS_DH_anon_WITH_DES_CBC_SHA:
      52                 :            :         case OP_PCL_TLS_DH_anon_WITH_3DES_EDE_CBC_SHA:
      53                 :            :         case OP_PCL_TLS_KRB5_WITH_DES_CBC_SHA:
      54                 :            :         case OP_PCL_TLS_KRB5_WITH_3DES_EDE_CBC_SHA:
      55                 :            :         case OP_PCL_TLS_KRB5_WITH_DES_CBC_MD5:
      56                 :            :         case OP_PCL_TLS_KRB5_WITH_3DES_EDE_CBC_MD5:
      57                 :            :         case OP_PCL_TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA:
      58                 :            :         case OP_PCL_TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5:
      59                 :            :         case OP_PCL_TLS_RSA_WITH_AES_128_CBC_SHA:
      60                 :            :         case OP_PCL_TLS_DH_DSS_WITH_AES_128_CBC_SHA:
      61                 :            :         case OP_PCL_TLS_DH_RSA_WITH_AES_128_CBC_SHA:
      62                 :            :         case OP_PCL_TLS_DHE_DSS_WITH_AES_128_CBC_SHA:
      63                 :            :         case OP_PCL_TLS_DHE_RSA_WITH_AES_128_CBC_SHA:
      64                 :            :         case OP_PCL_TLS_DH_anon_WITH_AES_128_CBC_SHA:
      65                 :            :         case OP_PCL_TLS_RSA_WITH_AES_256_CBC_SHA:
      66                 :            :         case OP_PCL_TLS_DH_DSS_WITH_AES_256_CBC_SHA:
      67                 :            :         case OP_PCL_TLS_DH_RSA_WITH_AES_256_CBC_SHA:
      68                 :            :         case OP_PCL_TLS_DHE_DSS_WITH_AES_256_CBC_SHA:
      69                 :            :         case OP_PCL_TLS_DHE_RSA_WITH_AES_256_CBC_SHA:
      70                 :            :         case OP_PCL_TLS_DH_anon_WITH_AES_256_CBC_SHA:
      71                 :            :         case OP_PCL_TLS_DH_DSS_WITH_AES_128_CBC_SHA256:
      72                 :            :         case OP_PCL_TLS_DH_RSA_WITH_AES_128_CBC_SHA256:
      73                 :            :         case OP_PCL_TLS_DHE_DSS_WITH_AES_128_CBC_SHA256:
      74                 :            :         case OP_PCL_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:
      75                 :            :         case OP_PCL_TLS_DH_DSS_WITH_AES_256_CBC_SHA256:
      76                 :            :         case OP_PCL_TLS_DH_RSA_WITH_AES_256_CBC_SHA256:
      77                 :            :         case OP_PCL_TLS_DHE_DSS_WITH_AES_256_CBC_SHA256:
      78                 :            :         case OP_PCL_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:
      79                 :            :         case OP_PCL_TLS_DH_anon_WITH_AES_128_CBC_SHA256:
      80                 :            :         case OP_PCL_TLS_DH_anon_WITH_AES_256_CBC_SHA256:
      81                 :            :         case OP_PCL_TLS_PSK_WITH_3DES_EDE_CBC_SHA:
      82                 :            :         case OP_PCL_TLS_PSK_WITH_AES_128_CBC_SHA:
      83                 :            :         case OP_PCL_TLS_PSK_WITH_AES_256_CBC_SHA:
      84                 :            :         case OP_PCL_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA:
      85                 :            :         case OP_PCL_TLS_DHE_PSK_WITH_AES_128_CBC_SHA:
      86                 :            :         case OP_PCL_TLS_DHE_PSK_WITH_AES_256_CBC_SHA:
      87                 :            :         case OP_PCL_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA:
      88                 :            :         case OP_PCL_TLS_RSA_PSK_WITH_AES_128_CBC_SHA:
      89                 :            :         case OP_PCL_TLS_RSA_PSK_WITH_AES_256_CBC_SHA:
      90                 :            :         case OP_PCL_TLS_RSA_WITH_AES_128_GCM_SHA256:
      91                 :            :         case OP_PCL_TLS_RSA_WITH_AES_256_GCM_SHA384:
      92                 :            :         case OP_PCL_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:
      93                 :            :         case OP_PCL_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384:
      94                 :            :         case OP_PCL_TLS_DH_RSA_WITH_AES_128_GCM_SHA256:
      95                 :            :         case OP_PCL_TLS_DH_RSA_WITH_AES_256_GCM_SHA384:
      96                 :            :         case OP_PCL_TLS_DHE_DSS_WITH_AES_128_GCM_SHA256:
      97                 :            :         case OP_PCL_TLS_DHE_DSS_WITH_AES_256_GCM_SHA384:
      98                 :            :         case OP_PCL_TLS_DH_DSS_WITH_AES_128_GCM_SHA256:
      99                 :            :         case OP_PCL_TLS_DH_DSS_WITH_AES_256_GCM_SHA384:
     100                 :            :         case OP_PCL_TLS_DH_anon_WITH_AES_128_GCM_SHA256:
     101                 :            :         case OP_PCL_TLS_DH_anon_WITH_AES_256_GCM_SHA384:
     102                 :            :         case OP_PCL_TLS_PSK_WITH_AES_128_GCM_SHA256:
     103                 :            :         case OP_PCL_TLS_PSK_WITH_AES_256_GCM_SHA384:
     104                 :            :         case OP_PCL_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256:
     105                 :            :         case OP_PCL_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384:
     106                 :            :         case OP_PCL_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256:
     107                 :            :         case OP_PCL_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384:
     108                 :            :         case OP_PCL_TLS_PSK_WITH_AES_128_CBC_SHA256:
     109                 :            :         case OP_PCL_TLS_PSK_WITH_AES_256_CBC_SHA384:
     110                 :            :         case OP_PCL_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256:
     111                 :            :         case OP_PCL_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384:
     112                 :            :         case OP_PCL_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256:
     113                 :            :         case OP_PCL_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384:
     114                 :            :         case OP_PCL_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
     115                 :            :         case OP_PCL_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
     116                 :            :         case OP_PCL_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
     117                 :            :         case OP_PCL_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
     118                 :            :         case OP_PCL_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
     119                 :            :         case OP_PCL_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
     120                 :            :         case OP_PCL_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
     121                 :            :         case OP_PCL_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
     122                 :            :         case OP_PCL_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
     123                 :            :         case OP_PCL_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
     124                 :            :         case OP_PCL_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
     125                 :            :         case OP_PCL_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
     126                 :            :         case OP_PCL_TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA:
     127                 :            :         case OP_PCL_TLS_ECDH_anon_WITH_AES_128_CBC_SHA:
     128                 :            :         case OP_PCL_TLS_ECDH_anon_WITH_AES_256_CBC_SHA:
     129                 :            :         case OP_PCL_TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA:
     130                 :            :         case OP_PCL_TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA:
     131                 :            :         case OP_PCL_TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA:
     132                 :            :         case OP_PCL_TLS_SRP_SHA_WITH_AES_128_CBC_SHA:
     133                 :            :         case OP_PCL_TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA:
     134                 :            :         case OP_PCL_TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA:
     135                 :            :         case OP_PCL_TLS_SRP_SHA_WITH_AES_256_CBC_SHA:
     136                 :            :         case OP_PCL_TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA:
     137                 :            :         case OP_PCL_TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA:
     138                 :            :         case OP_PCL_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
     139                 :            :         case OP_PCL_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
     140                 :            :         case OP_PCL_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
     141                 :            :         case OP_PCL_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
     142                 :            :         case OP_PCL_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
     143                 :            :         case OP_PCL_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
     144                 :            :         case OP_PCL_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
     145                 :            :         case OP_PCL_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
     146                 :            :         case OP_PCL_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
     147                 :            :         case OP_PCL_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
     148                 :            :         case OP_PCL_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
     149                 :            :         case OP_PCL_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
     150                 :            :         case OP_PCL_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
     151                 :            :         case OP_PCL_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
     152                 :            :         case OP_PCL_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
     153                 :            :         case OP_PCL_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
     154                 :            :         case OP_PCL_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA:
     155                 :            :         case OP_PCL_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA:
     156                 :            :         case OP_PCL_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA:
     157                 :            :         case OP_PCL_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256:
     158                 :            :         case OP_PCL_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384:
     159                 :            :         case OP_PCL_TLS_RSA_WITH_AES_128_CBC_SHA256:
     160                 :            :         case OP_PCL_TLS_RSA_WITH_AES_256_CBC_SHA256:
     161                 :            :         case OP_PCL_PVT_TLS_3DES_EDE_CBC_MD5:
     162                 :            :         case OP_PCL_PVT_TLS_3DES_EDE_CBC_SHA160:
     163                 :            :         case OP_PCL_PVT_TLS_3DES_EDE_CBC_SHA224:
     164                 :            :         case OP_PCL_PVT_TLS_3DES_EDE_CBC_SHA256:
     165                 :            :         case OP_PCL_PVT_TLS_3DES_EDE_CBC_SHA384:
     166                 :            :         case OP_PCL_PVT_TLS_3DES_EDE_CBC_SHA512:
     167                 :            :         case OP_PCL_PVT_TLS_AES_128_CBC_SHA160:
     168                 :            :         case OP_PCL_PVT_TLS_AES_128_CBC_SHA224:
     169                 :            :         case OP_PCL_PVT_TLS_AES_128_CBC_SHA256:
     170                 :            :         case OP_PCL_PVT_TLS_AES_128_CBC_SHA384:
     171                 :            :         case OP_PCL_PVT_TLS_AES_128_CBC_SHA512:
     172                 :            :         case OP_PCL_PVT_TLS_AES_192_CBC_SHA160:
     173                 :            :         case OP_PCL_PVT_TLS_AES_192_CBC_SHA224:
     174                 :            :         case OP_PCL_PVT_TLS_AES_192_CBC_SHA256:
     175                 :            :         case OP_PCL_PVT_TLS_AES_192_CBC_SHA512:
     176                 :            :         case OP_PCL_PVT_TLS_AES_256_CBC_SHA160:
     177                 :            :         case OP_PCL_PVT_TLS_AES_256_CBC_SHA224:
     178                 :            :         case OP_PCL_PVT_TLS_AES_256_CBC_SHA384:
     179                 :            :         case OP_PCL_PVT_TLS_AES_256_CBC_SHA512:
     180                 :            :         case OP_PCL_PVT_TLS_AES_256_CBC_SHA256:
     181                 :            :         case OP_PCL_PVT_TLS_AES_192_CBC_SHA384:
     182                 :            :         case OP_PCL_PVT_TLS_MASTER_SECRET_PRF_FE:
     183                 :            :         case OP_PCL_PVT_TLS_MASTER_SECRET_PRF_FF:
     184                 :            :                 return 0;
     185                 :            :         }
     186                 :            : 
     187                 :          0 :         return -EINVAL;
     188                 :            : }
     189                 :            : 
     190                 :            : static inline int
     191                 :          0 : __rta_ike_proto(uint16_t protoinfo)
     192                 :            : {
     193         [ #  # ]:          0 :         switch (protoinfo) {
     194                 :            :         case OP_PCL_IKE_HMAC_MD5:
     195                 :            :         case OP_PCL_IKE_HMAC_SHA1:
     196                 :            :         case OP_PCL_IKE_HMAC_AES128_CBC:
     197                 :            :         case OP_PCL_IKE_HMAC_SHA256:
     198                 :            :         case OP_PCL_IKE_HMAC_SHA384:
     199                 :            :         case OP_PCL_IKE_HMAC_SHA512:
     200                 :            :         case OP_PCL_IKE_HMAC_AES128_CMAC:
     201                 :            :                 return 0;
     202                 :            :         }
     203                 :            : 
     204                 :          0 :         return -EINVAL;
     205                 :            : }
     206                 :            : 
     207                 :            : static inline int
     208                 :          0 : __rta_ipsec_proto(uint16_t protoinfo)
     209                 :            : {
     210                 :          0 :         uint16_t proto_cls1 = protoinfo & OP_PCL_IPSEC_CIPHER_MASK;
     211                 :          0 :         uint16_t proto_cls2 = protoinfo & OP_PCL_IPSEC_AUTH_MASK;
     212                 :            : 
     213      [ #  #  # ]:          0 :         switch (proto_cls1) {
     214                 :          0 :         case OP_PCL_IPSEC_AES_NULL_WITH_GMAC:
     215                 :            :         case OP_PCL_IPSEC_AES_CCM8:
     216                 :            :         case OP_PCL_IPSEC_AES_CCM12:
     217                 :            :         case OP_PCL_IPSEC_AES_CCM16:
     218                 :            :         case OP_PCL_IPSEC_AES_GCM8:
     219                 :            :         case OP_PCL_IPSEC_AES_GCM12:
     220                 :            :         case OP_PCL_IPSEC_AES_GCM16:
     221                 :            :                 /* CCM, GCM, GMAC require PROTINFO[7:0] = 0 */
     222         [ #  # ]:          0 :                 if (proto_cls2 == OP_PCL_IPSEC_HMAC_NULL)
     223                 :          0 :                         return 0;
     224                 :            :                 return -EINVAL;
     225                 :            :         case OP_PCL_IPSEC_NULL:
     226                 :            :         case OP_PCL_IPSEC_DES_IV64:
     227                 :            :         case OP_PCL_IPSEC_DES:
     228                 :            :         case OP_PCL_IPSEC_3DES:
     229                 :            :         case OP_PCL_IPSEC_AES_CBC:
     230                 :            :         case OP_PCL_IPSEC_AES_CTR:
     231                 :            :                 break;
     232                 :            :         default:
     233                 :            :                 return -EINVAL;
     234                 :            :         }
     235                 :            : 
     236         [ #  # ]:          0 :         switch (proto_cls2) {
     237                 :            :         case OP_PCL_IPSEC_HMAC_NULL:
     238                 :            :         case OP_PCL_IPSEC_HMAC_MD5_96:
     239                 :            :         case OP_PCL_IPSEC_HMAC_SHA1_96:
     240                 :            :         case OP_PCL_IPSEC_AES_XCBC_MAC_96:
     241                 :            :         case OP_PCL_IPSEC_HMAC_MD5_128:
     242                 :            :         case OP_PCL_IPSEC_HMAC_SHA1_160:
     243                 :            :         case OP_PCL_IPSEC_AES_CMAC_96:
     244                 :            :         case OP_PCL_IPSEC_HMAC_SHA2_224_96:
     245                 :            :         case OP_PCL_IPSEC_HMAC_SHA2_224_112:
     246                 :            :         case OP_PCL_IPSEC_HMAC_SHA2_224_224:
     247                 :            :         case OP_PCL_IPSEC_HMAC_SHA2_256_128:
     248                 :            :         case OP_PCL_IPSEC_HMAC_SHA2_384_192:
     249                 :            :         case OP_PCL_IPSEC_HMAC_SHA2_512_256:
     250                 :            :                 return 0;
     251                 :            :         }
     252                 :            : 
     253                 :          0 :         return -EINVAL;
     254                 :            : }
     255                 :            : 
     256                 :            : static inline int
     257                 :          0 : __rta_srtp_proto(uint16_t protoinfo)
     258                 :            : {
     259                 :          0 :         uint16_t proto_cls1 = protoinfo & OP_PCL_SRTP_CIPHER_MASK;
     260                 :          0 :         uint16_t proto_cls2 = protoinfo & OP_PCL_SRTP_AUTH_MASK;
     261                 :            : 
     262         [ #  # ]:          0 :         switch (proto_cls1) {
     263         [ #  # ]:          0 :         case OP_PCL_SRTP_AES_CTR:
     264                 :            :                 switch (proto_cls2) {
     265                 :            :                 case OP_PCL_SRTP_HMAC_SHA1_160:
     266                 :            :                         return 0;
     267                 :            :                 }
     268                 :            :                 /* no break */
     269                 :            :         }
     270                 :            : 
     271                 :          0 :         return -EINVAL;
     272                 :            : }
     273                 :            : 
     274                 :            : static inline int
     275                 :          0 : __rta_macsec_proto(uint16_t protoinfo)
     276                 :            : {
     277         [ #  # ]:          0 :         switch (protoinfo) {
     278                 :            :         case OP_PCL_MACSEC:
     279                 :            :                 return 0;
     280                 :            :         }
     281                 :            : 
     282                 :          0 :         return -EINVAL;
     283                 :            : }
     284                 :            : 
     285                 :            : static inline int
     286                 :          0 : __rta_wifi_proto(uint16_t protoinfo)
     287                 :            : {
     288         [ #  # ]:          0 :         switch (protoinfo) {
     289                 :            :         case OP_PCL_WIFI:
     290                 :            :                 return 0;
     291                 :            :         }
     292                 :            : 
     293                 :          0 :         return -EINVAL;
     294                 :            : }
     295                 :            : 
     296                 :            : static inline int
     297                 :          0 : __rta_wimax_proto(uint16_t protoinfo)
     298                 :            : {
     299         [ #  # ]:          0 :         switch (protoinfo) {
     300                 :            :         case OP_PCL_WIMAX_OFDM:
     301                 :            :         case OP_PCL_WIMAX_OFDMA:
     302                 :            :                 return 0;
     303                 :            :         }
     304                 :            : 
     305                 :          0 :         return -EINVAL;
     306                 :            : }
     307                 :            : 
     308                 :            : /* Allowed blob proto flags for each SEC Era */
     309                 :            : static const uint32_t proto_blob_flags[] = {
     310                 :            :         OP_PCL_BLOB_FORMAT_MASK | OP_PCL_BLOB_BLACK,
     311                 :            :         OP_PCL_BLOB_FORMAT_MASK | OP_PCL_BLOB_BLACK | OP_PCL_BLOB_TKEK |
     312                 :            :                 OP_PCL_BLOB_EKT | OP_PCL_BLOB_REG_MASK,
     313                 :            :         OP_PCL_BLOB_FORMAT_MASK | OP_PCL_BLOB_BLACK | OP_PCL_BLOB_TKEK |
     314                 :            :                 OP_PCL_BLOB_EKT | OP_PCL_BLOB_REG_MASK,
     315                 :            :         OP_PCL_BLOB_FORMAT_MASK | OP_PCL_BLOB_BLACK | OP_PCL_BLOB_TKEK |
     316                 :            :                 OP_PCL_BLOB_EKT | OP_PCL_BLOB_REG_MASK | OP_PCL_BLOB_SEC_MEM,
     317                 :            :         OP_PCL_BLOB_FORMAT_MASK | OP_PCL_BLOB_BLACK | OP_PCL_BLOB_TKEK |
     318                 :            :                 OP_PCL_BLOB_EKT | OP_PCL_BLOB_REG_MASK | OP_PCL_BLOB_SEC_MEM,
     319                 :            :         OP_PCL_BLOB_FORMAT_MASK | OP_PCL_BLOB_BLACK | OP_PCL_BLOB_TKEK |
     320                 :            :                 OP_PCL_BLOB_EKT | OP_PCL_BLOB_REG_MASK | OP_PCL_BLOB_SEC_MEM,
     321                 :            :         OP_PCL_BLOB_FORMAT_MASK | OP_PCL_BLOB_BLACK | OP_PCL_BLOB_TKEK |
     322                 :            :                 OP_PCL_BLOB_EKT | OP_PCL_BLOB_REG_MASK | OP_PCL_BLOB_SEC_MEM,
     323                 :            :         OP_PCL_BLOB_FORMAT_MASK | OP_PCL_BLOB_BLACK | OP_PCL_BLOB_TKEK |
     324                 :            :                 OP_PCL_BLOB_EKT | OP_PCL_BLOB_REG_MASK | OP_PCL_BLOB_SEC_MEM,
     325                 :            :         OP_PCL_BLOB_FORMAT_MASK | OP_PCL_BLOB_BLACK | OP_PCL_BLOB_TKEK |
     326                 :            :                 OP_PCL_BLOB_EKT | OP_PCL_BLOB_REG_MASK | OP_PCL_BLOB_SEC_MEM,
     327                 :            :         OP_PCL_BLOB_FORMAT_MASK | OP_PCL_BLOB_BLACK | OP_PCL_BLOB_TKEK |
     328                 :            :                 OP_PCL_BLOB_EKT | OP_PCL_BLOB_REG_MASK | OP_PCL_BLOB_SEC_MEM
     329                 :            : };
     330                 :            : 
     331                 :            : static inline int
     332                 :          0 : __rta_blob_proto(uint16_t protoinfo)
     333                 :            : {
     334         [ #  # ]:          0 :         if (protoinfo & ~proto_blob_flags[rta_sec_era])
     335                 :            :                 return -EINVAL;
     336                 :            : 
     337         [ #  # ]:          0 :         switch (protoinfo & OP_PCL_BLOB_FORMAT_MASK) {
     338                 :            :         case OP_PCL_BLOB_FORMAT_NORMAL:
     339                 :            :         case OP_PCL_BLOB_FORMAT_MASTER_VER:
     340                 :            :         case OP_PCL_BLOB_FORMAT_TEST:
     341                 :            :                 break;
     342                 :            :         default:
     343                 :            :                 return -EINVAL;
     344                 :            :         }
     345                 :            : 
     346         [ #  # ]:          0 :         switch (protoinfo & OP_PCL_BLOB_REG_MASK) {
     347                 :            :         case OP_PCL_BLOB_AFHA_SBOX:
     348                 :            :         case OP_PCL_BLOB_REG_MEMORY:
     349                 :            :         case OP_PCL_BLOB_REG_KEY1:
     350                 :            :         case OP_PCL_BLOB_REG_KEY2:
     351                 :            :         case OP_PCL_BLOB_REG_SPLIT:
     352                 :            :         case OP_PCL_BLOB_REG_PKE:
     353                 :            :                 return 0;
     354                 :            :         }
     355                 :            : 
     356                 :          0 :         return -EINVAL;
     357                 :            : }
     358                 :            : 
     359                 :            : static inline int
     360                 :          0 : __rta_dlc_proto(uint16_t protoinfo)
     361                 :            : {
     362         [ #  # ]:          0 :         switch (protoinfo & OP_PCL_PKPROT_HASH_MASK) {
     363                 :            :         case OP_PCL_PKPROT_HASH_MD5:
     364                 :            :         case OP_PCL_PKPROT_HASH_SHA1:
     365                 :            :         case OP_PCL_PKPROT_HASH_SHA224:
     366                 :            :         case OP_PCL_PKPROT_HASH_SHA256:
     367                 :            :         case OP_PCL_PKPROT_HASH_SHA384:
     368                 :            :         case OP_PCL_PKPROT_HASH_SHA512:
     369                 :            :                 break;
     370                 :            :         default:
     371                 :            :                 return -EINVAL;
     372                 :            :         }
     373                 :            : 
     374                 :          0 :         return 0;
     375                 :            : }
     376                 :            : 
     377                 :            : static inline int
     378                 :          0 : __rta_rsa_enc_proto(uint16_t protoinfo)
     379                 :            : {
     380      [ #  #  # ]:          0 :         switch (protoinfo & OP_PCL_RSAPROT_OP_MASK) {
     381                 :          0 :         case OP_PCL_RSAPROT_OP_ENC_F_IN:
     382         [ #  # ]:          0 :                 if ((protoinfo & OP_PCL_RSAPROT_FFF_MASK) !=
     383                 :            :                     OP_PCL_RSAPROT_FFF_RED)
     384                 :            :                         return -EINVAL;
     385                 :            :                 break;
     386         [ #  # ]:          0 :         case OP_PCL_RSAPROT_OP_ENC_F_OUT:
     387                 :            :                 switch (protoinfo & OP_PCL_RSAPROT_FFF_MASK) {
     388                 :            :                 case OP_PCL_RSAPROT_FFF_RED:
     389                 :            :                 case OP_PCL_RSAPROT_FFF_ENC:
     390                 :            :                 case OP_PCL_RSAPROT_FFF_EKT:
     391                 :            :                 case OP_PCL_RSAPROT_FFF_TK_ENC:
     392                 :            :                 case OP_PCL_RSAPROT_FFF_TK_EKT:
     393                 :            :                         break;
     394                 :            :                 default:
     395                 :            :                         return -EINVAL;
     396                 :            :                 }
     397                 :            :                 break;
     398                 :            :         default:
     399                 :            :                 return -EINVAL;
     400                 :            :         }
     401                 :            : 
     402                 :          0 :         return 0;
     403                 :            : }
     404                 :            : 
     405                 :            : static inline int
     406                 :          0 : __rta_rsa_dec_proto(uint16_t protoinfo)
     407                 :            : {
     408         [ #  # ]:          0 :         switch (protoinfo & OP_PCL_RSAPROT_OP_MASK) {
     409                 :            :         case OP_PCL_RSAPROT_OP_DEC_ND:
     410                 :            :         case OP_PCL_RSAPROT_OP_DEC_PQD:
     411                 :            :         case OP_PCL_RSAPROT_OP_DEC_PQDPDQC:
     412                 :            :                 break;
     413                 :            :         default:
     414                 :            :                 return -EINVAL;
     415                 :            :         }
     416                 :            : 
     417         [ #  # ]:          0 :         switch (protoinfo & OP_PCL_RSAPROT_PPP_MASK) {
     418                 :            :         case OP_PCL_RSAPROT_PPP_RED:
     419                 :            :         case OP_PCL_RSAPROT_PPP_ENC:
     420                 :            :         case OP_PCL_RSAPROT_PPP_EKT:
     421                 :            :         case OP_PCL_RSAPROT_PPP_TK_ENC:
     422                 :            :         case OP_PCL_RSAPROT_PPP_TK_EKT:
     423                 :            :                 break;
     424                 :            :         default:
     425                 :            :                 return -EINVAL;
     426                 :            :         }
     427                 :            : 
     428         [ #  # ]:          0 :         if (protoinfo & OP_PCL_RSAPROT_FMT_PKCSV15)
     429         [ #  # ]:          0 :                 switch (protoinfo & OP_PCL_RSAPROT_FFF_MASK) {
     430                 :            :                 case OP_PCL_RSAPROT_FFF_RED:
     431                 :            :                 case OP_PCL_RSAPROT_FFF_ENC:
     432                 :            :                 case OP_PCL_RSAPROT_FFF_EKT:
     433                 :            :                 case OP_PCL_RSAPROT_FFF_TK_ENC:
     434                 :            :                 case OP_PCL_RSAPROT_FFF_TK_EKT:
     435                 :            :                         break;
     436                 :          0 :                 default:
     437                 :          0 :                         return -EINVAL;
     438                 :            :                 }
     439                 :            : 
     440                 :            :         return 0;
     441                 :            : }
     442                 :            : 
     443                 :            : /*
     444                 :            :  * DKP Protocol - Restrictions on key (SRC,DST) combinations
     445                 :            :  * For e.g. key_in_out[0][0] = 1 means (SRC=IMM,DST=IMM) combination is allowed
     446                 :            :  */
     447                 :            : static const uint8_t key_in_out[4][4] = { {1, 0, 0, 0},
     448                 :            :                                           {1, 1, 1, 1},
     449                 :            :                                           {1, 0, 1, 0},
     450                 :            :                                           {1, 0, 0, 1} };
     451                 :            : 
     452                 :            : static inline int
     453                 :          0 : __rta_dkp_proto(uint16_t protoinfo)
     454                 :            : {
     455                 :          0 :         int key_src = (protoinfo & OP_PCL_DKP_SRC_MASK) >> OP_PCL_DKP_SRC_SHIFT;
     456                 :          0 :         int key_dst = (protoinfo & OP_PCL_DKP_DST_MASK) >> OP_PCL_DKP_DST_SHIFT;
     457                 :            : 
     458         [ #  # ]:          0 :         if (!key_in_out[key_src][key_dst]) {
     459                 :          0 :                 pr_err("PROTO_DESC: Invalid DKP key (SRC,DST)\n");
     460                 :          0 :                 return -EINVAL;
     461                 :            :         }
     462                 :            : 
     463                 :            :         return 0;
     464                 :            : }
     465                 :            : 
     466                 :            : 
     467                 :            : static inline int
     468                 :          0 : __rta_3g_dcrc_proto(uint16_t protoinfo)
     469                 :            : {
     470         [ #  # ]:          0 :         switch (protoinfo) {
     471                 :            :         case OP_PCL_3G_DCRC_CRC7:
     472                 :            :         case OP_PCL_3G_DCRC_CRC11:
     473                 :            :                 return 0;
     474                 :            :         }
     475                 :            : 
     476                 :          0 :         return -EINVAL;
     477                 :            : }
     478                 :            : 
     479                 :            : static inline int
     480                 :          0 : __rta_3g_rlc_proto(uint16_t protoinfo)
     481                 :            : {
     482         [ #  # ]:          0 :         switch (protoinfo) {
     483                 :            :         case OP_PCL_3G_RLC_NULL:
     484                 :            :         case OP_PCL_3G_RLC_KASUMI:
     485                 :            :         case OP_PCL_3G_RLC_SNOW:
     486                 :            :                 return 0;
     487                 :            :         }
     488                 :            : 
     489                 :          0 :         return -EINVAL;
     490                 :            : }
     491                 :            : 
     492                 :            : static inline int
     493                 :          0 : __rta_lte_pdcp_proto(uint16_t protoinfo)
     494                 :            : {
     495         [ #  # ]:          0 :         switch (protoinfo) {
     496                 :            :         case OP_PCL_LTE_ZUC:
     497                 :            :         case OP_PCL_LTE_NULL:
     498                 :            :         case OP_PCL_LTE_SNOW:
     499                 :            :         case OP_PCL_LTE_AES:
     500                 :            :                 return 0;
     501                 :            :         }
     502                 :            : 
     503                 :          0 :         return -EINVAL;
     504                 :            : }
     505                 :            : 
     506                 :            : static inline int
     507                 :          0 : __rta_lte_pdcp_mixed_proto(uint16_t protoinfo)
     508                 :            : {
     509                 :            :         switch (protoinfo & OP_PCL_LTE_MIXED_AUTH_MASK) {
     510                 :            :         case OP_PCL_LTE_MIXED_AUTH_NULL:
     511                 :            :         case OP_PCL_LTE_MIXED_AUTH_SNOW:
     512                 :            :         case OP_PCL_LTE_MIXED_AUTH_AES:
     513                 :            :         case OP_PCL_LTE_MIXED_AUTH_ZUC:
     514                 :            :                 break;
     515                 :            :         default:
     516                 :            :                 return -EINVAL;
     517                 :            :         }
     518                 :            : 
     519         [ #  # ]:          0 :         switch (protoinfo & OP_PCL_LTE_MIXED_ENC_MASK) {
     520                 :            :         case OP_PCL_LTE_MIXED_ENC_NULL:
     521                 :            :         case OP_PCL_LTE_MIXED_ENC_SNOW:
     522                 :            :         case OP_PCL_LTE_MIXED_ENC_AES:
     523                 :            :         case OP_PCL_LTE_MIXED_ENC_ZUC:
     524                 :            :                 return 0;
     525                 :            :         }
     526                 :            : 
     527                 :          0 :         return -EINVAL;
     528                 :            : }
     529                 :            : 
     530                 :            : struct proto_map {
     531                 :            :         uint32_t optype;
     532                 :            :         uint32_t protid;
     533                 :            :         int (*protoinfo_func)(uint16_t);
     534                 :            : };
     535                 :            : 
     536                 :            : static const struct proto_map proto_table[] = {
     537                 :            : /*1*/   {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_SSL30_PRF,     __rta_ssl_proto},
     538                 :            :         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_TLS10_PRF,     __rta_ssl_proto},
     539                 :            :         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_TLS11_PRF,     __rta_ssl_proto},
     540                 :            :         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_TLS12_PRF,     __rta_ssl_proto},
     541                 :            :         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_DTLS_PRF,      __rta_ssl_proto},
     542                 :            :         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_IKEV1_PRF,     __rta_ike_proto},
     543                 :            :         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_IKEV2_PRF,     __rta_ike_proto},
     544                 :            :         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_PUBLICKEYPAIR, __rta_dlc_proto},
     545                 :            :         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_DSASIGN,       __rta_dlc_proto},
     546                 :            :         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_DSAVERIFY,     __rta_dlc_proto},
     547                 :            :         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_IPSEC,         __rta_ipsec_proto},
     548                 :            :         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_SRTP,          __rta_srtp_proto},
     549                 :            :         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_SSL30,         __rta_ssl_proto},
     550                 :            :         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_TLS10,         __rta_ssl_proto},
     551                 :            :         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_TLS11,         __rta_ssl_proto},
     552                 :            :         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_TLS12,         __rta_ssl_proto},
     553                 :            :         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_DTLS,          __rta_ssl_proto},
     554                 :            :         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_MACSEC,        __rta_macsec_proto},
     555                 :            :         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_WIFI,          __rta_wifi_proto},
     556                 :            :         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_WIMAX,         __rta_wimax_proto},
     557                 :            : /*21*/  {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_BLOB,          __rta_blob_proto},
     558                 :            :         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_DIFFIEHELLMAN, __rta_dlc_proto},
     559                 :            :         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_RSAENCRYPT,    __rta_rsa_enc_proto},
     560                 :            :         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_RSADECRYPT,    __rta_rsa_dec_proto},
     561                 :            :         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_3G_DCRC,       __rta_3g_dcrc_proto},
     562                 :            :         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_3G_RLC_PDU,    __rta_3g_rlc_proto},
     563                 :            :         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_3G_RLC_SDU,    __rta_3g_rlc_proto},
     564                 :            :         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_LTE_PDCP_USER, __rta_lte_pdcp_proto},
     565                 :            : /*29*/  {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_LTE_PDCP_CTRL, __rta_lte_pdcp_proto},
     566                 :            :         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_DKP_MD5,       __rta_dkp_proto},
     567                 :            :         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_DKP_SHA1,      __rta_dkp_proto},
     568                 :            :         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_DKP_SHA224,    __rta_dkp_proto},
     569                 :            :         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_DKP_SHA256,    __rta_dkp_proto},
     570                 :            :         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_DKP_SHA384,    __rta_dkp_proto},
     571                 :            : /*35*/  {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_DKP_SHA512,    __rta_dkp_proto},
     572                 :            :         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_PUBLICKEYPAIR, __rta_dlc_proto},
     573                 :            : /*37*/  {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_DSASIGN,       __rta_dlc_proto},
     574                 :            : /*38*/  {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_LTE_PDCP_CTRL_MIXED,
     575                 :            :          __rta_lte_pdcp_mixed_proto},
     576                 :            :         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_IPSEC_NEW,     __rta_ipsec_proto},
     577                 :            : /*40*/  {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_LTE_PDCP_USER_RN,
     578                 :            :         __rta_lte_pdcp_mixed_proto},
     579                 :            : };
     580                 :            : 
     581                 :            : /*
     582                 :            :  * Allowed OPERATION protocols for each SEC Era.
     583                 :            :  * Values represent the number of entries from proto_table[] that are supported.
     584                 :            :  */
     585                 :            : static const unsigned int proto_table_sz[] = {21, 29, 29, 29, 29, 35, 37,
     586                 :            :                                                 40, 40, 40};
     587                 :            : 
     588                 :            : static inline int
     589                 :          0 : rta_proto_operation(struct program *program, uint32_t optype,
     590                 :            :                                       uint32_t protid, uint16_t protoinfo)
     591                 :            : {
     592                 :            :         uint32_t opcode = CMD_OPERATION;
     593                 :            :         unsigned int i, found = 0;
     594                 :            :         uint32_t optype_tmp = optype;
     595                 :          0 :         unsigned int start_pc = program->current_pc;
     596                 :            :         int ret = -EINVAL;
     597                 :            : 
     598         [ #  # ]:          0 :         for (i = 0; i < proto_table_sz[rta_sec_era]; i++) {
     599                 :            :                 /* clear last bit in optype to match also decap proto */
     600                 :          0 :                 optype_tmp &= (uint32_t)~(1 << OP_TYPE_SHIFT);
     601         [ #  # ]:          0 :                 if (optype_tmp == proto_table[i].optype) {
     602         [ #  # ]:          0 :                         if (proto_table[i].protid == protid) {
     603                 :            :                                 /* nothing else to verify */
     604         [ #  # ]:          0 :                                 if (proto_table[i].protoinfo_func == NULL) {
     605                 :            :                                         found = 1;
     606                 :            :                                         break;
     607                 :            :                                 }
     608                 :            :                                 /* check protoinfo */
     609                 :          0 :                                 ret = (*proto_table[i].protoinfo_func)
     610                 :            :                                                 (protoinfo);
     611         [ #  # ]:          0 :                                 if (ret < 0) {
     612                 :          0 :                                         pr_err("PROTO_DESC: Bad PROTO Type. SEC Program Line: %d\n",
     613                 :            :                                                program->current_pc);
     614                 :          0 :                                         goto err;
     615                 :            :                                 }
     616                 :            :                                 found = 1;
     617                 :            :                                 break;
     618                 :            :                         }
     619                 :            :                 }
     620                 :            :         }
     621                 :            :         if (!found) {
     622                 :          0 :                 pr_err("PROTO_DESC: Operation Type Mismatch. SEC Program Line: %d\n",
     623                 :            :                        program->current_pc);
     624                 :          0 :                 goto err;
     625                 :            :         }
     626                 :            : 
     627                 :          0 :         __rta_out32(program, opcode | optype | protid | protoinfo);
     628                 :          0 :         program->current_instruction++;
     629                 :          0 :         return (int)start_pc;
     630                 :            : 
     631                 :          0 :  err:
     632                 :          0 :         program->first_error_pc = start_pc;
     633                 :          0 :         program->current_instruction++;
     634                 :          0 :         return ret;
     635                 :            : }
     636                 :            : 
     637                 :            : static inline int
     638                 :          0 : rta_dkp_proto(struct program *program, uint32_t protid,
     639                 :            :                                 uint16_t key_src, uint16_t key_dst,
     640                 :            :                                 uint16_t keylen, uint64_t key,
     641                 :            :                                 enum rta_data_type key_type)
     642                 :            : {
     643                 :          0 :         unsigned int start_pc = program->current_pc;
     644                 :            :         unsigned int in_words = 0, out_words = 0;
     645                 :            :         int ret;
     646                 :            : 
     647                 :          0 :         key_src &= OP_PCL_DKP_SRC_MASK;
     648                 :          0 :         key_dst &= OP_PCL_DKP_DST_MASK;
     649                 :          0 :         keylen &= OP_PCL_DKP_KEY_MASK;
     650                 :            : 
     651                 :          0 :         ret = rta_proto_operation(program, OP_TYPE_UNI_PROTOCOL, protid,
     652                 :            :                                   key_src | key_dst | keylen);
     653         [ #  # ]:          0 :         if (ret < 0)
     654                 :            :                 return ret;
     655                 :            : 
     656                 :          0 :         if ((key_src == OP_PCL_DKP_SRC_PTR) ||
     657         [ #  # ]:          0 :             (key_src == OP_PCL_DKP_SRC_SGF)) {
     658                 :          0 :                 __rta_out64(program, program->ps, key);
     659         [ #  # ]:          0 :                 in_words = program->ps ? 2 : 1;
     660         [ #  # ]:          0 :         } else if (key_src == OP_PCL_DKP_SRC_IMM) {
     661         [ #  # ]:          0 :                 __rta_inline_data(program, key, inline_flags(key_type), keylen);
     662                 :          0 :                 in_words = (unsigned int)((keylen + 3) / 4);
     663                 :            :         }
     664                 :            : 
     665                 :          0 :         if ((key_dst == OP_PCL_DKP_DST_PTR) ||
     666         [ #  # ]:          0 :             (key_dst == OP_PCL_DKP_DST_SGF)) {
     667                 :            :                 out_words = in_words;
     668         [ #  # ]:          0 :         } else  if (key_dst == OP_PCL_DKP_DST_IMM) {
     669                 :          0 :                 out_words = split_key_len(protid) / 4;
     670                 :            :         }
     671                 :            : 
     672         [ #  # ]:          0 :         if (out_words < in_words) {
     673                 :          0 :                 pr_err("PROTO_DESC: DKP doesn't currently support a smaller descriptor\n");
     674                 :          0 :                 program->first_error_pc = start_pc;
     675                 :          0 :                 return -EINVAL;
     676                 :            :         }
     677                 :            : 
     678                 :            :         /* If needed, reserve space in resulting descriptor for derived key */
     679                 :          0 :         program->current_pc += (out_words - in_words);
     680                 :            : 
     681                 :          0 :         return (int)start_pc;
     682                 :            : }
     683                 :            : 
     684                 :            : #endif /* __RTA_PROTOCOL_CMD_H__ */

Generated by: LCOV version 1.14