static int CaviumRsaPrivateDecrypt(const byte* in, word32 inLen, byte* out, word32 outLen, RsaKey* key) { word32 requestId; word32 ret; word16 outSz = (word16)outLen; if (key == NULL || in == NULL || out == NULL || inLen != (word32)key->c_nSz) return -1; ret = CspPkcs1v15CrtDec(CAVIUM_BLOCKING, BT2, key->c_nSz, key->c_q, key->c_dQ, key->c_p, key->c_dP, key->c_u, (byte*)in, &outSz, out, &requestId, key->devId); if (ret != 0) { CYASSL_MSG("Cavium CRT Dec BT2 failed"); return -1; } ato16((const byte*)&outSz, &outSz); return outSz; }
// some clients still send sslv2 client hello void ProcessOldClientHello(input_buffer& input, SSL& ssl) { if (input.get_error() || input.get_remaining() < 2) { ssl.SetError(bad_input); return; } byte b0 = input[AUTO]; byte b1 = input[AUTO]; uint16 sz = ((b0 & 0x7f) << 8) | b1; if (sz > input.get_remaining()) { ssl.SetError(bad_input); return; } // hashHandShake manually const opaque* buffer = input.get_buffer() + input.get_current(); ssl.useHashes().use_MD5().update(buffer, sz); ssl.useHashes().use_SHA().update(buffer, sz); b1 = input[AUTO]; // does this value mean client_hello? ClientHello ch; ch.client_version_.major_ = input[AUTO]; ch.client_version_.minor_ = input[AUTO]; byte len[2]; len[0] = input[AUTO]; len[1] = input[AUTO]; ato16(len, ch.suite_len_); len[0] = input[AUTO]; len[1] = input[AUTO]; uint16 sessionLen; ato16(len, sessionLen); ch.id_len_ = sessionLen; len[0] = input[AUTO]; len[1] = input[AUTO]; uint16 randomLen; ato16(len, randomLen); if (input.get_error() || ch.suite_len_ > MAX_SUITE_SZ || ch.suite_len_ > input.get_remaining() || sessionLen > ID_LEN || randomLen > RAN_LEN) { ssl.SetError(bad_input); return; } int j = 0; for (uint16 i = 0; i < ch.suite_len_; i += 3) { byte first = input[AUTO]; if (first) // sslv2 type input.read(len, SUITE_LEN); // skip else { input.read(&ch.cipher_suites_[j], SUITE_LEN); j += SUITE_LEN; } } ch.suite_len_ = j; if (ch.id_len_) input.read(ch.session_id_, ch.id_len_); // id_len_ from sessionLen if (randomLen < RAN_LEN) memset(ch.random_, 0, RAN_LEN - randomLen); input.read(&ch.random_[RAN_LEN - randomLen], randomLen); ch.Process(input, ssl); }