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 */ }
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...) ); }
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); }
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; }