Skip to content

Commit 90efade

Browse files
committed
OCSP cb test
- Add tls 1.2 tests - Add cert chain test
1 parent aa0dce6 commit 90efade

File tree

5 files changed

+98
-64
lines changed

5 files changed

+98
-64
lines changed

tests/api.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51269,7 +51269,7 @@ TEST_DECL(test_wc_RsaPSS_DigitalSignVerify),
5126951269
TEST_DECL(test_ocsp_basic_verify),
5127051270
TEST_DECL(test_ocsp_response_parsing),
5127151271
TEST_DECL(test_ocsp_certid_enc_dec),
51272-
TEST_DECL(test_ocsp_tls13_cert_cb),
51272+
TEST_DECL(test_ocsp_tls_cert_cb),
5127351273
TEST_DECL(test_tls12_unexpected_ccs),
5127451274
TEST_DECL(test_tls13_unexpected_ccs),
5127551275
TEST_DECL(test_tls12_curve_intersection),

tests/api/create_ocsp_test_blobs.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -406,8 +406,8 @@ def create_bad_response(rd: dict) -> bytes:
406406
'responder_by_name': True,
407407
'responses': [
408408
{
409-
'issuer_cert': WOLFSSL_OCSP_CERT_PATH + 'root-ca-cert.pem',
410-
'serial': 0x01,
409+
'issuer_cert': WOLFSSL_OCSP_CERT_PATH + 'intermediate1-ca-cert.pem',
410+
'serial': 0x05,
411411
'status': CERT_GOOD
412412
}
413413
],

tests/api/test_ocsp.c

Lines changed: 64 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -663,22 +663,31 @@ int test_ocsp_certid_enc_dec(void)
663663
defined(WOLFSSL_TLS13) && defined(WOLFSSL_CERT_SETUP_CB) && \
664664
defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && !defined(NO_RSA)
665665

666+
static byte test_ocsp_tls_cert_cb_chain;
666667
/* --- certificate-selection callback ----------------------------------- */
667-
static int test_ocsp_tls13_cert_cb_cert_cb(WOLFSSL* ssl, void* arg)
668+
static int test_ocsp_tls_cert_cb_cert_cb(WOLFSSL* ssl, void* arg)
668669
{
669670
(void)arg;
670-
if (wolfSSL_use_certificate_file(ssl,
671-
"./certs/ocsp/intermediate1-ca-cert.pem", WOLFSSL_FILETYPE_PEM)
672-
!= WOLFSSL_SUCCESS)
673-
return 0;
671+
if (test_ocsp_tls_cert_cb_chain) {
672+
if (wolfSSL_use_certificate_chain_file(ssl,
673+
"./certs/ocsp/server1-cert.pem")
674+
!= WOLFSSL_SUCCESS)
675+
return 0;
676+
}
677+
else {
678+
if (wolfSSL_use_certificate_file(ssl,
679+
"./certs/ocsp/server1-cert.pem", WOLFSSL_FILETYPE_PEM)
680+
!= WOLFSSL_SUCCESS)
681+
return 0;
682+
}
674683
if (wolfSSL_use_PrivateKey_file(ssl,
675-
"./certs/ocsp/intermediate1-ca-key.pem", WOLFSSL_FILETYPE_PEM)
684+
"./certs/ocsp/server1-key.pem", WOLFSSL_FILETYPE_PEM)
676685
!= WOLFSSL_SUCCESS)
677686
return 0;
678687
return 1; /* success */
679688
}
680689

681-
static int test_ocsp_tls13_cert_cb_status_cb(WOLFSSL* ssl, void* ioCtx)
690+
static int test_ocsp_tls_cert_cb_status_cb(WOLFSSL* ssl, void* ioCtx)
682691
{
683692
byte* ocsp_resp = NULL;
684693
(void)ioCtx;
@@ -694,18 +703,20 @@ static int test_ocsp_tls13_cert_cb_status_cb(WOLFSSL* ssl, void* ioCtx)
694703
return WOLFSSL_OCSP_STATUS_CB_OK;
695704
}
696705

697-
static int test_ocsp_tls13_cert_cb_verify_cb(int preverify,
706+
static int test_ocsp_tls_cert_cb_verify_cb(int preverify,
698707
WOLFSSL_X509_STORE_CTX* store)
699708
{
700709
int ret = 0;
701710
int err = wolfSSL_X509_STORE_CTX_get_error(store);
702711

703712
if (preverify == 1)
704713
return 1;
705-
if (err == WC_NO_ERR_TRACE(ASN_NO_SIGNER_E)
714+
if (err == WC_NO_ERR_TRACE(ASN_NO_SIGNER_E) ||
715+
err == WC_NO_ERR_TRACE(ASN_SELF_SIGNED_E)
706716
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
707717
defined(HAVE_WEBSERVER) || defined(HAVE_MEMCACHED)
708718
|| err == WOLFSSL_X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY
719+
|| err == WOLFSSL_X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT
709720
#endif
710721
) {
711722
int idx = wolfSSL_X509_STORE_CTX_get_error_depth(store);
@@ -726,6 +737,11 @@ static int test_ocsp_tls13_cert_cb_verify_cb(int preverify,
726737
wolfSSL_CertManagerLoadCA(cm, "./certs/ocsp/root-ca-cert.pem", NULL)
727738
!= WOLFSSL_SUCCESS)
728739
ret = 0;
740+
/* If verifying leaf cert then we need to load the intermediate CA */
741+
if (ret == 1 && idx == 0 &&
742+
wolfSSL_CertManagerLoadCA(cm, "./certs/ocsp/intermediate1-ca-cert.pem", NULL)
743+
!= WOLFSSL_SUCCESS)
744+
ret = 0;
729745

730746
/* Verify cert with CA */
731747
if (ret == 1) {
@@ -735,18 +751,22 @@ static int test_ocsp_tls13_cert_cb_verify_cb(int preverify,
735751
if (ret == 1 && wc_ParseCert(&cert, CERT_TYPE, VERIFY, cm) != 0)
736752
ret = 0;
737753

738-
/* Verify OCSP with CA */
739-
if (ret == 1 && (ocspStaple == NULL || ocspStaple->buffer == NULL ||
740-
ocspStaple->length == 0))
741-
ret = 0;
742-
if (ret == 1 && wc_InitOCSP(&ocsp, cm) != 0)
743-
ret = 0;
744-
if (ret == 1)
745-
ocspInit = 1;
746-
if (ret == 1 &&
747-
wc_CheckCertOcspResponse(&ocsp, &cert, ocspStaple->buffer,
748-
ocspStaple->length, NULL) != 0)
749-
ret = 0;
754+
/* In this test we only expect a staple on the leaf cert */
755+
if (idx == 0 && (wolfSSL_version(ssl) == TLS1_3_VERSION ||
756+
wolfSSL_version(ssl) == DTLS1_3_VERSION)) {
757+
/* Verify OCSP with CA */
758+
if (ret == 1 && (ocspStaple == NULL || ocspStaple->buffer == NULL ||
759+
ocspStaple->length == 0))
760+
ret = 0;
761+
if (ret == 1 && wc_InitOCSP(&ocsp, cm) != 0)
762+
ret = 0;
763+
if (ret == 1)
764+
ocspInit = 1;
765+
if (ret == 1 &&
766+
wc_CheckCertOcspResponse(&ocsp, &cert, ocspStaple->buffer,
767+
ocspStaple->length, NULL) != 0)
768+
ret = 0;
769+
}
750770

751771
if (ocspInit)
752772
wc_FreeOCSP(&ocsp);
@@ -757,30 +777,42 @@ static int test_ocsp_tls13_cert_cb_verify_cb(int preverify,
757777
return ret;
758778
}
759779

760-
static int test_ocsp_tls13_cert_cb_ctx_ready(WOLFSSL_CTX* ctx)
780+
static int test_ocsp_tls_cert_cb_ctx_ready(WOLFSSL_CTX* ctx)
761781
{
762782
/* server: dynamic cert */
763-
wolfSSL_CTX_set_cert_cb(ctx, test_ocsp_tls13_cert_cb_cert_cb, NULL);
783+
wolfSSL_CTX_set_cert_cb(ctx, test_ocsp_tls_cert_cb_cert_cb, NULL);
764784
return TEST_SUCCESS;
765785
}
766786

767787
/* --- very small OCSP-status callback ---------------------------------- */
768788
/* no status callback path - context struct not needed */
769789

770790
/* --- the actual test case --------------------------------------------- */
771-
int test_ocsp_tls13_cert_cb(void)
791+
int test_ocsp_tls_cert_cb(void)
772792
{
773793
EXPECT_DECLS;
774794
size_t i;
775795
struct {
776796
method_provider client_meth;
777797
method_provider server_meth;
778798
const char* tls_version;
799+
byte chain:1;
779800
} params[] = {
801+
/* TODO Remove WOLFSSL_ALT_CERT_CHAINS limitation */
802+
#ifndef WOLFSSL_ALT_CERT_CHAINS
803+
{ wolfTLSv1_2_client_method, wolfTLSv1_2_server_method, "TLSv1_2", 1 },
804+
/* TODO
805+
* Doesn't work currently because the CA is not loaded. When the server
806+
* send the chain then the client loads the CA certs allowing the OCSP
807+
* check to pass */
808+
// { wolfTLSv1_2_client_method, wolfTLSv1_2_server_method, "TLSv1_2", 0 },
809+
#endif
780810
#if defined(WOLFSSL_TLS13)
781-
{ wolfTLSv1_3_client_method, wolfTLSv1_3_server_method, "TLSv1_3" },
811+
{ wolfTLSv1_3_client_method, wolfTLSv1_3_server_method, "TLSv1_3", 1 },
812+
{ wolfTLSv1_3_client_method, wolfTLSv1_3_server_method, "TLSv1_3", 0 },
782813
#ifdef WOLFSSL_DTLS13
783-
{ wolfDTLSv1_3_client_method, wolfDTLSv1_3_server_method, "DTLSv1_3" },
814+
{ wolfDTLSv1_3_client_method, wolfDTLSv1_3_server_method, "DTLSv1_3", 1 },
815+
{ wolfDTLSv1_3_client_method, wolfDTLSv1_3_server_method, "DTLSv1_3", 0 },
784816
#endif
785817
#endif
786818
};
@@ -801,7 +833,9 @@ int test_ocsp_tls13_cert_cb(void)
801833
test_ctx.c_cb.method = params[i].client_meth;
802834
test_ctx.s_cb.method = params[i].server_meth;
803835

804-
test_ctx.s_cb.ctx_ready = test_ocsp_tls13_cert_cb_ctx_ready;
836+
test_ocsp_tls_cert_cb_chain = params[i].chain;
837+
838+
test_ctx.s_cb.ctx_ready = test_ocsp_tls_cert_cb_ctx_ready;
805839

806840
ExpectIntEQ(test_ssl_memio_setup(&test_ctx), TEST_SUCCESS);
807841

@@ -813,11 +847,11 @@ int test_ocsp_tls13_cert_cb(void)
813847
/* turn on OCSP stapling on the server side */
814848
ExpectIntEQ(wolfSSL_CTX_EnableOCSPStapling(test_ctx.s_ctx), WOLFSSL_SUCCESS);
815849
ExpectIntEQ(wolfSSL_CTX_set_tlsext_status_cb(test_ctx.s_ctx,
816-
test_ocsp_tls13_cert_cb_status_cb), WOLFSSL_SUCCESS);
850+
test_ocsp_tls_cert_cb_status_cb), WOLFSSL_SUCCESS);
817851

818852
/* client: request stapling */
819853
wolfSSL_set_verify(test_ctx.c_ssl, WOLFSSL_VERIFY_DEFAULT,
820-
test_ocsp_tls13_cert_cb_verify_cb);
854+
test_ocsp_tls_cert_cb_verify_cb);
821855
/* No way to get ssl from the store without OPENSSL_EXTRA */
822856
wolfSSL_SetCertCbCtx(test_ctx.c_ssl, test_ctx.c_ssl);
823857
ExpectIntEQ(wolfSSL_CTX_EnableOCSPStapling(test_ctx.c_ctx), WOLFSSL_SUCCESS);
@@ -834,7 +868,7 @@ int test_ocsp_tls13_cert_cb(void)
834868
}
835869

836870
#else /* feature guards */
837-
int test_ocsp_tls13_cert_cb(void)
871+
int test_ocsp_tls_cert_cb(void)
838872
{
839873
return TEST_SKIPPED;
840874
}

tests/api/test_ocsp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@ int test_ocsp_certid_enc_dec(void);
2626
int test_ocsp_status_callback(void);
2727
int test_ocsp_basic_verify(void);
2828
int test_ocsp_response_parsing(void);
29-
int test_ocsp_tls13_cert_cb(void);
29+
int test_ocsp_tls_cert_cb(void);
3030
#endif /* WOLFSSL_TEST_OCSP_H */
3131

tests/api/test_ocsp_test_blobs.h

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -659,37 +659,37 @@ unsigned char resp_server1_cert[] = {
659659
0x72, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
660660
0x0d, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6e, 0x66, 0x6f, 0x40, 0x77,
661661
0x6f, 0x6c, 0x66, 0x73, 0x73, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x18, 0x0f,
662-
0x32, 0x30, 0x32, 0x35, 0x30, 0x38, 0x31, 0x37, 0x31, 0x35, 0x35, 0x37,
663-
0x35, 0x30, 0x5a, 0x30, 0x4f, 0x30, 0x4d, 0x30, 0x38, 0x30, 0x07, 0x06,
664-
0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x04, 0x14, 0x44, 0xa8, 0xdb, 0xd1,
665-
0xbc, 0x97, 0x0a, 0x83, 0x3b, 0x5b, 0x31, 0x9a, 0x4c, 0xb8, 0xd2, 0x52,
666-
0x37, 0x15, 0x8a, 0x88, 0x04, 0x14, 0x73, 0xb0, 0x1c, 0xa4, 0x2f, 0x82,
667-
0xcb, 0xcf, 0x47, 0xa5, 0x38, 0xd7, 0xb0, 0x04, 0x82, 0x3a, 0x7e, 0x72,
668-
0x15, 0x21, 0x02, 0x01, 0x01, 0x80, 0x00, 0x18, 0x0f, 0x32, 0x30, 0x32,
669-
0x35, 0x30, 0x38, 0x31, 0x37, 0x31, 0x35, 0x35, 0x37, 0x35, 0x30, 0x5a,
662+
0x32, 0x30, 0x32, 0x35, 0x30, 0x38, 0x32, 0x38, 0x31, 0x37, 0x30, 0x34,
663+
0x30, 0x34, 0x5a, 0x30, 0x4f, 0x30, 0x4d, 0x30, 0x38, 0x30, 0x07, 0x06,
664+
0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x04, 0x14, 0x71, 0x4d, 0x82, 0x23,
665+
0x40, 0x59, 0xc0, 0x96, 0xa1, 0x37, 0x43, 0xfa, 0x31, 0xdb, 0xba, 0xb1,
666+
0x43, 0x18, 0xda, 0x04, 0x04, 0x14, 0x83, 0xc6, 0x3a, 0x89, 0x2c, 0x81,
667+
0xf4, 0x02, 0xd7, 0x9d, 0x4c, 0xe2, 0x2a, 0xc0, 0x71, 0x82, 0x64, 0x44,
668+
0xda, 0x0e, 0x02, 0x01, 0x05, 0x80, 0x00, 0x18, 0x0f, 0x32, 0x30, 0x32,
669+
0x35, 0x30, 0x38, 0x32, 0x38, 0x31, 0x37, 0x30, 0x34, 0x30, 0x34, 0x5a,
670670
0x30, 0x0b, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
671-
0x0b, 0x03, 0x82, 0x01, 0x01, 0x00, 0x0b, 0xc9, 0x6c, 0x40, 0xd9, 0xb2,
672-
0xc7, 0xf3, 0xdc, 0xb5, 0x22, 0x56, 0xb3, 0x33, 0x45, 0x27, 0xfc, 0xb2,
673-
0x0d, 0x68, 0x93, 0x05, 0x08, 0xa5, 0x66, 0x05, 0xe7, 0x65, 0xc2, 0x50,
674-
0x2c, 0x7a, 0x0b, 0x61, 0xae, 0xab, 0x2c, 0x22, 0xf4, 0x79, 0xf6, 0xa5,
675-
0x6f, 0xe9, 0x6b, 0x2c, 0x22, 0xb2, 0x91, 0x38, 0x89, 0x41, 0x32, 0x36,
676-
0xd6, 0xd1, 0x16, 0x53, 0xec, 0xa0, 0xfd, 0xd8, 0xae, 0xf0, 0x3f, 0xdd,
677-
0x49, 0x67, 0x69, 0xd3, 0xf6, 0xe4, 0xa3, 0x79, 0x99, 0xe3, 0x41, 0xc3,
678-
0x0c, 0xd6, 0xa5, 0x60, 0x18, 0x94, 0x0a, 0x29, 0xcc, 0x44, 0x7a, 0x7d,
679-
0xad, 0xd8, 0x65, 0x01, 0xff, 0x8e, 0x39, 0x4e, 0x73, 0xfb, 0x76, 0x3b,
680-
0x6e, 0xe6, 0xf1, 0xf3, 0xf6, 0x2f, 0x8e, 0x1f, 0x4a, 0xc3, 0xce, 0x03,
681-
0x0d, 0x15, 0xf7, 0xb9, 0x3c, 0xcc, 0xf8, 0xa5, 0x74, 0x10, 0xdb, 0x62,
682-
0x1d, 0x26, 0xc9, 0xa7, 0xe8, 0x01, 0xd3, 0x26, 0x17, 0x4b, 0xe5, 0xbd,
683-
0xb9, 0x4d, 0xe4, 0x73, 0x1d, 0xde, 0x30, 0x0b, 0x8d, 0xda, 0x58, 0x00,
684-
0x8e, 0x4b, 0x2f, 0xeb, 0x44, 0x8d, 0x7c, 0xe7, 0x56, 0x25, 0x79, 0x10,
685-
0xf4, 0xde, 0x65, 0x26, 0x6a, 0xbf, 0x3b, 0x41, 0x66, 0xae, 0x4e, 0xc2,
686-
0xc1, 0x23, 0xea, 0x7c, 0x7b, 0x75, 0x79, 0x9f, 0x85, 0x69, 0x24, 0x74,
687-
0x92, 0x4b, 0x52, 0x30, 0xa7, 0x85, 0x03, 0x04, 0x96, 0x5f, 0x71, 0xe3,
688-
0xf2, 0xb7, 0x82, 0xf4, 0x57, 0x98, 0x32, 0xb5, 0x00, 0xfe, 0xdf, 0x98,
689-
0xff, 0x70, 0x61, 0x74, 0x22, 0x0f, 0x38, 0x3b, 0x4a, 0xdc, 0x89, 0xaf,
690-
0x2c, 0x72, 0x8c, 0x85, 0x77, 0xdb, 0x5d, 0x96, 0xa8, 0x80, 0x23, 0x7f,
691-
0x6f, 0x91, 0x97, 0x76, 0xeb, 0xfd, 0x7f, 0x09, 0x48, 0xef, 0x3e, 0x1f,
692-
0x4a, 0xb3, 0xdc, 0x03, 0xfa, 0x4b, 0xc5, 0x6e, 0xb0, 0x1b, 0xa0, 0x82,
671+
0x0b, 0x03, 0x82, 0x01, 0x01, 0x00, 0x10, 0xc2, 0xd8, 0x97, 0x9b, 0x4c,
672+
0x47, 0xcf, 0x54, 0x54, 0x7f, 0xcf, 0xc2, 0xd9, 0x0a, 0xe7, 0x99, 0x00,
673+
0x72, 0xda, 0xb3, 0xc8, 0x3e, 0x0e, 0xe8, 0xf4, 0xe5, 0x7a, 0x77, 0x67,
674+
0xc1, 0xcc, 0x8c, 0x44, 0x40, 0x84, 0x3d, 0xad, 0x39, 0x90, 0x21, 0xae,
675+
0xd3, 0xb8, 0x46, 0x48, 0xe0, 0x99, 0xbc, 0xb2, 0xb4, 0xd6, 0x1a, 0xf7,
676+
0x5a, 0x69, 0xd2, 0xc2, 0xf3, 0x5b, 0x1d, 0xdc, 0xc1, 0x96, 0x8d, 0x5c,
677+
0x94, 0xfb, 0xff, 0x84, 0xe0, 0xd1, 0x6b, 0xd9, 0xeb, 0x08, 0xb3, 0xe4,
678+
0xb8, 0xa5, 0x06, 0x52, 0xd6, 0x3c, 0xea, 0x0a, 0x2e, 0xb7, 0xb7, 0x24,
679+
0x41, 0x3d, 0xb5, 0xea, 0x7f, 0x4a, 0xad, 0x35, 0x05, 0x56, 0xd1, 0xa2,
680+
0xfc, 0x64, 0x2e, 0x2f, 0xc4, 0x81, 0x6e, 0x9c, 0x9a, 0x63, 0x67, 0x82,
681+
0xde, 0x7e, 0x4a, 0x9e, 0x10, 0xb1, 0xe5, 0xc2, 0xfc, 0x00, 0xd5, 0x09,
682+
0x85, 0x4e, 0x62, 0xf6, 0x18, 0xd5, 0x8e, 0x76, 0xcf, 0xbc, 0xc2, 0x2a,
683+
0xb2, 0x68, 0x8a, 0x06, 0xcb, 0x52, 0x98, 0xc1, 0x5a, 0xf0, 0xca, 0xb2,
684+
0x16, 0x65, 0x47, 0xf4, 0xe6, 0xe6, 0x0b, 0x02, 0x3e, 0x45, 0xb8, 0x72,
685+
0x19, 0xe4, 0x57, 0xe6, 0xbb, 0x7c, 0xcc, 0x0f, 0xc0, 0xeb, 0xaa, 0x60,
686+
0x97, 0x7f, 0x95, 0x6e, 0x80, 0xe2, 0x14, 0x4f, 0x22, 0xfc, 0x8d, 0xfa,
687+
0xaa, 0x67, 0xcc, 0xe9, 0x4d, 0x82, 0xf4, 0x25, 0x8b, 0xd1, 0x1e, 0x80,
688+
0x19, 0x4c, 0x81, 0xd9, 0x55, 0x21, 0x83, 0xbe, 0xb1, 0xca, 0x23, 0x2e,
689+
0xcc, 0xcb, 0xf0, 0xf3, 0xb2, 0xb2, 0x5c, 0xe3, 0x05, 0x8d, 0xf2, 0x75,
690+
0x4d, 0xb3, 0x6f, 0x6a, 0xc7, 0x9b, 0xb6, 0x22, 0x03, 0x6c, 0x5e, 0x0d,
691+
0x78, 0x15, 0x5c, 0xe5, 0xaf, 0x25, 0xc8, 0xc5, 0x08, 0xec, 0x64, 0xf1,
692+
0x0b, 0x60, 0x2e, 0xd0, 0x8d, 0x75, 0x70, 0xfd, 0x12, 0x28, 0xa0, 0x82,
693693
0x04, 0xc6, 0x30, 0x82, 0x04, 0xc2, 0x30, 0x82, 0x04, 0xbe, 0x30, 0x82,
694694
0x03, 0xa6, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x04, 0x30, 0x0d,
695695
0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,

0 commit comments

Comments
 (0)