Merge branch 'master' into kazuho/ech
diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml
new file mode 100644
index 0000000..d541cd6
--- /dev/null
+++ b/.github/workflows/cifuzz.yml
@@ -0,0 +1,26 @@
+name: CIFuzz
+on: [pull_request]
+jobs:
+ Fuzzing:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Build Fuzzers
+ id: build
+ uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master
+ with:
+ oss-fuzz-project-name: 'picotls'
+ dry-run: false
+ language: c++
+ - name: Run Fuzzers
+ uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master
+ with:
+ oss-fuzz-project-name: 'picotls'
+ fuzz-seconds: 300
+ dry-run: false
+ language: c++
+ - name: Upload Crash
+ uses: actions/upload-artifact@v3
+ if: failure() && steps.build.outcome == 'success'
+ with:
+ name: artifacts
+ path: ./out/artifacts
diff --git a/include/picotls.h b/include/picotls.h
index 3d20d43..3332851 100644
--- a/include/picotls.h
+++ b/include/picotls.h
@@ -1145,6 +1145,7 @@
goto Exit; \
} while (0)
+int ptls_decode8(uint8_t *value, const uint8_t **src, const uint8_t *end);
int ptls_decode16(uint16_t *value, const uint8_t **src, const uint8_t *end);
int ptls_decode24(uint32_t *value, const uint8_t **src, const uint8_t *end);
int ptls_decode32(uint32_t *value, const uint8_t **src, const uint8_t *end);
diff --git a/lib/picotls.c b/lib/picotls.c
index f1face7..46d921c 100644
--- a/lib/picotls.c
+++ b/lib/picotls.c
@@ -910,6 +910,14 @@
ptls_decode_assert_block_close((src), end); \
} while (0)
+int ptls_decode8(uint8_t *value, const uint8_t **src, const uint8_t *end)
+{
+ if (*src == end)
+ return PTLS_ALERT_DECODE_ERROR;
+ *value = *(*src)++;
+ return 0;
+}
+
int ptls_decode16(uint16_t *value, const uint8_t **src, const uint8_t *end)
{
if (end - *src < 2)
@@ -2476,10 +2484,14 @@
}
}
- /* legacy_compression_method */
- if (src == end || *src++ != 0) {
- ret = PTLS_ALERT_ILLEGAL_PARAMETER;
- goto Exit;
+ { /* legacy_compression_method */
+ uint8_t method;
+ if ((ret = ptls_decode8(&method, &src, end)) != 0)
+ goto Exit;
+ if (method != 0) {
+ ret = PTLS_ALERT_ILLEGAL_PARAMETER;
+ goto Exit;
+ }
}
if (sh->is_retry_request)
@@ -3365,12 +3377,10 @@
int ret = 0;
ptls_decode_open_block(*src, end, 2, {
- if (*src == end) {
- ret = PTLS_ALERT_DECODE_ERROR;
- goto Exit;
- }
do {
- uint8_t type = *(*src)++;
+ uint8_t type;
+ if ((ret = ptls_decode8(&type, src, end)) != 0)
+ goto Exit;
ptls_decode_open_block(*src, end, 2, {
switch (type) {
case PTLS_SERVER_NAME_TYPE_HOSTNAME:
@@ -3582,11 +3592,10 @@
ch->cookie.ch1_hash = ptls_iovec_init(src, end - src);
src = end;
});
- if (src == end) {
- ret = PTLS_ALERT_DECODE_ERROR;
+ uint8_t sent_key_share;
+ if ((ret = ptls_decode8(&sent_key_share, &src, end)) != 0)
goto Exit;
- }
- switch (*src++) {
+ switch (sent_key_share) {
case 0:
assert(!ch->cookie.sent_key_share);
break;
@@ -3641,14 +3650,13 @@
} break;
case PTLS_EXTENSION_TYPE_PSK_KEY_EXCHANGE_MODES:
ptls_decode_block(src, end, 1, {
- if (src == end) {
- ret = PTLS_ALERT_DECODE_ERROR;
- goto Exit;
- }
- for (; src != end; ++src) {
- if (*src < sizeof(ch->psk.ke_modes) * 8)
- ch->psk.ke_modes |= 1u << *src;
- }
+ do {
+ uint8_t mode;
+ if ((ret = ptls_decode8(&mode, &src, end)) != 0)
+ goto Exit;
+ if (mode < sizeof(ch->psk.ke_modes) * 8)
+ ch->psk.ke_modes |= 1u << mode;
+ } while (src != end);
});
break;
case PTLS_EXTENSION_TYPE_EARLY_DATA:
diff --git a/picotls.xcodeproj/project.pbxproj b/picotls.xcodeproj/project.pbxproj
index d5657dd..ef65447 100644
--- a/picotls.xcodeproj/project.pbxproj
+++ b/picotls.xcodeproj/project.pbxproj
@@ -743,7 +743,7 @@
106530AA1D9985E0005B2C60 /* Project object */ = {
isa = PBXProject;
attributes = {
- LastUpgradeCheck = 0830;
+ LastUpgradeCheck = 1320;
ORGANIZATIONNAME = "DeNA Co., Ltd.";
TargetAttributes = {
106530CB1D9B3D45005B2C60 = {