Ejemplo n.º 1
0
int
generate_sattr_blob(pesign_context *ctx)
{
	int rc;
	SECItem sa;
	SpcContentInfo ci;

	memset(&ci, '\0', sizeof (ci));
	rc = generate_spc_content_info(ctx->cms_ctx, &ci);
	if (rc < 0) {
		fprintf(stderr, "Could not generate content info: %s\n",
			PORT_ErrorToString(PORT_GetError()));
		exit(1);
	}

	rc = generate_signed_attributes(ctx->cms_ctx, &sa);
	if (rc < 0) {
		fprintf(stderr, "Could not generate signed attributes: %s\n",
			PORT_ErrorToString(PORT_GetError()));
		exit(1);
	}

	return write(ctx->outsattrsfd, sa.data, sa.len);
}
Ejemplo n.º 2
0
int
generate_spc_signed_data(SECItem *sdp, cms_context *ctx)
{
	SignedData sd;

	if (!sdp)
		return -1;

	memset(&sd, '\0', sizeof (sd));

	if (SEC_ASN1EncodeInteger(ctx->arena, &sd.version, 1) == NULL)
		return -1;

	if (generate_algorithm_id_list(&sd.algorithms, ctx) < 0)
		goto err;
	
	if (generate_spc_content_info(&sd.cinfo, ctx) < 0)
		goto err_algorithms;

	if (generate_certificate_list(&sd.certificates, ctx) < 0)
		goto err_cinfo;

	sd.crls = NULL;

	if (generate_signerInfo_list(&sd.signerInfos, ctx) < 0)
		goto err_certificate_list;

	SECItem encoded = { 0, };
	if (SEC_ASN1EncodeItem(ctx->arena, &encoded, &sd, SignedDataTemplate)
			== NULL) {
		fprintf(stderr, "Could not encode SignedData: %s\n",
			PORT_ErrorToString(PORT_GetError()));
		goto err_signer_infos;
	}

	ContentInfo sdw;
	memset(&sdw, '\0', sizeof (sdw));

	SECOidData *oid = SECOID_FindOIDByTag(SEC_OID_PKCS7_SIGNED_DATA);

	memcpy(&sdw.contentType, &oid->oid, sizeof (sdw.contentType));
	memcpy(&sdw.content, &encoded, sizeof (sdw.content));

	SECItem wrapper = { 0, };
	if (SEC_ASN1EncodeItem(ctx->arena, &wrapper, &sdw,
			ContentInfoTemplate) == NULL) {
		fprintf(stderr, "Could not encode SignedData: %s\n",
			PORT_ErrorToString(PORT_GetError()));
		goto err_signed_data;
	}

	memcpy(sdp, &wrapper, sizeof(*sdp));
	return 0;
err_signed_data:
	SECITEM_FreeItem(&encoded, PR_FALSE);
err_signer_infos:
	free_signerInfo_list(sd.signerInfos, ctx);
err_certificate_list:
	free_certificate_list(sd.certificates, ctx);
err_cinfo:
	free_spc_content_info(&sd.cinfo, ctx);
err_algorithms:
	free_algorithm_list(sd.algorithms, ctx);
err:
#if 0
	SECITEM_FreeItem(&sd.version, PR_TRUE);
#endif
	return -1;
}