diff options
Diffstat (limited to 'src/gmrequest.c')
-rw-r--r-- | src/gmrequest.c | 10 |
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) { | |||
63 | void deinit_GmResponse(iGmResponse *d) { | 65 | void 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 | } |