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 : */