| This Source Code Form is subject to the terms of the Mozilla Public |
| # License, v. 2.0. If a copy of the MPL was not distributed with this |
| # file, You can obtain one at http://mozilla.org/MPL/2.0/. |
| |
| SSL's Buffers: enumerated and explained. |
| |
| --------------------------------------------------------------------------- |
| incoming: |
| |
| gs = ss->gather |
| hs = ss->ssl3->hs |
| |
| gs->inbuf SSL3 only: incoming (encrypted) ssl records are placed here, |
| and then decrypted (or copied) to gs->buf. |
| |
| gs->buf SSL2: incoming SSL records are put here, and then decrypted |
| in place. |
| SSL3: ssl3_HandleHandshake puts decrypted ssl records here. |
| |
| hs.msg_body (SSL3 only) When an incoming handshake message spans more |
| than one ssl record, the first part(s) of it are accumulated |
| here until it all arrives. |
| |
| hs.msgState (SSL3 only) an alternative set of pointers/lengths for gs->buf. |
| Used only when a handleHandshake function returns SECWouldBlock. |
| ssl3_HandleHandshake remembers how far it previously got by |
| using these pointers instead of gs->buf when it is called |
| after a previous SECWouldBlock return. |
| |
| --------------------------------------------------------------------------- |
| outgoing: |
| |
| sec = ss->sec |
| ci = ss->sec->ci /* connect info */ |
| |
| ci->sendBuf Outgoing handshake messages are appended to this buffer. |
| This buffer will then be sent as a single SSL record. |
| |
| sec->writeBuf outgoing ssl records are constructed here and encrypted in |
| place before being written or copied to pendingBuf. |
| |
| ss->pendingBuf contains outgoing ciphertext that was saved after a write |
| attempt to the socket failed, e.g. EWouldBlock. |
| Generally empty with blocking sockets (should be no incomplete |
| writes). |
| |
| ss->saveBuf Used only by socks code. Intended to be used to buffer |
| outgoing data until a socks handshake completes. However, |
| this buffer is always empty. There is no code to put |
| anything into it. |
| |
| --------------------------------------------------------------------------- |
| |
| SECWouldBlock means that the function cannot make progress because it is |
| waiting for some event OTHER THAN socket I/O completion (e.g. waiting for |
| user dialog to finish). It is not the same as EWOULDBLOCK. |
| |
| --------------------------------------------------------------------------- |
| |
| Rank (order) of locks |
| |
| recvLock ->\ firstHandshake -> recvbuf -> ssl3Handshake -> xmitbuf -> "spec" |
| sendLock ->/ |
| |
| crypto and hash Data that must be protected while turning plaintext into |
| ciphertext: |
| |
| SSL2: (in ssl2_Send*) |
| sec->hash* |
| sec->hashcx (ptr and data) |
| sec->enc |
| sec->writecx* (ptr and content) |
| sec->sendSecret*(ptr and content) |
| sec->sendSequence locked by xmitBufLock |
| sec->blockSize |
| sec->writeBuf* (ptr & content) locked by xmitBufLock |
| "in" locked by xmitBufLock |
| |
| SSl3: (in ssl3_SendPlainText) |
| ss->ssl3 (the pointer) |
| ss->ssl3->current_write* (the pointer and the data in the spec |
| and any data referenced by the spec. |
| |
| ss->sec->isServer |
| ss->sec->writebuf* (ptr & content) locked by xmitBufLock |
| "buf" locked by xmitBufLock |
| |
| crypto and hash data that must be protected while turning ciphertext into |
| plaintext: |
| |
| SSL2: (in ssl2_GatherData) |
| gs->* (locked by recvBufLock ) |
| sec->dec |
| sec->readcx |
| sec->hash* (ptr and data) |
| sec->hashcx (ptr and data) |
| |
| SSL3: (in ssl3_HandleRecord ) |
| ssl3->current_read* (the pointer and all data refernced) |
| ss->sec->isServer |
| |
| |
| Data that must be protected while being used by a "writer": |
| |
| ss->pendingBuf.* |
| ss->saveBuf.* (which is dead) |
| |
| in ssl3_sendPlainText |
| |
| ss->ssl3->current_write-> (spec) |
| ss->sec->writeBuf.* |
| ss->sec->isServer |
| |
| in SendBlock |
| |
| ss->sec->hash->length |
| ss->sec->blockSize |
| ss->sec->writeBuf.* |
| ss->sec->sendSecret |
| ss->sec->sendSequence |
| ss->sec->writecx * |
| ss->pendingBuf |
| |
| -------------------------------------------------------------------------- |
| |
| Data variables (not const) protected by the "sslGlobalDataLock". |
| Note, this really should be a reader/writer lock. |
| |
| allowedByPolicy sslcon.c |
| maybeAllowedByPolicy sslcon.c |
| chosenPreference sslcon.c |
| policyWasSet sslcon.c |
| |
| cipherSuites[] ssl3con.c |