int main(int argc, char **argv) { KSI_CTX *ksi = NULL; int res = KSI_UNKNOWN_ERROR; KSI_DataHash *hsh = NULL; KSI_RequestHandle *handle[REQUESTS]; KSI_NetworkClient *http = NULL; FILE *logFile = NULL; size_t i; KSI_DataHasher *hsr = NULL; const KSI_CertConstraint pubFileCertConstr[] = { { KSI_CERT_EMAIL, "*****@*****.**"}, { NULL, NULL } }; struct { size_t ok; size_t nok; } stat; stat.ok = 0; stat.nok = 0; /* Create new KSI context for this thread. */ res = KSI_CTX_new(&ksi); if (res != KSI_OK) { fprintf(stderr, "Unable to create context.\n"); goto cleanup; } res = KSI_CTX_setDefaultPubFileCertConstraints(ksi, pubFileCertConstr); if (res != KSI_OK) { fprintf(stderr, "Unable to configure publications file cert constraints.\n"); goto cleanup; } /* Configure the logger. */ res = OpenLogging(ksi, "multi_curl.log", &logFile); if (res != KSI_OK) goto cleanup; KSI_LOG_info(ksi, "Using KSI version: '%s'", KSI_getVersion()); /* Check publications file url. */ res = KSI_CTX_setPublicationUrl(ksi, "http://verify.guardtime.com/ksi-publications.bin"); if (res != KSI_OK) { fprintf(stderr, "Unable to set publications file url.\n"); goto cleanup; } res = KSI_HttpClient_new(ksi, &http); if (res != KSI_OK) { fprintf(stderr, "Unable to create http client.\n"); goto cleanup; } res = KSI_HttpClient_setAggregator(http, "http://ksigw.test.guardtime.com:3332", "anon", "anon"); if (res != KSI_OK) { fprintf(stderr, "Unable to set aggregator url.\n"); goto cleanup; } KSI_HttpClient_setReadTimeoutSeconds(http, 10); KSI_HttpClient_setConnectTimeoutSeconds(http, 10); for (i = 0; i < REQUESTS; i++) { char buf[100]; size_t len; KSI_AggregationReq *req = NULL; len = KSI_snprintf(buf, sizeof(buf), "Hello %d", i); res = KSI_DataHash_create(ksi, buf, len, KSI_getHashAlgorithmByName("default"), &hsh); if (res != KSI_OK) { fprintf(stderr, "Unable to create hash."); goto cleanup; } res = KSI_AggregationReq_new(ksi, &req); if (res != KSI_OK) { fprintf(stderr, "Unable to create request."); goto cleanup; } res = KSI_AggregationReq_setRequestHash(req, hsh); if (res != KSI_OK) { fprintf(stderr, "Unable to set request hash."); goto cleanup; } res = KSI_NetworkClient_sendSignRequest(http, req, &handle[i]); if (res != KSI_OK) { fprintf(stderr, "Unable to send aggregation request."); goto cleanup; } KSI_AggregationReq_free(req); } res = KSI_NetworkClient_performAll(http, handle, REQUESTS); if (res != KSI_OK) { fprintf(stderr, "Unable to perform requests."); goto cleanup; } for (i = 0; i < REQUESTS; i++) { KSI_AggregationResp *resp = NULL; res = KSI_RequestHandle_getAggregationResponse(handle[i], &resp); if (res != KSI_OK) { const KSI_RequestHandleStatus *st = NULL; res = KSI_RequestHandle_getResponseStatus(handle[i], &st); if (res == KSI_OK) { printf("Status code = %ld: %s\n", st->code, st->errm); } KSI_ERR_statusDump(ksi, stdout); stat.nok++; } else { stat.ok ++; } KSI_AggregationResp_free(resp); } printf("Requests:\n" " Successful: %llu\n" " Failed: %llu\n" " TOTAL: %llu\n", (unsigned long long)stat.ok, (unsigned long long)stat.nok, (unsigned long long)(stat.ok + stat.nok)); res = KSI_OK; cleanup: if (logFile != NULL) fclose(logFile); if (res != KSI_OK && ksi != NULL) { KSI_ERR_statusDump(ksi, stderr); } KSI_DataHash_free(hsh); KSI_DataHasher_free(hsr); KSI_CTX_free(ksi); return res; }
int main(int argc, char **argv) { KSI_CTX *ksi = NULL; int res; FILE *out = NULL; KSI_Signature *sig = NULL; KSI_Signature *ext = NULL; KSI_HttpClient *net = NULL; unsigned char *raw = NULL; unsigned raw_len; unsigned count; FILE *logFile = NULL; if (argc != 5) { printf("Usage:\n" " %s <signature> <extended> <extender uri> <pub-file uri| ->\n", argv[0]); res = KSI_INVALID_ARGUMENT; goto cleanup; } /* Init KSI context */ res = KSI_CTX_new(&ksi); if (res != KSI_OK) { fprintf(stderr, "Unable to init KSI context.\n"); goto cleanup; } logFile = fopen("ksi_extend.log", "w"); if (logFile == NULL) { fprintf(stderr, "Unable to open log file.\n"); } KSI_CTX_setLoggerCallback(ksi, KSI_LOG_StreamLogger, logFile); KSI_CTX_setLogLevel(ksi, KSI_LOG_DEBUG); KSI_LOG_info(ksi, "Using KSI version: '%s'", KSI_getVersion()); res = KSI_HttpClient_new(ksi, &net); if (res != KSI_OK) { fprintf(stderr, "Unable to create new network provider.\n"); goto cleanup; } res = KSI_HttpClient_setExtender(net, argv[3], "anon", "anon"); if (res != KSI_OK) goto cleanup; if (strcmp(argv[4], "-")) { res = KSI_HttpClient_setPublicationUrl(net, argv[4]); if (res != KSI_OK) goto cleanup; } res = KSI_CTX_setNetworkProvider(ksi, (KSI_NetworkClient *)net); if (res != KSI_OK) { fprintf(stderr, "Unable to set new network provider.\n"); goto cleanup; } /* Read the signature. */ res = KSI_Signature_fromFile(ksi, argv[1], &sig); if (res != KSI_OK) { KSI_ERR_statusDump(ksi, stdout); fprintf(stderr, "Unable to read signature from '%s'\n", argv[1]); goto cleanup; } /* Make sure the signature is ok. */ res = KSI_verifySignature(ksi, sig); if (res != KSI_OK) { fprintf(stderr, "Unable to verify signature.\n"); KSI_ERR_statusDump(ksi, stderr); goto cleanup; } /* Extend the signature. */ res = KSI_extendSignature(ksi, sig, &ext); if (res != KSI_OK) { if (res == KSI_EXTEND_NO_SUITABLE_PUBLICATION) { printf("No suitable publication to extend to.\n"); goto cleanup; } fprintf(stderr, "Unable to extend signature.\n"); KSI_ERR_statusDump(ksi, stderr); goto cleanup; } /* To be extra sure, lets verify the extended signature. */ res = KSI_verifySignature(ksi, ext); if (res != KSI_OK) { fprintf(stderr, "Unable to verify the extended signature.\n"); KSI_ERR_statusDump(ksi, stderr); goto cleanup; } /* Serialize the extended signature. */ res = KSI_Signature_serialize(ext, &raw, &raw_len); if (res != KSI_OK) { fprintf(stderr, "Unable to serialize extended signature.\n"); goto cleanup; } /* Open output file. */ out = fopen(argv[2], "wb"); if (out == NULL) { fprintf(stderr, "Unable to open output file '%s'\n", argv[2]); res = KSI_IO_ERROR; goto cleanup; } count = (unsigned)fwrite(raw, 1, raw_len, out); if (count != raw_len) { fprintf(stderr, "Failed to write output file.\n"); res = KSI_IO_ERROR; goto cleanup; } printf("Signature extended."); cleanup: if (logFile != NULL) fclose(logFile); if (out != NULL) fclose(out); KSI_Signature_free(sig); KSI_Signature_free(ext); KSI_free(raw); KSI_CTX_free(ksi); return res; }
int KSI_TcpClient_new(KSI_CTX *ctx, KSI_NetworkClient **tcp) { int res; KSI_NetworkClient *tmp = NULL; KSI_TcpClient *t = NULL; TcpClient_Endpoint *endp_aggr = NULL; TcpClient_Endpoint *endp_ext = NULL; TcpClient_Endpoint *endp_pub = NULL; KSI_ERR_clearErrors(ctx); if (ctx == NULL || tcp == NULL) { KSI_pushError(ctx, res = KSI_INVALID_ARGUMENT, NULL); goto cleanup; } res = KSI_AbstractNetworkClient_new(ctx, &tmp); if (tmp == NULL) { KSI_pushError(ctx, res = KSI_OUT_OF_MEMORY, NULL); goto cleanup; } t = KSI_new(KSI_TcpClient); if (tmp == NULL) { KSI_pushError(ctx, res = KSI_OUT_OF_MEMORY, NULL); goto cleanup; } t->sendRequest = sendRequest; t->transferTimeoutSeconds = 10; t->http = NULL; res = KSI_HttpClient_new(ctx, &t->http); if (res != KSI_OK) { KSI_pushError(ctx, res, NULL); goto cleanup; } /* Create implementations for abstract endpoints. */ res = TcpClient_Endpoint_new(&endp_aggr); if (res != KSI_OK) { KSI_pushError(ctx, res, NULL); goto cleanup; } res = TcpClient_Endpoint_new(&endp_ext); if (res != KSI_OK) { KSI_pushError(ctx, res, NULL); goto cleanup; } res = TcpClient_Endpoint_new(&endp_pub); if (res != KSI_OK) { KSI_pushError(ctx, res, NULL); goto cleanup; } /* Set implementations for abstract endpoints. */ res = KSI_NetEndpoint_setImplContext(tmp->aggregator, endp_aggr, (void (*)(void*))TcpClient_Endpoint_free); if (res != KSI_OK) { KSI_pushError(ctx, res, NULL); goto cleanup; } endp_aggr = NULL; res = KSI_NetEndpoint_setImplContext(tmp->extender, endp_ext, (void (*)(void*))TcpClient_Endpoint_free); if (res != KSI_OK) { KSI_pushError(ctx, res, NULL); goto cleanup; } endp_ext = NULL; res = KSI_NetEndpoint_setImplContext(tmp->publicationsFile, endp_pub, (void (*)(void*))TcpClient_Endpoint_free); if (res != KSI_OK) { KSI_pushError(ctx, res, NULL); goto cleanup; } endp_pub = NULL; tmp->sendExtendRequest = prepareExtendRequest; tmp->sendSignRequest = prepareAggregationRequest; tmp->sendPublicationRequest = sendPublicationRequest; tmp->implFree = (void (*)(void *))tcpClient_free; tmp->requestCount = 0; tmp->impl = t; t = NULL; *tcp = tmp; tmp = NULL; res = KSI_OK; cleanup: tcpClient_free(t); KSI_NetworkClient_free(tmp); TcpClient_Endpoint_free(endp_aggr); TcpClient_Endpoint_free(endp_ext); TcpClient_Endpoint_free(endp_pub); return res; }