PORT_Assert( ssl_Have1stHandshakeLock(ss) );
PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
ssl2_SignResponse(sslSocket *ss,	     SECKEYPrivateKey *key,	     SECItem *response){    SGNContext *     sgn = NULL;    PRUint8 *        challenge;    unsigned int     len;    SECStatus        rv		= SECFailure;        PORT_Assert( ssl_Have1stHandshakeLock(ss) );    challenge = ss->sec.ci.serverChallenge;    len = ss->sec.ci.serverChallengeLen;        /* Sign the expected data... */    sgn = SGN_NewContext(SEC_OID_PKCS1_MD5_WITH_RSA_ENCRYPTION,key);    if (!sgn)     	goto done;    rv = SGN_Begin(sgn);    if (rv != SECSuccess)     	goto done;    rv = SGN_Update(sgn, ss->sec.ci.readKey, ss->sec.ci.keySize);    if (rv != SECSuccess)     	goto done;    rv = SGN_Update(sgn, ss->sec.ci.writeKey, ss->sec.ci.keySize);    if (rv != SECSuccess)     	goto done;    rv = SGN_Update(sgn, challenge, len);    if (rv != SECSuccess)     	goto done;    rv = SGN_Update(sgn, ss->sec.peerCert->derCert.data,                          ss->sec.peerCert->derCert.len);    if (rv != SECSuccess)     	goto done;    rv = SGN_End(sgn, response);    if (rv != SECSuccess)     	goto done;done:    SGN_DestroyContext(sgn, PR_TRUE);    return rv == SECSuccess ? SECSuccess : SECFailure;}