diff options
Diffstat (limited to '')
-rw-r--r-- | src/usr.bin/openssl/cms.c | 203 |
1 files changed, 129 insertions, 74 deletions
diff --git a/src/usr.bin/openssl/cms.c b/src/usr.bin/openssl/cms.c index 1d23c529b9..d453bcd139 100644 --- a/src/usr.bin/openssl/cms.c +++ b/src/usr.bin/openssl/cms.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: cms.c,v 1.23 2022/01/05 12:51:49 inoguchi Exp $ */ | 1 | /* $OpenBSD: cms.c,v 1.24 2022/01/05 13:41:12 inoguchi Exp $ */ |
2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 | * project. | 3 | * project. |
4 | */ | 4 | */ |
@@ -1177,36 +1177,44 @@ cms_main(int argc, char **argv) | |||
1177 | args = argv + argsused; | 1177 | args = argv + argsused; |
1178 | ret = 1; | 1178 | ret = 1; |
1179 | 1179 | ||
1180 | if (((cms_config.rr_allorfirst != -1) || cms_config.rr_from != NULL) && cms_config.rr_to == NULL) { | 1180 | if (((cms_config.rr_allorfirst != -1) || cms_config.rr_from != NULL) && |
1181 | cms_config.rr_to == NULL) { | ||
1181 | BIO_puts(bio_err, "No Signed Receipts Recipients\n"); | 1182 | BIO_puts(bio_err, "No Signed Receipts Recipients\n"); |
1182 | goto argerr; | 1183 | goto argerr; |
1183 | } | 1184 | } |
1184 | if (!(cms_config.operation & SMIME_SIGNERS) && (cms_config.rr_to != NULL || cms_config.rr_from != NULL)) { | 1185 | if (!(cms_config.operation & SMIME_SIGNERS) && |
1186 | (cms_config.rr_to != NULL || cms_config.rr_from != NULL)) { | ||
1185 | BIO_puts(bio_err, "Signed receipts only allowed with -sign\n"); | 1187 | BIO_puts(bio_err, "Signed receipts only allowed with -sign\n"); |
1186 | goto argerr; | 1188 | goto argerr; |
1187 | } | 1189 | } |
1188 | if (!(cms_config.operation & SMIME_SIGNERS) && (cms_config.skkeys != NULL || cms_config.sksigners != NULL)) { | 1190 | if (!(cms_config.operation & SMIME_SIGNERS) && |
1191 | (cms_config.skkeys != NULL || cms_config.sksigners != NULL)) { | ||
1189 | BIO_puts(bio_err, "Multiple signers or keys not allowed\n"); | 1192 | BIO_puts(bio_err, "Multiple signers or keys not allowed\n"); |
1190 | goto argerr; | 1193 | goto argerr; |
1191 | } | 1194 | } |
1192 | if (cms_config.operation & SMIME_SIGNERS) { | 1195 | if (cms_config.operation & SMIME_SIGNERS) { |
1193 | if (cms_config.keyfile != NULL && cms_config.signerfile == NULL) { | 1196 | if (cms_config.keyfile != NULL && |
1197 | cms_config.signerfile == NULL) { | ||
1194 | BIO_puts(bio_err, "Illegal -inkey without -signer\n"); | 1198 | BIO_puts(bio_err, "Illegal -inkey without -signer\n"); |
1195 | goto argerr; | 1199 | goto argerr; |
1196 | } | 1200 | } |
1197 | /* Check to see if any final signer needs to be appended */ | 1201 | /* Check to see if any final signer needs to be appended */ |
1198 | if (cms_config.signerfile != NULL) { | 1202 | if (cms_config.signerfile != NULL) { |
1199 | if (cms_config.sksigners == NULL && | 1203 | if (cms_config.sksigners == NULL && |
1200 | (cms_config.sksigners = sk_OPENSSL_STRING_new_null()) == NULL) | 1204 | (cms_config.sksigners = |
1205 | sk_OPENSSL_STRING_new_null()) == NULL) | ||
1201 | goto end; | 1206 | goto end; |
1202 | if (!sk_OPENSSL_STRING_push(cms_config.sksigners, cms_config.signerfile)) | 1207 | if (!sk_OPENSSL_STRING_push(cms_config.sksigners, |
1208 | cms_config.signerfile)) | ||
1203 | goto end; | 1209 | goto end; |
1204 | if (cms_config.skkeys == NULL && | 1210 | if (cms_config.skkeys == NULL && |
1205 | (cms_config.skkeys = sk_OPENSSL_STRING_new_null()) == NULL) | 1211 | (cms_config.skkeys = |
1212 | sk_OPENSSL_STRING_new_null()) == NULL) | ||
1206 | goto end; | 1213 | goto end; |
1207 | if (cms_config.keyfile == NULL) | 1214 | if (cms_config.keyfile == NULL) |
1208 | cms_config.keyfile = cms_config.signerfile; | 1215 | cms_config.keyfile = cms_config.signerfile; |
1209 | if (!sk_OPENSSL_STRING_push(cms_config.skkeys, cms_config.keyfile)) | 1216 | if (!sk_OPENSSL_STRING_push(cms_config.skkeys, |
1217 | cms_config.keyfile)) | ||
1210 | goto end; | 1218 | goto end; |
1211 | } | 1219 | } |
1212 | if (cms_config.sksigners == NULL) { | 1220 | if (cms_config.sksigners == NULL) { |
@@ -1217,19 +1225,25 @@ cms_main(int argc, char **argv) | |||
1217 | cms_config.signerfile = NULL; | 1225 | cms_config.signerfile = NULL; |
1218 | cms_config.keyfile = NULL; | 1226 | cms_config.keyfile = NULL; |
1219 | } else if (cms_config.operation == SMIME_DECRYPT) { | 1227 | } else if (cms_config.operation == SMIME_DECRYPT) { |
1220 | if (cms_config.recipfile == NULL && cms_config.keyfile == NULL && cms_config.secret_key == NULL && cms_config.pwri_pass == NULL) { | 1228 | if (cms_config.recipfile == NULL && |
1229 | cms_config.keyfile == NULL && | ||
1230 | cms_config.secret_key == NULL && | ||
1231 | cms_config.pwri_pass == NULL) { | ||
1221 | BIO_printf(bio_err, | 1232 | BIO_printf(bio_err, |
1222 | "No recipient certificate or key specified\n"); | 1233 | "No recipient certificate or key specified\n"); |
1223 | badarg = 1; | 1234 | badarg = 1; |
1224 | } | 1235 | } |
1225 | } else if (cms_config.operation == SMIME_ENCRYPT) { | 1236 | } else if (cms_config.operation == SMIME_ENCRYPT) { |
1226 | if (*args == NULL && cms_config.secret_key == NULL && cms_config.pwri_pass == NULL && cms_config.encerts == NULL) { | 1237 | if (*args == NULL && cms_config.secret_key == NULL && |
1238 | cms_config.pwri_pass == NULL && | ||
1239 | cms_config.encerts == NULL) { | ||
1227 | BIO_printf(bio_err, | 1240 | BIO_printf(bio_err, |
1228 | "No recipient(s) certificate(s) specified\n"); | 1241 | "No recipient(s) certificate(s) specified\n"); |
1229 | badarg = 1; | 1242 | badarg = 1; |
1230 | } | 1243 | } |
1231 | } else if (!cms_config.operation) | 1244 | } else if (!cms_config.operation) { |
1232 | badarg = 1; | 1245 | badarg = 1; |
1246 | } | ||
1233 | 1247 | ||
1234 | if (badarg) { | 1248 | if (badarg) { |
1235 | argerr: | 1249 | argerr: |
@@ -1271,7 +1285,8 @@ cms_main(int argc, char **argv) | |||
1271 | goto end; | 1285 | goto end; |
1272 | #endif | 1286 | #endif |
1273 | } | 1287 | } |
1274 | if (cms_config.secret_key != NULL && cms_config.secret_keyid == NULL) { | 1288 | if (cms_config.secret_key != NULL && |
1289 | cms_config.secret_keyid == NULL) { | ||
1275 | BIO_printf(bio_err, "No secret key id\n"); | 1290 | BIO_printf(bio_err, "No secret key id\n"); |
1276 | goto end; | 1291 | goto end; |
1277 | } | 1292 | } |
@@ -1279,8 +1294,9 @@ cms_main(int argc, char **argv) | |||
1279 | if ((cms_config.encerts = sk_X509_new_null()) == NULL) | 1294 | if ((cms_config.encerts = sk_X509_new_null()) == NULL) |
1280 | goto end; | 1295 | goto end; |
1281 | while (*args) { | 1296 | while (*args) { |
1282 | if ((cms_config.cert = load_cert(bio_err, *args, FORMAT_PEM, | 1297 | if ((cms_config.cert = load_cert(bio_err, *args, |
1283 | NULL, "recipient certificate file")) == NULL) | 1298 | FORMAT_PEM, NULL, |
1299 | "recipient certificate file")) == NULL) | ||
1284 | goto end; | 1300 | goto end; |
1285 | if (!sk_X509_push(cms_config.encerts, cms_config.cert)) | 1301 | if (!sk_X509_push(cms_config.encerts, cms_config.cert)) |
1286 | goto end; | 1302 | goto end; |
@@ -1289,21 +1305,23 @@ cms_main(int argc, char **argv) | |||
1289 | } | 1305 | } |
1290 | } | 1306 | } |
1291 | if (cms_config.certfile != NULL) { | 1307 | if (cms_config.certfile != NULL) { |
1292 | if ((other = load_certs(bio_err, cms_config.certfile, FORMAT_PEM, NULL, | 1308 | if ((other = load_certs(bio_err, cms_config.certfile, |
1293 | "certificate file")) == NULL) { | 1309 | FORMAT_PEM, NULL, "certificate file")) == NULL) { |
1294 | ERR_print_errors(bio_err); | 1310 | ERR_print_errors(bio_err); |
1295 | goto end; | 1311 | goto end; |
1296 | } | 1312 | } |
1297 | } | 1313 | } |
1298 | if (cms_config.recipfile != NULL && (cms_config.operation == SMIME_DECRYPT)) { | 1314 | if (cms_config.recipfile != NULL && |
1299 | if ((recip = load_cert(bio_err, cms_config.recipfile, FORMAT_PEM, NULL, | 1315 | (cms_config.operation == SMIME_DECRYPT)) { |
1300 | "recipient certificate file")) == NULL) { | 1316 | if ((recip = load_cert(bio_err, cms_config.recipfile, |
1317 | FORMAT_PEM, NULL, "recipient certificate file")) == NULL) { | ||
1301 | ERR_print_errors(bio_err); | 1318 | ERR_print_errors(bio_err); |
1302 | goto end; | 1319 | goto end; |
1303 | } | 1320 | } |
1304 | } | 1321 | } |
1305 | if (cms_config.operation == SMIME_SIGN_RECEIPT) { | 1322 | if (cms_config.operation == SMIME_SIGN_RECEIPT) { |
1306 | if ((signer = load_cert(bio_err, cms_config.signerfile, FORMAT_PEM, NULL, | 1323 | if ((signer = load_cert(bio_err, cms_config.signerfile, |
1324 | FORMAT_PEM, NULL, | ||
1307 | "receipt signer certificate file")) == NULL) { | 1325 | "receipt signer certificate file")) == NULL) { |
1308 | ERR_print_errors(bio_err); | 1326 | ERR_print_errors(bio_err); |
1309 | goto end; | 1327 | goto end; |
@@ -1316,12 +1334,13 @@ cms_main(int argc, char **argv) | |||
1316 | (cms_config.operation == SMIME_SIGN_RECEIPT)) { | 1334 | (cms_config.operation == SMIME_SIGN_RECEIPT)) { |
1317 | if (cms_config.keyfile == NULL) | 1335 | if (cms_config.keyfile == NULL) |
1318 | cms_config.keyfile = cms_config.signerfile; | 1336 | cms_config.keyfile = cms_config.signerfile; |
1319 | } else | 1337 | } else { |
1320 | cms_config.keyfile = NULL; | 1338 | cms_config.keyfile = NULL; |
1339 | } | ||
1321 | 1340 | ||
1322 | if (cms_config.keyfile != NULL) { | 1341 | if (cms_config.keyfile != NULL) { |
1323 | key = load_key(bio_err, cms_config.keyfile, cms_config.keyform, 0, passin, | 1342 | key = load_key(bio_err, cms_config.keyfile, cms_config.keyform, |
1324 | "signing key file"); | 1343 | 0, passin, "signing key file"); |
1325 | if (key == NULL) | 1344 | if (key == NULL) |
1326 | goto end; | 1345 | goto end; |
1327 | } | 1346 | } |
@@ -1331,9 +1350,10 @@ cms_main(int argc, char **argv) | |||
1331 | "Can't open input file %s\n", cms_config.infile); | 1350 | "Can't open input file %s\n", cms_config.infile); |
1332 | goto end; | 1351 | goto end; |
1333 | } | 1352 | } |
1334 | } else | 1353 | } else { |
1335 | if ((in = BIO_new_fp(stdin, BIO_NOCLOSE)) == NULL) | 1354 | if ((in = BIO_new_fp(stdin, BIO_NOCLOSE)) == NULL) |
1336 | goto end; | 1355 | goto end; |
1356 | } | ||
1337 | 1357 | ||
1338 | if (cms_config.operation & SMIME_IP) { | 1358 | if (cms_config.operation & SMIME_IP) { |
1339 | if (cms_config.informat == FORMAT_SMIME) | 1359 | if (cms_config.informat == FORMAT_SMIME) |
@@ -1353,9 +1373,11 @@ cms_main(int argc, char **argv) | |||
1353 | } | 1373 | } |
1354 | if (cms_config.contfile != NULL) { | 1374 | if (cms_config.contfile != NULL) { |
1355 | BIO_free(indata); | 1375 | BIO_free(indata); |
1356 | if ((indata = BIO_new_file(cms_config.contfile, "rb")) == NULL) { | 1376 | if ((indata = BIO_new_file(cms_config.contfile, |
1377 | "rb")) == NULL) { | ||
1357 | BIO_printf(bio_err, | 1378 | BIO_printf(bio_err, |
1358 | "Can't read content file %s\n", cms_config.contfile); | 1379 | "Can't read content file %s\n", |
1380 | cms_config.contfile); | ||
1359 | goto end; | 1381 | goto end; |
1360 | } | 1382 | } |
1361 | } | 1383 | } |
@@ -1374,7 +1396,8 @@ cms_main(int argc, char **argv) | |||
1374 | } | 1396 | } |
1375 | } | 1397 | } |
1376 | if (cms_config.rctfile != NULL) { | 1398 | if (cms_config.rctfile != NULL) { |
1377 | char *rctmode = (cms_config.rctformat == FORMAT_ASN1) ? "rb" : "r"; | 1399 | char *rctmode = (cms_config.rctformat == FORMAT_ASN1) ? |
1400 | "rb" : "r"; | ||
1378 | if ((rctin = BIO_new_file(cms_config.rctfile, rctmode)) == NULL) { | 1401 | if ((rctin = BIO_new_file(cms_config.rctfile, rctmode)) == NULL) { |
1379 | BIO_printf(bio_err, | 1402 | BIO_printf(bio_err, |
1380 | "Can't open receipt file %s\n", cms_config.rctfile); | 1403 | "Can't open receipt file %s\n", cms_config.rctfile); |
@@ -1409,7 +1432,8 @@ cms_main(int argc, char **argv) | |||
1409 | 1432 | ||
1410 | if ((cms_config.operation == SMIME_VERIFY) || | 1433 | if ((cms_config.operation == SMIME_VERIFY) || |
1411 | (cms_config.operation == SMIME_VERIFY_RECEIPT)) { | 1434 | (cms_config.operation == SMIME_VERIFY_RECEIPT)) { |
1412 | if ((store = setup_verify(bio_err, cms_config.CAfile, cms_config.CApath)) == NULL) | 1435 | if ((store = setup_verify(bio_err, cms_config.CAfile, |
1436 | cms_config.CApath)) == NULL) | ||
1413 | goto end; | 1437 | goto end; |
1414 | X509_STORE_set_verify_cb(store, cms_cb); | 1438 | X509_STORE_set_verify_cb(store, cms_cb); |
1415 | if (cms_config.vpm != NULL) { | 1439 | if (cms_config.vpm != NULL) { |
@@ -1422,13 +1446,15 @@ cms_main(int argc, char **argv) | |||
1422 | if (cms_config.operation == SMIME_DATA_CREATE) { | 1446 | if (cms_config.operation == SMIME_DATA_CREATE) { |
1423 | cms = CMS_data_create(in, cms_config.flags); | 1447 | cms = CMS_data_create(in, cms_config.flags); |
1424 | } else if (cms_config.operation == SMIME_DIGEST_CREATE) { | 1448 | } else if (cms_config.operation == SMIME_DIGEST_CREATE) { |
1425 | cms = CMS_digest_create(in, cms_config.sign_md, cms_config.flags); | 1449 | cms = CMS_digest_create(in, cms_config.sign_md, |
1450 | cms_config.flags); | ||
1426 | } else if (cms_config.operation == SMIME_COMPRESS) { | 1451 | } else if (cms_config.operation == SMIME_COMPRESS) { |
1427 | cms = CMS_compress(in, -1, cms_config.flags); | 1452 | cms = CMS_compress(in, -1, cms_config.flags); |
1428 | } else if (cms_config.operation == SMIME_ENCRYPT) { | 1453 | } else if (cms_config.operation == SMIME_ENCRYPT) { |
1429 | int i; | 1454 | int i; |
1430 | cms_config.flags |= CMS_PARTIAL; | 1455 | cms_config.flags |= CMS_PARTIAL; |
1431 | cms = CMS_encrypt(NULL, in, cms_config.cipher, cms_config.flags); | 1456 | cms = CMS_encrypt(NULL, in, cms_config.cipher, |
1457 | cms_config.flags); | ||
1432 | if (cms == NULL) | 1458 | if (cms == NULL) |
1433 | goto end; | 1459 | goto end; |
1434 | for (i = 0; i < sk_X509_num(cms_config.encerts); i++) { | 1460 | for (i = 0; i < sk_X509_num(cms_config.encerts); i++) { |
@@ -1439,7 +1465,8 @@ cms_main(int argc, char **argv) | |||
1439 | 1465 | ||
1440 | if ((x = sk_X509_value(cms_config.encerts, i)) == NULL) | 1466 | if ((x = sk_X509_value(cms_config.encerts, i)) == NULL) |
1441 | goto end; | 1467 | goto end; |
1442 | for (kparam = cms_config.key_first; kparam != NULL; kparam = kparam->next) { | 1468 | for (kparam = cms_config.key_first; kparam != NULL; |
1469 | kparam = kparam->next) { | ||
1443 | if (kparam->idx == i) { | 1470 | if (kparam->idx == i) { |
1444 | tflags |= CMS_KEY_PARAM; | 1471 | tflags |= CMS_KEY_PARAM; |
1445 | break; | 1472 | break; |
@@ -1450,7 +1477,8 @@ cms_main(int argc, char **argv) | |||
1450 | goto end; | 1477 | goto end; |
1451 | if (kparam != NULL) { | 1478 | if (kparam != NULL) { |
1452 | EVP_PKEY_CTX *pctx; | 1479 | EVP_PKEY_CTX *pctx; |
1453 | if ((pctx = CMS_RecipientInfo_get0_pkey_ctx(ri)) == NULL) | 1480 | if ((pctx = CMS_RecipientInfo_get0_pkey_ctx( |
1481 | ri)) == NULL) | ||
1454 | goto end; | 1482 | goto end; |
1455 | if (!cms_set_pkey_param(pctx, kparam->param)) | 1483 | if (!cms_set_pkey_param(pctx, kparam->param)) |
1456 | goto end; | 1484 | goto end; |
@@ -1458,8 +1486,9 @@ cms_main(int argc, char **argv) | |||
1458 | } | 1486 | } |
1459 | 1487 | ||
1460 | if (cms_config.secret_key != NULL) { | 1488 | if (cms_config.secret_key != NULL) { |
1461 | if (CMS_add0_recipient_key(cms, NID_undef, cms_config.secret_key, | 1489 | if (CMS_add0_recipient_key(cms, NID_undef, |
1462 | cms_config.secret_keylen, cms_config.secret_keyid, cms_config.secret_keyidlen, | 1490 | cms_config.secret_key, cms_config.secret_keylen, |
1491 | cms_config.secret_keyid, cms_config.secret_keyidlen, | ||
1463 | NULL, NULL, NULL) == NULL) | 1492 | NULL, NULL, NULL) == NULL) |
1464 | goto end; | 1493 | goto end; |
1465 | /* NULL these because call absorbs them */ | 1494 | /* NULL these because call absorbs them */ |
@@ -1480,8 +1509,9 @@ cms_main(int argc, char **argv) | |||
1480 | goto end; | 1509 | goto end; |
1481 | } | 1510 | } |
1482 | } else if (cms_config.operation == SMIME_ENCRYPTED_ENCRYPT) { | 1511 | } else if (cms_config.operation == SMIME_ENCRYPTED_ENCRYPT) { |
1483 | cms = CMS_EncryptedData_encrypt(in, cms_config.cipher, cms_config.secret_key, | 1512 | cms = CMS_EncryptedData_encrypt(in, cms_config.cipher, |
1484 | cms_config.secret_keylen, cms_config.flags); | 1513 | cms_config.secret_key, cms_config.secret_keylen, |
1514 | cms_config.flags); | ||
1485 | 1515 | ||
1486 | } else if (cms_config.operation == SMIME_SIGN_RECEIPT) { | 1516 | } else if (cms_config.operation == SMIME_SIGN_RECEIPT) { |
1487 | CMS_ContentInfo *srcms = NULL; | 1517 | CMS_ContentInfo *srcms = NULL; |
@@ -1493,7 +1523,8 @@ cms_main(int argc, char **argv) | |||
1493 | si = sk_CMS_SignerInfo_value(sis, 0); | 1523 | si = sk_CMS_SignerInfo_value(sis, 0); |
1494 | if (si == NULL) | 1524 | if (si == NULL) |
1495 | goto end; | 1525 | goto end; |
1496 | srcms = CMS_sign_receipt(si, signer, key, other, cms_config.flags); | 1526 | srcms = CMS_sign_receipt(si, signer, key, other, |
1527 | cms_config.flags); | ||
1497 | if (srcms == NULL) | 1528 | if (srcms == NULL) |
1498 | goto end; | 1529 | goto end; |
1499 | CMS_ContentInfo_free(cms); | 1530 | CMS_ContentInfo_free(cms); |
@@ -1515,11 +1546,13 @@ cms_main(int argc, char **argv) | |||
1515 | if (cms == NULL) | 1546 | if (cms == NULL) |
1516 | goto end; | 1547 | goto end; |
1517 | if (cms_config.econtent_type != NULL) | 1548 | if (cms_config.econtent_type != NULL) |
1518 | if (!CMS_set1_eContentType(cms, cms_config.econtent_type)) | 1549 | if (!CMS_set1_eContentType(cms, |
1550 | cms_config.econtent_type)) | ||
1519 | goto end; | 1551 | goto end; |
1520 | 1552 | ||
1521 | if (cms_config.rr_to != NULL) { | 1553 | if (cms_config.rr_to != NULL) { |
1522 | rr = make_receipt_request(cms_config.rr_to, cms_config.rr_allorfirst, | 1554 | rr = make_receipt_request(cms_config.rr_to, |
1555 | cms_config.rr_allorfirst, | ||
1523 | cms_config.rr_from); | 1556 | cms_config.rr_from); |
1524 | if (rr == NULL) { | 1557 | if (rr == NULL) { |
1525 | BIO_puts(bio_err, | 1558 | BIO_puts(bio_err, |
@@ -1527,35 +1560,43 @@ cms_main(int argc, char **argv) | |||
1527 | goto end; | 1560 | goto end; |
1528 | } | 1561 | } |
1529 | } | 1562 | } |
1530 | } else | 1563 | } else { |
1531 | cms_config.flags |= CMS_REUSE_DIGEST; | 1564 | cms_config.flags |= CMS_REUSE_DIGEST; |
1565 | } | ||
1566 | |||
1532 | for (i = 0; i < sk_OPENSSL_STRING_num(cms_config.sksigners); i++) { | 1567 | for (i = 0; i < sk_OPENSSL_STRING_num(cms_config.sksigners); i++) { |
1533 | CMS_SignerInfo *si; | 1568 | CMS_SignerInfo *si; |
1534 | struct cms_key_param *kparam; | 1569 | struct cms_key_param *kparam; |
1535 | int tflags = cms_config.flags; | 1570 | int tflags = cms_config.flags; |
1536 | cms_config.signerfile = sk_OPENSSL_STRING_value(cms_config.sksigners, i); | ||
1537 | cms_config.keyfile = sk_OPENSSL_STRING_value(cms_config.skkeys, i); | ||
1538 | 1571 | ||
1539 | signer = load_cert(bio_err, cms_config.signerfile, FORMAT_PEM, | 1572 | cms_config.signerfile = sk_OPENSSL_STRING_value( |
1540 | NULL, "signer certificate"); | 1573 | cms_config.sksigners, i); |
1574 | cms_config.keyfile = sk_OPENSSL_STRING_value( | ||
1575 | cms_config.skkeys, i); | ||
1576 | |||
1577 | signer = load_cert(bio_err, cms_config.signerfile, | ||
1578 | FORMAT_PEM, NULL, "signer certificate"); | ||
1541 | if (signer == NULL) | 1579 | if (signer == NULL) |
1542 | goto end; | 1580 | goto end; |
1543 | key = load_key(bio_err, cms_config.keyfile, cms_config.keyform, 0, passin, | 1581 | key = load_key(bio_err, cms_config.keyfile, |
1544 | "signing key file"); | 1582 | cms_config.keyform, 0, passin, "signing key file"); |
1545 | if (key == NULL) | 1583 | if (key == NULL) |
1546 | goto end; | 1584 | goto end; |
1547 | for (kparam = cms_config.key_first; kparam != NULL; kparam = kparam->next) { | 1585 | for (kparam = cms_config.key_first; kparam != NULL; |
1586 | kparam = kparam->next) { | ||
1548 | if (kparam->idx == i) { | 1587 | if (kparam->idx == i) { |
1549 | tflags |= CMS_KEY_PARAM; | 1588 | tflags |= CMS_KEY_PARAM; |
1550 | break; | 1589 | break; |
1551 | } | 1590 | } |
1552 | } | 1591 | } |
1553 | si = CMS_add1_signer(cms, signer, key, cms_config.sign_md, tflags); | 1592 | si = CMS_add1_signer(cms, signer, key, |
1593 | cms_config.sign_md, tflags); | ||
1554 | if (si == NULL) | 1594 | if (si == NULL) |
1555 | goto end; | 1595 | goto end; |
1556 | if (kparam != NULL) { | 1596 | if (kparam != NULL) { |
1557 | EVP_PKEY_CTX *pctx; | 1597 | EVP_PKEY_CTX *pctx; |
1558 | if ((pctx = CMS_SignerInfo_get0_pkey_ctx(si)) == NULL) | 1598 | if ((pctx = CMS_SignerInfo_get0_pkey_ctx( |
1599 | si)) == NULL) | ||
1559 | goto end; | 1600 | goto end; |
1560 | if (!cms_set_pkey_param(pctx, kparam->param)) | 1601 | if (!cms_set_pkey_param(pctx, kparam->param)) |
1561 | goto end; | 1602 | goto end; |
@@ -1568,7 +1609,8 @@ cms_main(int argc, char **argv) | |||
1568 | key = NULL; | 1609 | key = NULL; |
1569 | } | 1610 | } |
1570 | /* If not streaming or resigning finalize structure */ | 1611 | /* If not streaming or resigning finalize structure */ |
1571 | if ((cms_config.operation == SMIME_SIGN) && !(cms_config.flags & CMS_STREAM)) { | 1612 | if ((cms_config.operation == SMIME_SIGN) && |
1613 | !(cms_config.flags & CMS_STREAM)) { | ||
1572 | if (!CMS_final(cms, in, NULL, cms_config.flags)) | 1614 | if (!CMS_final(cms, in, NULL, cms_config.flags)) |
1573 | goto end; | 1615 | goto end; |
1574 | } | 1616 | } |
@@ -1580,11 +1622,13 @@ cms_main(int argc, char **argv) | |||
1580 | ret = 4; | 1622 | ret = 4; |
1581 | if (cms_config.operation == SMIME_DECRYPT) { | 1623 | if (cms_config.operation == SMIME_DECRYPT) { |
1582 | if (cms_config.flags & CMS_DEBUG_DECRYPT) | 1624 | if (cms_config.flags & CMS_DEBUG_DECRYPT) |
1583 | CMS_decrypt(cms, NULL, NULL, NULL, NULL, cms_config.flags); | 1625 | CMS_decrypt(cms, NULL, NULL, NULL, NULL, |
1626 | cms_config.flags); | ||
1584 | 1627 | ||
1585 | if (cms_config.secret_key != NULL) { | 1628 | if (cms_config.secret_key != NULL) { |
1586 | if (!CMS_decrypt_set1_key(cms, cms_config.secret_key, | 1629 | if (!CMS_decrypt_set1_key(cms, cms_config.secret_key, |
1587 | cms_config.secret_keylen, cms_config.secret_keyid, cms_config.secret_keyidlen)) { | 1630 | cms_config.secret_keylen, cms_config.secret_keyid, |
1631 | cms_config.secret_keyidlen)) { | ||
1588 | BIO_puts(bio_err, | 1632 | BIO_puts(bio_err, |
1589 | "Error decrypting CMS using secret key\n"); | 1633 | "Error decrypting CMS using secret key\n"); |
1590 | goto end; | 1634 | goto end; |
@@ -1598,13 +1642,15 @@ cms_main(int argc, char **argv) | |||
1598 | } | 1642 | } |
1599 | } | 1643 | } |
1600 | if (cms_config.pwri_pass != NULL) { | 1644 | if (cms_config.pwri_pass != NULL) { |
1601 | if (!CMS_decrypt_set1_password(cms, cms_config.pwri_pass, -1)) { | 1645 | if (!CMS_decrypt_set1_password(cms, |
1646 | cms_config.pwri_pass, -1)) { | ||
1602 | BIO_puts(bio_err, | 1647 | BIO_puts(bio_err, |
1603 | "Error decrypting CMS using password\n"); | 1648 | "Error decrypting CMS using password\n"); |
1604 | goto end; | 1649 | goto end; |
1605 | } | 1650 | } |
1606 | } | 1651 | } |
1607 | if (!CMS_decrypt(cms, NULL, NULL, indata, out, cms_config.flags)) { | 1652 | if (!CMS_decrypt(cms, NULL, NULL, indata, out, |
1653 | cms_config.flags)) { | ||
1608 | BIO_printf(bio_err, "Error decrypting CMS structure\n"); | 1654 | BIO_printf(bio_err, "Error decrypting CMS structure\n"); |
1609 | goto end; | 1655 | goto end; |
1610 | } | 1656 | } |
@@ -1622,13 +1668,14 @@ cms_main(int argc, char **argv) | |||
1622 | goto end; | 1668 | goto end; |
1623 | } | 1669 | } |
1624 | } else if (cms_config.operation == SMIME_ENCRYPTED_DECRYPT) { | 1670 | } else if (cms_config.operation == SMIME_ENCRYPTED_DECRYPT) { |
1625 | if (!CMS_EncryptedData_decrypt(cms, cms_config.secret_key, cms_config.secret_keylen, | 1671 | if (!CMS_EncryptedData_decrypt(cms, cms_config.secret_key, |
1626 | indata, out, cms_config.flags)) | 1672 | cms_config.secret_keylen, indata, out, cms_config.flags)) |
1627 | goto end; | 1673 | goto end; |
1628 | } else if (cms_config.operation == SMIME_VERIFY) { | 1674 | } else if (cms_config.operation == SMIME_VERIFY) { |
1629 | if (CMS_verify(cms, other, store, indata, out, cms_config.flags) > 0) | 1675 | if (CMS_verify(cms, other, store, indata, out, |
1676 | cms_config.flags) > 0) { | ||
1630 | BIO_printf(bio_err, "Verification successful\n"); | 1677 | BIO_printf(bio_err, "Verification successful\n"); |
1631 | else { | 1678 | } else { |
1632 | BIO_printf(bio_err, "Verification failure\n"); | 1679 | BIO_printf(bio_err, "Verification failure\n"); |
1633 | if (cms_config.verify_retcode) | 1680 | if (cms_config.verify_retcode) |
1634 | ret = verify_err + 32; | 1681 | ret = verify_err + 32; |
@@ -1651,9 +1698,10 @@ cms_main(int argc, char **argv) | |||
1651 | receipt_request_print(bio_err, cms); | 1698 | receipt_request_print(bio_err, cms); |
1652 | 1699 | ||
1653 | } else if (cms_config.operation == SMIME_VERIFY_RECEIPT) { | 1700 | } else if (cms_config.operation == SMIME_VERIFY_RECEIPT) { |
1654 | if (CMS_verify_receipt(rcms, cms, other, store, cms_config.flags) > 0) | 1701 | if (CMS_verify_receipt(rcms, cms, other, store, |
1702 | cms_config.flags) > 0) { | ||
1655 | BIO_printf(bio_err, "Verification successful\n"); | 1703 | BIO_printf(bio_err, "Verification successful\n"); |
1656 | else { | 1704 | } else { |
1657 | BIO_printf(bio_err, "Verification failure\n"); | 1705 | BIO_printf(bio_err, "Verification failure\n"); |
1658 | goto end; | 1706 | goto end; |
1659 | } | 1707 | } |
@@ -1668,16 +1716,20 @@ cms_main(int argc, char **argv) | |||
1668 | if (cms_config.from != NULL) | 1716 | if (cms_config.from != NULL) |
1669 | BIO_printf(out, "From: %s\n", cms_config.from); | 1717 | BIO_printf(out, "From: %s\n", cms_config.from); |
1670 | if (cms_config.subject != NULL) | 1718 | if (cms_config.subject != NULL) |
1671 | BIO_printf(out, "Subject: %s\n", cms_config.subject); | 1719 | BIO_printf(out, "Subject: %s\n", |
1720 | cms_config.subject); | ||
1672 | if (cms_config.operation == SMIME_RESIGN) | 1721 | if (cms_config.operation == SMIME_RESIGN) |
1673 | ret = SMIME_write_CMS(out, cms, indata, cms_config.flags); | 1722 | ret = SMIME_write_CMS(out, cms, indata, |
1723 | cms_config.flags); | ||
1674 | else | 1724 | else |
1675 | ret = SMIME_write_CMS(out, cms, in, cms_config.flags); | 1725 | ret = SMIME_write_CMS(out, cms, in, |
1676 | } else if (cms_config.outformat == FORMAT_PEM) | 1726 | cms_config.flags); |
1677 | ret = PEM_write_bio_CMS_stream(out, cms, in, cms_config.flags); | 1727 | } else if (cms_config.outformat == FORMAT_PEM) { |
1678 | else if (cms_config.outformat == FORMAT_ASN1) | 1728 | ret = PEM_write_bio_CMS_stream(out, cms, in, |
1729 | cms_config.flags); | ||
1730 | } else if (cms_config.outformat == FORMAT_ASN1) { | ||
1679 | ret = i2d_CMS_bio_stream(out, cms, in, cms_config.flags); | 1731 | ret = i2d_CMS_bio_stream(out, cms, in, cms_config.flags); |
1680 | else { | 1732 | } else { |
1681 | BIO_printf(bio_err, "Bad output format for CMS file\n"); | 1733 | BIO_printf(bio_err, "Bad output format for CMS file\n"); |
1682 | goto end; | 1734 | goto end; |
1683 | } | 1735 | } |
@@ -1801,14 +1853,15 @@ receipt_request_print(BIO *out, CMS_ContentInfo *cms) | |||
1801 | return; | 1853 | return; |
1802 | rv = CMS_get1_ReceiptRequest(si, &rr); | 1854 | rv = CMS_get1_ReceiptRequest(si, &rr); |
1803 | BIO_printf(bio_err, "Signer %d:\n", i + 1); | 1855 | BIO_printf(bio_err, "Signer %d:\n", i + 1); |
1804 | if (rv == 0) | 1856 | if (rv == 0) { |
1805 | BIO_puts(bio_err, " No Receipt Request\n"); | 1857 | BIO_puts(bio_err, " No Receipt Request\n"); |
1806 | else if (rv < 0) { | 1858 | } else if (rv < 0) { |
1807 | BIO_puts(bio_err, " Receipt Request Parse Error\n"); | 1859 | BIO_puts(bio_err, " Receipt Request Parse Error\n"); |
1808 | ERR_print_errors(bio_err); | 1860 | ERR_print_errors(bio_err); |
1809 | } else { | 1861 | } else { |
1810 | char *id; | 1862 | char *id; |
1811 | int idlen; | 1863 | int idlen; |
1864 | |||
1812 | CMS_ReceiptRequest_get0_values(rr, &scid, &allorfirst, | 1865 | CMS_ReceiptRequest_get0_values(rr, &scid, &allorfirst, |
1813 | &rlist, &rto); | 1866 | &rlist, &rto); |
1814 | BIO_puts(out, " Signed Content ID:\n"); | 1867 | BIO_puts(out, " Signed Content ID:\n"); |
@@ -1819,12 +1872,13 @@ receipt_request_print(BIO *out, CMS_ContentInfo *cms) | |||
1819 | if (rlist != NULL) { | 1872 | if (rlist != NULL) { |
1820 | BIO_puts(out, " List:\n"); | 1873 | BIO_puts(out, " List:\n"); |
1821 | gnames_stack_print(out, rlist); | 1874 | gnames_stack_print(out, rlist); |
1822 | } else if (allorfirst == 1) | 1875 | } else if (allorfirst == 1) { |
1823 | BIO_puts(out, ": First Tier\n"); | 1876 | BIO_puts(out, ": First Tier\n"); |
1824 | else if (allorfirst == 0) | 1877 | } else if (allorfirst == 0) { |
1825 | BIO_puts(out, ": All\n"); | 1878 | BIO_puts(out, ": All\n"); |
1826 | else | 1879 | } else { |
1827 | BIO_printf(out, " Unknown (%d)\n", allorfirst); | 1880 | BIO_printf(out, " Unknown (%d)\n", allorfirst); |
1881 | } | ||
1828 | BIO_puts(out, " Receipts To:\n"); | 1882 | BIO_puts(out, " Receipts To:\n"); |
1829 | gnames_stack_print(out, rto); | 1883 | gnames_stack_print(out, rto); |
1830 | } | 1884 | } |
@@ -1884,8 +1938,9 @@ make_receipt_request(STACK_OF(OPENSSL_STRING) *rr_to, int rr_allorfirst, | |||
1884 | rct_from = make_names_stack(rr_from); | 1938 | rct_from = make_names_stack(rr_from); |
1885 | if (rct_from == NULL) | 1939 | if (rct_from == NULL) |
1886 | goto err; | 1940 | goto err; |
1887 | } else | 1941 | } else { |
1888 | rct_from = NULL; | 1942 | rct_from = NULL; |
1943 | } | ||
1889 | 1944 | ||
1890 | if ((rr = CMS_ReceiptRequest_create0(NULL, -1, rr_allorfirst, rct_from, | 1945 | if ((rr = CMS_ReceiptRequest_create0(NULL, -1, rr_allorfirst, rct_from, |
1891 | rct_to)) == NULL) | 1946 | rct_to)) == NULL) |