| 3204 | } |
| 3205 | |
| 3206 | static void |
| 3207 | decrypt_data(CK_SLOT_ID slot, CK_SESSION_HANDLE session, |
| 3208 | CK_OBJECT_HANDLE key) |
| 3209 | { |
| 3210 | unsigned char in_buffer[1024], out_buffer[1024]; |
| 3211 | CK_MECHANISM mech; |
| 3212 | CK_RV rv; |
| 3213 | params_t params = {0}; |
| 3214 | CK_BYTE_PTR iv = NULL; |
| 3215 | CK_BYTE_PTR aad = NULL; |
| 3216 | CK_ULONG in_len, out_len; |
| 3217 | int fd_in, fd_out; |
| 3218 | ssize_t sz; |
| 3219 | |
| 3220 | if (!opt_mechanism_used) |
| 3221 | if (!find_mechanism(slot, CKF_DECRYPT | opt_allow_sw, NULL, 0, &opt_mechanism)) |
| 3222 | util_fatal("Decrypt mechanism not supported"); |
| 3223 | |
| 3224 | fprintf(stderr, "Using decrypt algorithm %s\n", p11_mechanism_to_name(opt_mechanism)); |
| 3225 | memset(&mech, 0, sizeof(mech)); |
| 3226 | mech.mechanism = opt_mechanism; |
| 3227 | |
| 3228 | if (opt_hash_alg != 0 && opt_mechanism != CKM_RSA_PKCS_OAEP) |
| 3229 | util_fatal("The hash-algorithm is applicable only to " |
| 3230 | "RSA-PKCS-OAEP mechanism"); |
| 3231 | |
| 3232 | build_params(¶ms, &mech, &iv, &aad); |
| 3233 | |
| 3234 | if (opt_input == NULL) |
| 3235 | fd_in = 0; |
| 3236 | else if ((fd_in = open(opt_input, O_RDONLY | O_BINARY)) < 0) |
| 3237 | util_fatal("Cannot open %s: %m", opt_input); |
| 3238 | |
| 3239 | if (opt_output == NULL) { |
| 3240 | fd_out = 1; |
| 3241 | } else { |
| 3242 | fd_out = open(opt_output, O_CREAT | O_TRUNC | O_WRONLY | O_BINARY, S_IRUSR | S_IWUSR); |
| 3243 | if (fd_out < 0) |
| 3244 | util_fatal("failed to open %s: %m", opt_output); |
| 3245 | } |
| 3246 | |
| 3247 | sz = read(fd_in, in_buffer, sizeof(in_buffer)); |
| 3248 | in_len = sz; |
| 3249 | |
| 3250 | if (sz < 0) |
| 3251 | util_fatal("Cannot read from %s: %m", opt_input); |
| 3252 | |
| 3253 | rv = CKR_CANCEL; |
| 3254 | if ((size_t)sz < sizeof(in_buffer)) { |
| 3255 | out_len = sizeof(out_buffer); |
| 3256 | rv = p11->C_DecryptInit(session, &mech, key); |
| 3257 | if (rv != CKR_OK) |
| 3258 | p11_fatal("C_DecryptInit", rv); |
| 3259 | if ((getCLASS(session, key) == CKO_PRIVATE_KEY) && getALWAYS_AUTHENTICATE(session, key)) |
| 3260 | login(session, CKU_CONTEXT_SPECIFIC); |
| 3261 | rv = p11->C_Decrypt(session, in_buffer, in_len, out_buffer, &out_len); |
| 3262 | } |
| 3263 | if (rv != CKR_OK) { |
no test coverage detected