LCOV - code coverage report
Current view: top level - plugins/crypto_native - main.c (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 36 59 61.0 %
Date: 2023-10-26 01:39:38 Functions: 4 4 100.0 %

          Line data    Source code
       1             : /*
       2             :  *------------------------------------------------------------------
       3             :  * Copyright (c) 2019 Cisco and/or its affiliates.
       4             :  * Licensed under the Apache License, Version 2.0 (the "License");
       5             :  * you may not use this file except in compliance with the License.
       6             :  * You may obtain a copy of the License at:
       7             :  *
       8             :  *     http://www.apache.org/licenses/LICENSE-2.0
       9             :  *
      10             :  * Unless required by applicable law or agreed to in writing, software
      11             :  * distributed under the License is distributed on an "AS IS" BASIS,
      12             :  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      13             :  * See the License for the specific language governing permissions and
      14             :  * limitations under the License.
      15             :  *------------------------------------------------------------------
      16             :  */
      17             : 
      18             : #include <vlib/vlib.h>
      19             : #include <vnet/plugin/plugin.h>
      20             : #include <vnet/crypto/crypto.h>
      21             : #include <crypto_native/crypto_native.h>
      22             : 
      23             : crypto_native_main_t crypto_native_main;
      24             : 
      25             : static void
      26      334847 : crypto_native_key_handler (vlib_main_t * vm, vnet_crypto_key_op_t kop,
      27             :                            vnet_crypto_key_index_t idx)
      28             : {
      29      334847 :   vnet_crypto_key_t *key = vnet_crypto_get_key (idx);
      30      334847 :   crypto_native_main_t *cm = &crypto_native_main;
      31             : 
      32             :   /** TODO: add linked alg support **/
      33      334847 :   if (key->type == VNET_CRYPTO_KEY_TYPE_LINK)
      34        4404 :     return;
      35             : 
      36      330443 :   if (cm->key_fn[key->alg] == 0)
      37      118764 :     return;
      38             : 
      39      211679 :   if (kop == VNET_CRYPTO_KEY_OP_DEL)
      40             :     {
      41      105837 :       if (idx >= vec_len (cm->key_data))
      42           0 :         return;
      43             : 
      44      105837 :       if (cm->key_data[idx] == 0)
      45           0 :         return;
      46             : 
      47      105837 :       clib_mem_free_s (cm->key_data[idx]);
      48      105837 :       cm->key_data[idx] = 0;
      49      105837 :       return;
      50             :     }
      51             : 
      52      105842 :   vec_validate_aligned (cm->key_data, idx, CLIB_CACHE_LINE_BYTES);
      53             : 
      54      105842 :   if (kop == VNET_CRYPTO_KEY_OP_MODIFY && cm->key_data[idx])
      55             :     {
      56           0 :       clib_mem_free_s (cm->key_data[idx]);
      57             :     }
      58             : 
      59      105842 :   cm->key_data[idx] = cm->key_fn[key->alg] (key);
      60             : }
      61             : 
      62             : clib_error_t *
      63         575 : crypto_native_init (vlib_main_t * vm)
      64             : {
      65         575 :   crypto_native_main_t *cm = &crypto_native_main;
      66         575 :   clib_error_t *error = 0;
      67             : 
      68         575 :   if (clib_cpu_supports_x86_aes () == 0 &&
      69           0 :       clib_cpu_supports_aarch64_aes () == 0)
      70           0 :     return 0;
      71             : 
      72         575 :   cm->crypto_engine_index =
      73         575 :     vnet_crypto_register_engine (vm, "native", 100,
      74             :                                  "Native ISA Optimized Crypto");
      75             : 
      76             :   if (0);
      77             : #if __x86_64__
      78         575 :   else if (crypto_native_aes_cbc_init_icl && clib_cpu_supports_vaes () &&
      79           0 :            clib_cpu_supports_avx512f ())
      80           0 :     error = crypto_native_aes_cbc_init_icl (vm);
      81         575 :   else if (crypto_native_aes_cbc_init_adl && clib_cpu_supports_vaes ())
      82           0 :     error = crypto_native_aes_cbc_init_adl (vm);
      83         575 :   else if (crypto_native_aes_cbc_init_skx && clib_cpu_supports_avx512f ())
      84         575 :     error = crypto_native_aes_cbc_init_skx (vm);
      85           0 :   else if (crypto_native_aes_cbc_init_hsw && clib_cpu_supports_avx2 ())
      86           0 :     error = crypto_native_aes_cbc_init_hsw (vm);
      87           0 :   else if (crypto_native_aes_cbc_init_slm)
      88           0 :     error = crypto_native_aes_cbc_init_slm (vm);
      89             : #endif
      90             : #if __aarch64__
      91             :   else if (crypto_native_aes_cbc_init_neon)
      92             :     error = crypto_native_aes_cbc_init_neon (vm);
      93             : #endif
      94             :   else
      95           0 :     error = clib_error_return (0, "No AES CBC implemenation available");
      96             : 
      97         575 :   if (error)
      98           0 :     return error;
      99             : 
     100             : #if __x86_64__
     101         575 :   if (clib_cpu_supports_pclmulqdq ())
     102             :     {
     103         575 :       if (crypto_native_aes_gcm_init_icl && clib_cpu_supports_vaes () &&
     104           0 :           clib_cpu_supports_avx512f ())
     105           0 :         error = crypto_native_aes_gcm_init_icl (vm);
     106         575 :       else if (crypto_native_aes_gcm_init_adl && clib_cpu_supports_vaes ())
     107           0 :         error = crypto_native_aes_gcm_init_adl (vm);
     108         575 :       else if (crypto_native_aes_gcm_init_skx && clib_cpu_supports_avx512f ())
     109         575 :         error = crypto_native_aes_gcm_init_skx (vm);
     110           0 :       else if (crypto_native_aes_gcm_init_hsw && clib_cpu_supports_avx2 ())
     111           0 :         error = crypto_native_aes_gcm_init_hsw (vm);
     112           0 :       else if (crypto_native_aes_gcm_init_slm)
     113           0 :         error = crypto_native_aes_gcm_init_slm (vm);
     114             :       else
     115           0 :         error = clib_error_return (0, "No AES GCM implemenation available");
     116             : 
     117         575 :       if (error)
     118           0 :         return error;
     119             :     }
     120             : #endif
     121             : #if __aarch64__
     122             :   if (crypto_native_aes_gcm_init_neon)
     123             :     error = crypto_native_aes_gcm_init_neon (vm);
     124             :   else
     125             :     error = clib_error_return (0, "No AES GCM implemenation available");
     126             : 
     127             :   if (error)
     128             :     return error;
     129             : #endif
     130             : 
     131         575 :   vnet_crypto_register_key_handler (vm, cm->crypto_engine_index,
     132             :                                     crypto_native_key_handler);
     133         575 :   return 0;
     134             : }
     135             : 
     136             : /* *INDENT-OFF* */
     137        1151 : VLIB_INIT_FUNCTION (crypto_native_init) =
     138             : {
     139             :   .runs_after = VLIB_INITS ("vnet_crypto_init"),
     140             : };
     141             : /* *INDENT-ON* */
     142             : 
     143             : #include <vpp/app/version.h>
     144             : 
     145             : /* *INDENT-OFF* */
     146             : VLIB_PLUGIN_REGISTER () = {
     147             :   .version = VPP_BUILD_VER,
     148             :   .description = "Intel IA32 Software Crypto Engine",
     149             : };
     150             : /* *INDENT-ON* */
     151             : 
     152             : /*
     153             :  * fd.io coding-style-patch-verification: ON
     154             :  *
     155             :  * Local Variables:
     156             :  * eval: (c-set-style "gnu")
     157             :  * End:
     158             :  */

Generated by: LCOV version 1.14