Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

lib/, bin/: fix signature type, now called *.sig2 #565

Merged
merged 3 commits into from
Aug 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions bin/xbps-remove/clean-cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ cleaner_cb(struct xbps_handle *xhp, xbps_object_t obj,
bool *done UNUSED)
{
char buf[PATH_MAX];
char buf2[PATH_MAX];
xbps_dictionary_t pkgd;
const char *binpkg, *rsha256;
const char *binpkgver, *binpkgarch;
Expand Down Expand Up @@ -116,6 +117,7 @@ cleaner_cb(struct xbps_handle *xhp, xbps_object_t obj,
}
}
snprintf(buf, sizeof(buf), "%s.sig", binpkg);
snprintf(buf2, sizeof(buf2), "%s.sig2", binpkg);
if (!data->dry && unlink(binpkg) == -1) {
xbps_error_printf("Failed to remove `%s': %s\n",
binpkg, strerror(errno));
Expand All @@ -126,6 +128,10 @@ cleaner_cb(struct xbps_handle *xhp, xbps_object_t obj,
xbps_error_printf("Failed to remove `%s': %s\n",
buf, strerror(errno));
}
if (!data->dry && unlink(buf2) == -1 && errno != ENOENT) {
xbps_error_printf("Failed to remove `%s': %s\n",
buf2, strerror(errno));
}

return 0;
}
Expand Down
13 changes: 11 additions & 2 deletions bin/xbps-rindex/remove-obsoletes.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,12 @@
static int
remove_pkg(const char *repodir, const char *file)
{
char *filepath, *sigpath;
char *filepath, *sigpath, *sig2path;
int rv = 0;

filepath = xbps_xasprintf("%s/%s", repodir, file);
sigpath = xbps_xasprintf("%s.sig", filepath);
sig2path = xbps_xasprintf("%s.sig2", filepath);
if (remove(filepath) == -1) {
if (errno != ENOENT) {
rv = errno;
Expand All @@ -55,10 +56,18 @@ remove_pkg(const char *repodir, const char *file)
if (errno != ENOENT) {
rv = errno;
xbps_error_printf("xbps-rindex: failed to remove "
"package signature `%s': %s\n", sigpath, strerror(rv));
"legacy package signature `%s': %s\n", sigpath, strerror(rv));
}
}
if (remove(sig2path) == -1) {
if (errno != ENOENT) {
rv = errno;
xbps_error_printf("xbps-rindex: failed to remove "
"package signature `%s': %s\n", sig2path, strerror(rv));
}
}
free(sigpath);
free(sig2path);
free(filepath);

return rv;
Expand Down
9 changes: 2 additions & 7 deletions bin/xbps-rindex/sign.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,12 +101,7 @@ rsa_sign_file(RSA *rsa, const char *file,
return false;
}

/*
* XXX: NID_sha1 is wrong, doesn't make it any weaker
* but the ASN1 is wrong, OpenSSL/LibreSSL doesn't care.
* Other implementations like golang fail because of this.
*/
if (!RSA_sign(NID_sha1, digest, XBPS_SHA256_DIGEST_SIZE,
if (!RSA_sign(NID_sha256, digest, XBPS_SHA256_DIGEST_SIZE,
*sigret, siglen, rsa)) {
free(*sigret);
return false;
Expand Down Expand Up @@ -257,7 +252,7 @@ sign_pkg(struct xbps_handle *xhp, const char *binpkg, const char *privkey, bool
char *sigfile = NULL;
int rv = 0, sigfile_fd = -1;

sigfile = xbps_xasprintf("%s.sig", binpkg);
sigfile = xbps_xasprintf("%s.sig2", binpkg);
/*
* Skip pkg if file signature exists
*/
Expand Down
2 changes: 2 additions & 0 deletions configure
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,8 @@ fi
if [ "$CC" = "tcc" ]; then
echo "CFLAGS += -Wno-error" >>$CONFIG_MK
fi
# openssl 3 compatibility
echo "CFLAGS += -Wno-error=deprecated-declarations">>$CONFIG_MK

# libfetch
echo "CPPFLAGS += -I\$(TOPDIR)/lib/fetch" >>$CONFIG_MK
Expand Down
4 changes: 2 additions & 2 deletions include/xbps.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -1975,8 +1975,8 @@ bool xbps_verify_signature(struct xbps_repo *repo, const char *sigfile,
* in \a repo.
*
* @param[in] repo Repository to use with the RSA public key associated.
* @param[in] fname The filename to verify, the signature file must have a .sig
* extension, i.e `<fname>.sig`.
* @param[in] fname The filename to verify, the signature file must have a .sig2
* extension, i.e `<fname>.sig2`.
*
* @return True if the signature is valid, false otherwise.
*/
Expand Down
12 changes: 6 additions & 6 deletions lib/transaction_fetch.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ verify_binpkg(struct xbps_handle *xhp, xbps_dictionary_t pkgd)
xbps_set_cb_state(xhp, XBPS_STATE_VERIFY_FAIL, rv, pkgver,
"%s: removed pkg archive and its signature.", pkgver);
(void)remove(binfile);
sigfile = xbps_xasprintf("%s.sig", binfile);
sigfile = xbps_xasprintf("%s.sig2", binfile);
(void)remove(sigfile);
free(sigfile);
goto out;
Expand Down Expand Up @@ -110,8 +110,8 @@ download_binpkg(struct xbps_handle *xhp, xbps_dictionary_t repo_pkgd)
xbps_dictionary_get_cstring_nocopy(repo_pkgd, "pkgver", &pkgver);
xbps_dictionary_get_cstring_nocopy(repo_pkgd, "architecture", &arch);

snprintf(buf, sizeof buf, "%s/%s.%s.xbps.sig", repoloc, pkgver, arch);
sigsuffix = buf+(strlen(buf)-sizeof (".sig")+1);
snprintf(buf, sizeof buf, "%s/%s.%s.xbps.sig2", repoloc, pkgver, arch);
sigsuffix = buf+(strlen(buf)-sizeof (".sig2")+1);

xbps_set_cb_state(xhp, XBPS_STATE_DOWNLOAD, 0, pkgver,
"Downloading `%s' signature (from `%s')...", pkgver, repoloc);
Expand Down Expand Up @@ -145,8 +145,8 @@ download_binpkg(struct xbps_handle *xhp, xbps_dictionary_t repo_pkgd)
xbps_set_cb_state(xhp, XBPS_STATE_VERIFY, 0, pkgver,
"%s: verifying RSA signature...", pkgver);

snprintf(buf, sizeof buf, "%s/%s.%s.xbps.sig", xhp->cachedir, pkgver, arch);
sigsuffix = buf+(strlen(buf)-sizeof (".sig")+1);
snprintf(buf, sizeof buf, "%s/%s.%s.xbps.sig2", xhp->cachedir, pkgver, arch);
sigsuffix = buf+(strlen(buf)-sizeof (".sig2")+1);

if ((repo = xbps_rpool_get_repo(repoloc)) == NULL) {
rv = errno;
Expand All @@ -159,7 +159,7 @@ download_binpkg(struct xbps_handle *xhp, xbps_dictionary_t repo_pkgd)
* If digest is not set, binary package was not downloaded,
* i.e. 304 not modified, verify by file instead.
*/
if (*digest) {
if (fetchLastErrCode == FETCH_UNCHANGED) {
*sigsuffix = '\0';
if (!xbps_verify_file_signature(repo, buf)) {
rv = EPERM;
Expand Down
6 changes: 3 additions & 3 deletions lib/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -405,15 +405,15 @@ xbps_remote_binpkg_exists(struct xbps_handle *xhp, xbps_dictionary_t pkgd)
"architecture", &arch))
return NULL;

snprintf(path, sizeof(path), "%s/%s.%s.xbps.sig", xhp->cachedir,
snprintf(path, sizeof(path), "%s/%s.%s.xbps.sig2", xhp->cachedir,
pkgver, arch);

/* check if the signature file exists */
if (access(path, R_OK) != 0)
return false;

/* strip the .sig suffix and check if binpkg file exists */
path[strlen(path)-sizeof (".sig")+1] = '\0';
/* strip the .sig2 suffix and check if binpkg file exists */
path[strlen(path)-sizeof (".sig2")+1] = '\0';

return access(path, R_OK) == 0;
}
Expand Down
4 changes: 2 additions & 2 deletions lib/verifysig.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ rsa_verify_hash(struct xbps_repo *repo, xbps_data_t pubkey,
return false;
}

rv = RSA_verify(NID_sha1, sha256, SHA256_DIGEST_LENGTH, sig, siglen, rsa);
rv = RSA_verify(NID_sha256, sha256, SHA256_DIGEST_LENGTH, sig, siglen, rsa);
RSA_free(rsa);
BIO_free(bio);
ERR_free_strings();
Expand Down Expand Up @@ -144,7 +144,7 @@ xbps_verify_file_signature(struct xbps_repo *repo, const char *fname)
return false;
}

snprintf(sig, sizeof sig, "%s.sig", fname);
snprintf(sig, sizeof sig, "%s.sig2", fname);
val = xbps_verify_signature(repo, sig, digest);

return val;
Expand Down
Loading