Первоначально опубликовано 23 февраля 2014 г.
Должен признаться, мне потребовалось некоторое время, чтобы понять, что не так с кодом Apple:
static OSStatus SSLVerifySignedServerKeyExchange(SSLContext *ctx, bool isRsa, SSLBuffer signedParams, uint8_t *signature, UInt16 signatureLen) { OSStatus err; ... if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0) goto fail; if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0) goto fail; goto fail; if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0) goto fail; ... fail: SSLFreeBuffer(&signedHashes); SSLFreeBuffer(&hashCtx); return err; }
Потребовалось несколько секунд, чтобы он щелкнул — ни в одном из операторов if нет квадратных скобок, а это означает, что окончательный вызов проверки никогда не будет выполнен!
Я думаю, что мой мозг должен просто притворяться, что там есть скобки для встроенных операторов if, хотя на самом деле их нет. Я думаю, что я тоже был укушен этим раньше.
Я всегда стараюсь явно добавлять скобки ко всем своим операторам if. Да, это лишние два символа, но мы уже не в 80-х, когда лишние 2 байта действительно могут иметь значение. Кроме того, это предотвращает подобные вещи.
Ну что ж, думаю, мне лучше обновить все свои устройства сейчас.