MCPcopy Create free account
hub / github.com/OpenSC/OpenSC / decrypt_data

Function decrypt_data

src/tools/pkcs11-tool.c:3206–3297  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3204}
3205
3206static void
3207decrypt_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(&params, &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) {

Callers 1

mainFunction · 0.85

Calls 6

find_mechanismFunction · 0.85
util_fatalFunction · 0.85
p11_mechanism_to_nameFunction · 0.85
build_paramsFunction · 0.85
p11_fatalFunction · 0.85
loginFunction · 0.85

Tested by

no test coverage detected