summaryrefslogtreecommitdiff
path: root/src/gmrequest.c
diff options
context:
space:
mode:
authorJaakko Keränen <jaakko.keranen@iki.fi>2020-11-08 13:45:51 +0200
committerJaakko Keränen <jaakko.keranen@iki.fi>2020-11-08 13:45:51 +0200
commitbb53ff49396cae88836ff391fd20589a687ae83f (patch)
treeaadc25a24ed2e12809298791f4566d7e1ecfb770 /src/gmrequest.c
parentc0280998be065ab075581e46c52c6cc27e4b21a9 (diff)
Manually trusting a server certificate
Diffstat (limited to 'src/gmrequest.c')
-rw-r--r--src/gmrequest.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/gmrequest.c b/src/gmrequest.c
index e65847e1..32b71922 100644
--- a/src/gmrequest.c
+++ b/src/gmrequest.c
@@ -45,6 +45,7 @@ void init_GmResponse(iGmResponse *d) {
45 init_String(&d->meta); 45 init_String(&d->meta);
46 init_Block(&d->body, 0); 46 init_Block(&d->body, 0);
47 d->certFlags = 0; 47 d->certFlags = 0;
48 init_Block(&d->certFingerprint, 0);
48 iZap(d->certValidUntil); 49 iZap(d->certValidUntil);
49 init_String(&d->certSubject); 50 init_String(&d->certSubject);
50 iZap(d->when); 51 iZap(d->when);
@@ -55,6 +56,7 @@ void initCopy_GmResponse(iGmResponse *d, const iGmResponse *other) {
55 initCopy_String(&d->meta, &other->meta); 56 initCopy_String(&d->meta, &other->meta);
56 initCopy_Block(&d->body, &other->body); 57 initCopy_Block(&d->body, &other->body);
57 d->certFlags = other->certFlags; 58 d->certFlags = other->certFlags;
59 initCopy_Block(&d->certFingerprint, &other->certFingerprint);
58 d->certValidUntil = other->certValidUntil; 60 d->certValidUntil = other->certValidUntil;
59 initCopy_String(&d->certSubject, &other->certSubject); 61 initCopy_String(&d->certSubject, &other->certSubject);
60 d->when = other->when; 62 d->when = other->when;
@@ -63,6 +65,7 @@ void initCopy_GmResponse(iGmResponse *d, const iGmResponse *other) {
63void deinit_GmResponse(iGmResponse *d) { 65void deinit_GmResponse(iGmResponse *d) {
64 deinit_String(&d->certSubject); 66 deinit_String(&d->certSubject);
65 deinit_Block(&d->body); 67 deinit_Block(&d->body);
68 deinit_Block(&d->certFingerprint);
66 deinit_String(&d->meta); 69 deinit_String(&d->meta);
67} 70}
68 71
@@ -71,6 +74,7 @@ void clear_GmResponse(iGmResponse *d) {
71 clear_String(&d->meta); 74 clear_String(&d->meta);
72 clear_Block(&d->body); 75 clear_Block(&d->body);
73 d->certFlags = 0; 76 d->certFlags = 0;
77 clear_Block(&d->certFingerprint);
74 iZap(d->certValidUntil); 78 iZap(d->certValidUntil);
75 clear_String(&d->certSubject); 79 clear_String(&d->certSubject);
76 iZap(d->when); 80 iZap(d->when);
@@ -86,7 +90,8 @@ void serialize_GmResponse(const iGmResponse *d, iStream *outs) {
86 write32_Stream(outs, d->statusCode); 90 write32_Stream(outs, d->statusCode);
87 serialize_String(&d->meta, outs); 91 serialize_String(&d->meta, outs);
88 serialize_Block(&d->body, outs); 92 serialize_Block(&d->body, outs);
89 write32_Stream(outs, d->certFlags); 93 /* TODO: Add certificate fingerprint, but need to bump file version first. */
94 write32_Stream(outs, d->certFlags & ~haveFingerprint_GmCertFlag);
90 serialize_Date(&d->certValidUntil, outs); 95 serialize_Date(&d->certValidUntil, outs);
91 serialize_String(&d->certSubject, outs); 96 serialize_String(&d->certSubject, outs);
92 writeU64_Stream(outs, d->when.ts.tv_sec); 97 writeU64_Stream(outs, d->when.ts.tv_sec);
@@ -100,6 +105,7 @@ void deserialize_GmResponse(iGmResponse *d, iStream *ins) {
100 deserialize_Date(&d->certValidUntil, ins); 105 deserialize_Date(&d->certValidUntil, ins);
101 deserialize_String(&d->certSubject, ins); 106 deserialize_String(&d->certSubject, ins);
102 iZap(d->when); 107 iZap(d->when);
108 clear_Block(&d->certFingerprint);
103 if (version_Stream(ins) >= addedResponseTimestamps_FileVersion) { 109 if (version_Stream(ins) >= addedResponseTimestamps_FileVersion) {
104 d->when.ts.tv_sec = readU64_Stream(ins); 110 d->when.ts.tv_sec = readU64_Stream(ins);
105 } 111 }
@@ -138,6 +144,8 @@ static void checkServerCertificate_GmRequest_(iGmRequest *d) {
138 if (cert) { 144 if (cert) {
139 const iRangecc domain = range_String(hostName_Address(address_TlsRequest(d->req))); 145 const iRangecc domain = range_String(hostName_Address(address_TlsRequest(d->req)));
140 d->resp.certFlags |= available_GmCertFlag; 146 d->resp.certFlags |= available_GmCertFlag;
147 set_Block(&d->resp.certFingerprint, collect_Block(fingerprint_TlsCertificate(cert)));
148 d->resp.certFlags |= haveFingerprint_GmCertFlag;
141 if (!isExpired_TlsCertificate(cert)) { 149 if (!isExpired_TlsCertificate(cert)) {
142 d->resp.certFlags |= timeVerified_GmCertFlag; 150 d->resp.certFlags |= timeVerified_GmCertFlag;
143 } 151 }