-
Notifications
You must be signed in to change notification settings - Fork 11
x509storeissuer update #50
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
source/x509storeissuer.c
Outdated
| td->q_data[quantiles - 1].count = count; | ||
| td->q_data[quantiles - 1].end_time = time; | ||
|
|
||
| err: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ci seems to be unhappy because of this. I would try to add return; or just empty statement ;. finge cross.
d1454e0 to
b327824
Compare
b327824 to
1206f0b
Compare
1206f0b to
3001309
Compare
Sashan
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
May be I would move the recent changeset which populates store with certificates to separate PR. so we can get at least some changes in and fine tune new set of changes. that's just suggestions. but it feels like here we are just piling up more and more code.
source/x509storeissuer.c
Outdated
| */ | ||
|
|
||
| #include <stdlib.h> | ||
| #include <dirent.h> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm afraid including dirent.h won't fly on windows.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fair enough, made it fly.
ccbb791 to
4b335f7
Compare
source/x509storeissuer.c
Outdated
| static unsigned char out[64]; | ||
| size_t len; | ||
|
|
||
| len = rand() % (sizeof(out) - 2) + 1; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What happens here if rand() returns a value that is a multiple of sizeof(out) - 2? Don't we then just get an empty string for the issuer or subject name? Is that a problem?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's why +1 at the end.
| fprintf(stderr, "Added %zu generated certificates to the store\n", | ||
| num_store_gen_certs); | ||
|
|
||
| num_certs += read_certsdirs(argv + dirs_start, argc - dirs_start - 1, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So, I'm a bit confused here. Most of this code that targets x509storeissuer is about dynamically generating certificates at run time. Are we also allowing the loading of a certificate directory from disk? If we are allowing both, would it make more sense to move the dynamic generation to an external script in the repository, so that we can just support reading from disk in the code, and create any dynamic certs via the aforementioned script?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I guess it makes sense. The idea behind generating them in the test was to have control over the contents of the certificates, but that can just as well be achieved by an external script.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The loading has been reworked to include -l/-L/-E options, the certificate generation patches have been dropped.
source/perflib/err.h
Outdated
|
|
||
| #include <stdarg.h> | ||
| # if !defined(_WIN32) | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: we don't do new lines around the ifdefs
source/x509storeissuer.c
Outdated
| goto err; | ||
| } | ||
| if (cert == NULL) | ||
| errx(EXIT_FAILURE, "Failed to allocate cert path"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You're missing goto err on every errx.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
errx() does exit() so goto won't be executed.
|
|
||
| return ret; | ||
| } | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you move it to libperf? It's used in other tests, and that should be fixed in other tests in another PR.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Will do a separate PR for that.
source/x509storeissuer.c
Outdated
| fprintf(stderr, | ||
| "Usage: %s [-t] [-v] [-T time] [-n nonce_type:type_args] " | ||
| "certsdir threadcount\n" | ||
| "certsdir [certsdir...] threadcount\n" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why do we need another certsdir?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Initially it was in order to avoid the need to combine the cert dirs outside the test, now it's more to get ability to point to a generated certs dir in addition to initially loaded ones.
source/x509storeissuer.c
Outdated
| counts[num]++; | ||
| time = ossl_time_now(); | ||
| if ((count & 0x3f) == 0) | ||
| time = ossl_time_now(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please keep it aligned with other tests. If there is an issue, create a new ticket where we can discuss it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since the were no observed benefit on MacOS after all, the patch has been dropped.
Sashan
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
looks good in general. I could spot few nits which I think are worth to address.
source/x509storeissuer.c
Outdated
| if (ctx == NULL || !X509_STORE_CTX_init(ctx, store, x509, NULL)) { | ||
| printf("Failed to initialise X509_STORE_CTX\n"); | ||
| err = 1; | ||
| alg = p ? *alg_storage = OPENSSL_strndup(algstr, p - algstr) : algstr; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wonder if there should also be OPENSSL_strdup(algstr) in false branch.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The offending code has been dropped after the latest changes.
source/x509storeissuer.c
Outdated
| return ctx; | ||
|
|
||
| err: | ||
| EVP_PKEY_CTX_free(ctx); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
shall we do
OPENSSL_free(alg);
*alg_storage = NULL;
it does not matter much now because program is going to terminate when failure happens here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ditto here.
source/x509storeissuer.c
Outdated
| static unsigned char out[64]; | ||
| size_t len; | ||
|
|
||
| len = rand() % (sizeof(out) - 2) + 1; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
shall we care if rand() returns 0 here making the function to yield an empty string?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ditto here.
source/x509storeissuer.c
Outdated
| int error = 1; | ||
|
|
||
| cert = X509_new(); | ||
| if (!cert) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
NIT: in function make_pkey_ctx() we use == NULL / != NULL to compare pointers. either way is fine with me as long as it is used consistently. Well I have slight preference to use == NULL over !x
thanks.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ditto here.
source/x509storeissuer.c
Outdated
| X509 *x509_nonce = X509_new(); | ||
| X509_NAME *x509_name_nonce = NULL; | ||
|
|
||
| if (!x509_nonce) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
== NULL ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ditto here.
source/x509storeissuer.c
Outdated
| #if defined(_WIN32) | ||
| /* | ||
| * So, we don't try to concatenate the provided path with the directory | ||
| * paths if the path start with the following: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it should be ...the path starts
source/x509storeissuer.c
Outdated
| { | ||
| X509 *x509 = NULL; | ||
| char *path = NULL; | ||
| size_t ret = 1; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think ret should be initialized to 0 here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, that's correct, fixed.
source/x509storeissuer.c
Outdated
| static void | ||
| do_x509storeissuer(size_t num) | ||
| { | ||
| struct thread_data *td = thread_data + num; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
would it be possible to do td = &thread_data[num]; thanks.
|
openssl head 0ab2ece0a2025ebdea1f94744424ef89ffb9a2b0 ./Configure --banner=Configured --strict-warningsMain branch $ ./x509storeissuer -t /Users/npajkovsky/openssl/openssl/test/certs 8
1.981555Your branch $ ./x509storeissuer -t /Users/npajkovsky/openssl/openssl/test/certs 8
4.663879There is something that changes the behaviour of the test that we already have publicly available. |
|
hmm, this is actually a very good point. I think the whole statistics machinery deserves some explanation in comment. I see the difference, but otherway round: |
| issuer = NULL; | ||
| } | ||
|
|
||
| count++; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I found the code block which starts at 769 as pretty dense. it perhaps deserves some comment here. my understanding is that the whole idea is to divide the collection of statistics to evenly distributed samples (quantiles). The current setting is there are 5 quantiles for the whole duration of test which is 5 secs.
the line here just makes we check the elapsed time only once in a while (count 0x3f). If time collection interval ellapses, then we save a sample (quantile) for elapsed interval.
and one important detail to mention here is that when tool is running with -t option, terse mode there is just one quantile (quantile = 1) which covers the whole test duration. no split to evenly distributed intervals happens.
source/x509storeissuer.c
Outdated
| td->q_data[q].found = found; | ||
| td->q_data[q].added_certs = add; | ||
| td->q_data[q].end_time = time; | ||
| q_end.t = (duration.t * (++q + 1)) / quantiles + td->start_time.t; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
here we calculate the time when to collect the next sample. ++q + 1 prevents 0 (which might be interpreted as now in current logic at line 771.
|
@npajkovsky given that this change introduces a population of the X509_STORE that we are testing (i.e. with this change we're actually iterating over lots of certificates. vs no certificates), I would expect some level of run time increase (though a 4x slowdown is odd). Weather or not we should set the default NUM_KEYS value to 16 vs 0 is probably the question to answer here. |
I'm going to change the defaults so it still measures the time against an empty store, so the additional measurements can be added separately. |
Number of certificates in the store should not matter much. X509_STORE is using hastable which maps certificate's |
|
The difference between performance is because the original code didn't find the certificate, while @esyr code finds it. That triggers a bit of different code paths which we can measure.
|
|
Also, there are two leaks. |
0b96651 to
44e0c66
Compare
Sashan
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
few finishing touches are still needed. thanks.
source/x509storeissuer.c
Outdated
| path); | ||
| } | ||
|
|
||
| if (pool_cnt != NULL); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think the ; should not be here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks, I wonder how it hasn't been caught, as it indeed should be called with pool_cnt == NULL if mode == MODE_R.
source/x509storeissuer.c
Outdated
| timeout_s = strtod(optarg, &endptr); | ||
|
|
||
| if (endptr == NULL || *endptr != '\0' || timeout_s < 0) | ||
| errx(EXIT_FAILURE, "incorrect timeout value: \"%s\""); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
there is %s in format string. shall we add ``...", timeout_s); here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, I wonder why hasn't it been caught by the compiler, __attribute__((format(printf))) and/or -Wmissing-format-attribute are missing.
source/x509storeissuer.c
Outdated
| printf(": avg: %9.3lf us, median: %9.3lf us" | ||
| ", min: %9.3lf us @thread %3zu, max: %9.3lf us @thread %3zu" | ||
| ", stddev: %9.3lf us (%8.4lf%%)" | ||
| ", hits %9zu of %9zu (%8.4lf%%)" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the types are uint64_t the format string should %llu
681 ", hits %9llu of %9llu (%8.4lf%%)"
682 ", added certs: %llu\n",
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good catch, the proper format specifier for uint64_t is "%s" PRIu64, however.
| OSSL_TIME max_time; | ||
|
|
||
| int err = 0; | ||
| int error = 0; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If I rememer correctly the change was prompted by thread affinity which is gone. so perhaps we can drop this changeset from this PR too.
Interesting, does OpenBSD use vdso for |
If I understand vdso description right then OpenBSD uses very similar way to implement
this what I get for the main branch s found on github: This is what I get for the old branch with 0x3f value this what I get for 0x3ff this result is with 0x3ffff this is with value 0 |
|
Well, looking at these, I'd say it's almost definitely the case that |
Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
dee1a75 to
76a9d0a
Compare
76a9d0a to
61c0d21
Compare
Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
… function Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
…ration Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
…mmering the common counts array's cache line Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
…nt and report successful calls Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
…e store Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
…bosity level is DEBUG_STATS or higher Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
…the run Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
…t run matrix Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
61c0d21 to
45e4a5f
Compare
This patch set slightly updates the
x509storeissuertest to actually populate the store with certificates, and provides additional modes of operation and measurement data (when requested).Resolves: openssl/project#1529