static struct packing * pkg_create_archive(const char *outdir, struct pkg *pkg, pkg_formats format, unsigned required_flags) { char *pkg_path = NULL; struct packing *pkg_archive = NULL; const char *pkgname, *pkgversion; /* * Ensure that we have all the information we need */ if (pkg->type != PKG_OLD_FILE) assert((pkg->flags & required_flags) == required_flags); if (mkdirs(outdir) != EPKG_OK) return NULL; pkg_get(pkg, PKG_NAME, &pkgname, PKG_VERSION, &pkgversion); if (asprintf(&pkg_path, "%s/%s-%s", outdir, pkgname, pkgversion) == -1) { pkg_emit_errno("asprintf", ""); return (NULL); } if (packing_init(&pkg_archive, pkg_path, format) != EPKG_OK) pkg_archive = NULL; free(pkg_path); return pkg_archive; }
int pkg_finish_repo(char *path, pem_password_cb *password_cb, char *rsa_key_path) { char repo_path[MAXPATHLEN + 1]; char repo_archive[MAXPATHLEN + 1]; struct packing *pack; unsigned char *sigret = NULL; unsigned int siglen = 0; if (!is_dir(path)) { pkg_emit_error("%s is not a directory", path); return (EPKG_FATAL); } snprintf(repo_path, sizeof(repo_path), "%s/repo.sqlite", path); snprintf(repo_archive, sizeof(repo_archive), "%s/repo", path); packing_init(&pack, repo_archive, TXZ); if (rsa_key_path != NULL) { rsa_sign(repo_path, password_cb, rsa_key_path, &sigret, &siglen); packing_append_buffer(pack, sigret, "signature", siglen + 1); free(sigret); } packing_append_file_attr(pack, repo_path, "repo.sqlite", "root", "wheel", 0644); unlink(repo_path); packing_finish(pack); return (EPKG_OK); }
static struct packing * pkg_create_archive(const char *outdir, struct pkg *pkg, pkg_formats format, int required_flags) { char *pkg_path = NULL; struct packing *pkg_archive = NULL; /* * Ensure that we have all the information we need */ if ((pkg->flags & required_flags) != required_flags) { printf("error: required flags not set\n"); return NULL; } if (asprintf(&pkg_path, "%s/%s-%s", outdir, pkg_get(pkg, PKG_NAME), pkg_get(pkg, PKG_VERSION)) == -1) { perror("asprintf"); return NULL; /* XXX do better */ } if (packing_init(&pkg_archive, pkg_path, format) != EPKG_OK) { perror("packing_init"); return NULL; } if (pkg_path != NULL) free(pkg_path); return pkg_archive; }
static struct packing * pkg_create_archive(const char *outdir, struct pkg *pkg, pkg_formats format, unsigned required_flags) { char *pkg_path = NULL; struct packing *pkg_archive = NULL; /* * Ensure that we have all the information we need */ if (pkg->type != PKG_OLD_FILE) assert((pkg->flags & required_flags) == required_flags); if (mkdirs(outdir) != EPKG_OK) return NULL; if (pkg_asprintf(&pkg_path, "%S/%n-%v", outdir, pkg, pkg) == -1) { pkg_emit_errno("pkg_asprintf", ""); return (NULL); } if (packing_init(&pkg_archive, pkg_path, format, false) != EPKG_OK) pkg_archive = NULL; free(pkg_path); return pkg_archive; }
static int pack_db(const char *name, const char *archive, char *path, struct rsa_key *rsa) { struct packing *pack; unsigned char *sigret = NULL; unsigned int siglen = 0; if (packing_init(&pack, archive, TXZ) != EPKG_OK) return (EPKG_FATAL); if (rsa != NULL) { if (rsa_sign(path, rsa, &sigret, &siglen) != EPKG_OK) { packing_finish(pack); return (EPKG_FATAL); } if (packing_append_buffer(pack, sigret, "signature", siglen + 1) != EPKG_OK) { free(sigret); free(pack); return (EPKG_FATAL); } free(sigret); } packing_append_file_attr(pack, path, name, "root", "wheel", 0644); unlink(path); packing_finish(pack); return (EPKG_OK); }
int pkg_finish_repo(char *path, pem_password_cb *password_cb, char *rsa_key_path) { char repo_path[MAXPATHLEN + 1]; char repo_archive[MAXPATHLEN + 1]; struct packing *pack; int max_len = 0; unsigned char *sigret = NULL; int siglen = 0; RSA *rsa = NULL; char sha256[SHA256_DIGEST_LENGTH * 2 +1]; snprintf(repo_path, sizeof(repo_path), "%s/repo.sqlite", path); snprintf(repo_archive, sizeof(repo_archive), "%s/repo", path); packing_init(&pack, repo_archive, TXZ); if (rsa_key_path != NULL) { if (access(rsa_key_path, R_OK) == -1) { pkg_emit_errno("access", rsa_key_path); return EPKG_FATAL; } SSL_load_error_strings(); OpenSSL_add_all_algorithms(); OpenSSL_add_all_ciphers(); rsa = load_rsa_private_key(rsa_key_path, password_cb); max_len = RSA_size(rsa); sigret = malloc(max_len + 1); memset(sigret, 0, max_len); sha256_file(repo_path, sha256); if (RSA_sign(NID_sha1, sha256, sizeof(sha256), sigret, &siglen, rsa) == 0) { /* XXX pass back RSA errors correctly */ pkg_emit_error("%s: %lu", rsa_key_path, ERR_get_error()); return EPKG_FATAL; } packing_append_buffer(pack, sigret, "signature", siglen + 1); free(sigret); RSA_free(rsa); ERR_free_strings(); } packing_append_file(pack, repo_path, "repo.sqlite"); unlink(repo_path); packing_finish(pack); return (EPKG_OK); }