Skip to content

Commit 7e51b50

Browse files
committed
Support OpenPGP v6 signature pre-salting
OpenPGP v6 signature salt is a random per-signature thing that we need to feed into the digest before the actual data. For that we need rpm-sequoia support, the first version to have it is 1.9.0. The tests for this are in #3844 Fixes: #3846
1 parent 1be2973 commit 7e51b50

5 files changed

Lines changed: 19 additions & 4 deletions

File tree

INSTALL

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ The scdoc manual page generator, available from
4242
https://git.sr.ht/~sircmpwn/scdoc
4343

4444
You will need a cryptographic library to support digests and an OpenPGP
45-
implementation to support signatures. rpm-sequoia (>= 1.3.0 required) is
45+
implementation to support signatures. rpm-sequoia (>= 1.9.0 required) is
4646
the most complete option, covering both, and also the default:
4747
https://github.com/rpm-software-management/rpm-sequoia
4848

include/rpm/rpmpgp.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,8 @@ int pgpDigParamsVersion(pgpDigParams digp);
489489
*/
490490
uint32_t pgpDigParamsCreationTime(pgpDigParams digp);
491491

492+
int pgpDigParamsSalt(pgpDigParams digp, const uint8_t **datap, size_t *lenp);
493+
492494
/** \ingroup rpmpgp
493495
* Destroy parsed OpenPGP packet parameter(s).
494496
* @param digp parameter container

lib/rpmvs.cc

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -457,8 +457,18 @@ void rpmvsInitRange(struct rpmvs_s *sis, int range)
457457
for (int i = 0; i < sis->nsigs; i++) {
458458
struct rpmsinfo_s *sinfo = &sis->sigs[i];
459459
if (sinfo->range & range) {
460-
if (sinfo->rc == RPMRC_OK)
461-
rpmDigestBundleAddID(sis->bundle, sinfo->hashalgo, sinfo->id, 0);
460+
if (sinfo->rc != RPMRC_OK)
461+
continue;
462+
463+
rpmDigestBundleAddID(sis->bundle, sinfo->hashalgo, sinfo->id, 0);
464+
/* OpenPGP v6 signatures need a grain of salt to go */
465+
if (sinfo->sig) {
466+
const uint8_t *salt = NULL;
467+
size_t slen = 0;
468+
if (pgpDigParamsSalt(sinfo->sig, &salt, &slen) == 0 && salt) {
469+
rpmDigestBundleUpdateID(sis->bundle, sinfo->id, salt, slen);
470+
}
471+
}
462472
}
463473
}
464474
}

rpmio/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ if (EXISTS ${CMAKE_SOURCE_DIR}/rpmio/rpmpgp_legacy/CMakeLists.txt)
2222
endif()
2323

2424
if (WITH_SEQUOIA)
25-
pkg_check_modules(RPMSEQUOIA REQUIRED IMPORTED_TARGET rpm-sequoia>=1.8.0)
25+
pkg_check_modules(RPMSEQUOIA REQUIRED IMPORTED_TARGET rpm-sequoia>=1.9.0)
2626
target_sources(librpmio PRIVATE rpmpgp_sequoia.cc)
2727
target_link_libraries(librpmio PRIVATE PkgConfig::RPMSEQUOIA)
2828
else()

rpmio/rpmpgp_sequoia.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ W(const uint8_t *, pgpDigParamsSignID, (pgpDigParams digp), (digp))
3737
W(const char *, pgpDigParamsUserID, (pgpDigParams digp), (digp))
3838
W(int, pgpDigParamsVersion, (pgpDigParams digp), (digp))
3939
W(uint32_t, pgpDigParamsCreationTime, (pgpDigParams digp), (digp))
40+
W(int, pgpDigParamsSalt,
41+
(pgpDigParams digp, const uint8_t **datap, size_t *lenp),
42+
(digp, datap, lenp))
4043
W(rpmRC, pgpVerifySignature,
4144
(pgpDigParams key, pgpDigParams sig, DIGEST_CTX hashctx),
4245
(key, sig, hashctx))

0 commit comments

Comments
 (0)