static int ch2d(coord **P, int n) {
    int u = makeChain(P, n, cmpl); /* make lower hull */
    if (!n)
        return 0;
    P[n] = P[0];
    return u + makeChain(P + u, n - u + 1, cmph); /* make upper hull */
}
Example #2
0
SISSignatureCertificateChain* makeChain(SISField* controller, const char* certData, const char* keyData, const char* passphrase, SigType type) {
	SISSignature* signature = makeSignature(controller, keyData, passphrase, type);
	SISArray* signatures = new SISArray(SISFieldType::SISSignature);
	signatures->AddElement(signature);
	SISCertificateChain* chain = makeChain(certData);
	return new SISSignatureCertificateChain(signatures, chain);
}
 static inline libblock::Code *makeChain(
     libblock::Code *first,
     ARG... rest
 ) {
     return libblock::Code::pack(
         first,
         makeChain(rest...)
     );
 }
Example #4
0
SISSignatureCertificateChain* makeChain(SISField* controller, const char* certData, const char* keyData, const char* passphrase, SigType type) {
	EVP_PKEY* publicKey = NULL;
	SISCertificateChain* chain = makeChain(certData, &publicKey);
	if (!publicKey) {
		fprintf(stderr, "No public key found!\n");
		throw SignBadCert;
	}
	SISSignature* signature = makeSignature(controller, keyData, passphrase, type, publicKey);
	EVP_PKEY_free(publicKey);
	SISArray* signatures = new SISArray(SISFieldType::SISSignature);
	signatures->AddElement(signature);
	return new SISSignatureCertificateChain(signatures, chain);
}
Example #5
0
int main(int argc, char *argv[]) {
	initSigning();
	const char* argv0 = argv[0];
	int ch;
	SigType type = SigAuto;
	bool remove = false;
	while ((ch = getopt(argc, argv, "?c:opsuv")) != -1) {
		switch (ch) {
		case 'c':
			if (!strcmp(optarg, "d"))
				type = SigDsa;
			else if (!strcmp(optarg, "r"))
				type = SigRsa;
			else
				fprintf(stderr, "Unknown algorithm\n");
			break;
		case 'o':
			break;
		case 'p':
			break;
		case 's':
			break;
		case 'u':
			remove = true;
			break;
		case '?':
		default:
			showHelp(argv0);
			return 0;
		}
	}

	argc -= optind;
	argv += optind;
	char* input = NULL;
	char* output = NULL;
	char* cert = NULL;
	char* key = NULL;
	char* passphrase = NULL;

	if (argc > 5)
		argc = 5;
	switch (argc) {
	case 5:
		passphrase = argv[4];
	case 4:
		key = argv[3];
	case 3:
		cert = argv[2];
	case 2:
		output = argv[1];
	case 1:
		input = argv[0];
	}

	if (input == NULL) {
		showHelp(argv0);
		return 0;
	}

	if (!output)
		output = input;


	uint8_t header[16];
	SISContents* contents = loadSISFile(input, header);
	if (!contents)
		return 1;

	SISCompressed* cController = (SISCompressed*) contents->FindElement(SISFieldType::SISCompressed);
	TCompressionAlgorithm algorithm = cController->Algorithm();
	cController->Uncompress();
	cController->LoadChild();
	SISField* field = cController->Field();
	if (field->Id() != SISFieldType::SISController) {
		fprintf(stderr, "Bad SIS field type in the top level compressed field\n");
		exit(1);
	}
	SISController* controller = (SISController*) field;

	if (remove) {
		SISField* field = controller->FindRemoveLastElement(SISFieldType::SISSignatureCertificateChain);
		delete field;
	} else {
		SISDataIndex* dataIndex = (SISDataIndex*) controller->FindRemoveElement(SISFieldType::SISDataIndex);
		const char* certData = NULL;
		const char* keyData = NULL;
		bool freeCerts = false;
		if (cert && key) {
			try {
				certData = loadTextFile(cert);
				keyData = loadTextFile(key);
			} catch (SignUtilError err) {
				return err;
			}
			freeCerts = true;
		} else {
			fprintf(stderr, "You must specify certificate and key.\n");
			exit(1);
		}

		try {
			SISSignatureCertificateChain* chain = makeChain(controller, certData, keyData, passphrase, type);
			controller->AddElement(chain);
		} catch (SignUtilError err) {
			return err;
		}
		controller->AddElement(dataIndex);

		if (freeCerts) {
			delete [] certData;
			delete [] keyData;
		}
	}


/*
	FILE* tout = fopen("testcontroller", "wb");
	controller->CopyHeaderData(tout);
	fclose(tout);
*/
	cController->LoadUncompressed();
	cController->Compress(algorithm);

	SISControllerChecksum* csum = (SISControllerChecksum*) contents->FindElement(SISFieldType::SISControllerChecksum);
	updateChecksum(csum, cController);


	FILE* out = fopen(output, "wb");
	fwrite(header, 1, 16, out);
	contents->CopyHeaderData(out);
	fclose(out);
	delete contents;

	cleanupSigning();

	return 0;
}