| 119 | } |
| 120 | |
| 121 | int |
| 122 | padlock_cipher_setup(struct padlock_session *ses, |
| 123 | const struct crypto_session_params *csp) |
| 124 | { |
| 125 | union padlock_cw *cw; |
| 126 | |
| 127 | if (csp->csp_cipher_klen != 16 && csp->csp_cipher_klen != 24 && |
| 128 | csp->csp_cipher_klen != 32) { |
| 129 | return (EINVAL); |
| 130 | } |
| 131 | |
| 132 | cw = &ses->ses_cw; |
| 133 | bzero(cw, sizeof(*cw)); |
| 134 | cw->cw_algorithm_type = PADLOCK_ALGORITHM_TYPE_AES; |
| 135 | cw->cw_key_generation = PADLOCK_KEY_GENERATION_SW; |
| 136 | cw->cw_intermediate = 0; |
| 137 | switch (csp->csp_cipher_klen * 8) { |
| 138 | case 128: |
| 139 | cw->cw_round_count = PADLOCK_ROUND_COUNT_AES128; |
| 140 | cw->cw_key_size = PADLOCK_KEY_SIZE_128; |
| 141 | #ifdef HW_KEY_GENERATION |
| 142 | /* This doesn't buy us much, that's why it is commented out. */ |
| 143 | cw->cw_key_generation = PADLOCK_KEY_GENERATION_HW; |
| 144 | #endif |
| 145 | break; |
| 146 | case 192: |
| 147 | cw->cw_round_count = PADLOCK_ROUND_COUNT_AES192; |
| 148 | cw->cw_key_size = PADLOCK_KEY_SIZE_192; |
| 149 | break; |
| 150 | case 256: |
| 151 | cw->cw_round_count = PADLOCK_ROUND_COUNT_AES256; |
| 152 | cw->cw_key_size = PADLOCK_KEY_SIZE_256; |
| 153 | break; |
| 154 | } |
| 155 | if (csp->csp_cipher_key != NULL) { |
| 156 | padlock_cipher_key_setup(ses, csp->csp_cipher_key, |
| 157 | csp->csp_cipher_klen); |
| 158 | } |
| 159 | return (0); |
| 160 | } |
| 161 | |
| 162 | /* |
| 163 | * Function checks if the given buffer is already 16 bytes aligned. |
no test coverage detected