Первоначально опубликовано 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 байта действительно могут иметь значение. Кроме того, это предотвращает подобные вещи.

Ну что ж, думаю, мне лучше обновить все свои устройства сейчас.