| Index: patches.chromium/0016-send_client_verify_cleanup.patch
|
| diff --git a/patches.chromium/0016-send_client_verify_cleanup.patch b/patches.chromium/0016-send_client_verify_cleanup.patch
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6f728ed9214c7f51b4897d489ef072fab7a9d434
|
| --- /dev/null
|
| +++ b/patches.chromium/0016-send_client_verify_cleanup.patch
|
| @@ -0,0 +1,187 @@
|
| +diff --git android-openssl.orig/ssl/s3_clnt.c android-openssl/ssl/s3_clnt.c
|
| +index d6154c5..2b094c9 100644
|
| +--- android-openssl.orig/ssl/s3_clnt.c
|
| ++++ android-openssl/ssl/s3_clnt.c
|
| +@@ -3022,33 +3022,18 @@ int ssl3_send_client_verify(SSL *s)
|
| + unsigned char *p,*d;
|
| + unsigned char data[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];
|
| + EVP_PKEY *pkey;
|
| +- EVP_PKEY_CTX *pctx=NULL;
|
| ++ EVP_PKEY_CTX *pctx = NULL;
|
| + EVP_MD_CTX mctx;
|
| +- unsigned u=0;
|
| ++ unsigned signature_length = 0;
|
| + unsigned long n;
|
| +- int j;
|
| +
|
| + EVP_MD_CTX_init(&mctx);
|
| +
|
| + if (s->state == SSL3_ST_CW_CERT_VRFY_A)
|
| + {
|
| +- d=(unsigned char *)s->init_buf->data;
|
| +- p= &(d[4]);
|
| +- pkey=s->cert->key->privatekey;
|
| +-/* Create context from key and test if sha1 is allowed as digest */
|
| +- pctx = EVP_PKEY_CTX_new(pkey,NULL);
|
| +- EVP_PKEY_sign_init(pctx);
|
| +- if (EVP_PKEY_CTX_set_signature_md(pctx, EVP_sha1())>0)
|
| +- {
|
| +- if (TLS1_get_version(s) < TLS1_2_VERSION)
|
| +- s->method->ssl3_enc->cert_verify_mac(s,
|
| +- NID_sha1,
|
| +- &(data[MD5_DIGEST_LENGTH]));
|
| +- }
|
| +- else
|
| +- {
|
| +- ERR_clear_error();
|
| +- }
|
| ++ d = (unsigned char *)s->init_buf->data;
|
| ++ p = &(d[4]);
|
| ++ pkey = s->cert->key->privatekey;
|
| + /* For TLS v1.2 send signature algorithm and signature
|
| + * using agreed digest and cached handshake records.
|
| + */
|
| +@@ -3072,14 +3057,15 @@ int ssl3_send_client_verify(SSL *s)
|
| + #endif
|
| + if (!EVP_SignInit_ex(&mctx, md, NULL)
|
| + || !EVP_SignUpdate(&mctx, hdata, hdatalen)
|
| +- || !EVP_SignFinal(&mctx, p + 2, &u, pkey))
|
| ++ || !EVP_SignFinal(&mctx, p + 2,
|
| ++ &signature_length, pkey))
|
| + {
|
| + SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,
|
| + ERR_R_EVP_LIB);
|
| + goto err;
|
| + }
|
| +- s2n(u,p);
|
| +- n = u + 4;
|
| ++ s2n(signature_length, p);
|
| ++ n = signature_length + 4;
|
| + if (!ssl3_digest_cached_records(s))
|
| + goto err;
|
| + }
|
| +@@ -3087,78 +3073,80 @@ int ssl3_send_client_verify(SSL *s)
|
| + #ifndef OPENSSL_NO_RSA
|
| + if (pkey->type == EVP_PKEY_RSA)
|
| + {
|
| ++ s->method->ssl3_enc->cert_verify_mac(s, NID_md5, data);
|
| + s->method->ssl3_enc->cert_verify_mac(s,
|
| +- NID_md5,
|
| +- &(data[0]));
|
| ++ NID_sha1, &(data[MD5_DIGEST_LENGTH]));
|
| + if (RSA_sign(NID_md5_sha1, data,
|
| +- MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH,
|
| +- &(p[2]), &u, pkey->pkey.rsa) <= 0 )
|
| ++ MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH,
|
| ++ &(p[2]), &signature_length, pkey->pkey.rsa) <= 0)
|
| + {
|
| +- SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,ERR_R_RSA_LIB);
|
| ++ SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, ERR_R_RSA_LIB);
|
| + goto err;
|
| + }
|
| +- s2n(u,p);
|
| +- n=u+2;
|
| ++ s2n(signature_length, p);
|
| ++ n = signature_length + 2;
|
| + }
|
| + else
|
| + #endif
|
| + #ifndef OPENSSL_NO_DSA
|
| +- if (pkey->type == EVP_PKEY_DSA)
|
| ++ if (pkey->type == EVP_PKEY_DSA)
|
| + {
|
| +- if (!DSA_sign(pkey->save_type,
|
| +- &(data[MD5_DIGEST_LENGTH]),
|
| +- SHA_DIGEST_LENGTH,&(p[2]),
|
| +- (unsigned int *)&j,pkey->pkey.dsa))
|
| ++ s->method->ssl3_enc->cert_verify_mac(s, NID_sha1, data);
|
| ++ if (!DSA_sign(pkey->save_type, data,
|
| ++ SHA_DIGEST_LENGTH, &(p[2]),
|
| ++ &signature_length, pkey->pkey.dsa))
|
| + {
|
| +- SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,ERR_R_DSA_LIB);
|
| ++ SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, ERR_R_DSA_LIB);
|
| + goto err;
|
| + }
|
| +- s2n(j,p);
|
| +- n=j+2;
|
| ++ s2n(signature_length, p);
|
| ++ n = signature_length + 2;
|
| + }
|
| + else
|
| + #endif
|
| + #ifndef OPENSSL_NO_ECDSA
|
| +- if (pkey->type == EVP_PKEY_EC)
|
| ++ if (pkey->type == EVP_PKEY_EC)
|
| + {
|
| +- if (!ECDSA_sign(pkey->save_type,
|
| +- &(data[MD5_DIGEST_LENGTH]),
|
| +- SHA_DIGEST_LENGTH,&(p[2]),
|
| +- (unsigned int *)&j,pkey->pkey.ec))
|
| ++ s->method->ssl3_enc->cert_verify_mac(s, NID_sha1, data);
|
| ++ if (!ECDSA_sign(pkey->save_type, data,
|
| ++ SHA_DIGEST_LENGTH, &(p[2]),
|
| ++ &signature_length, pkey->pkey.ec))
|
| + {
|
| +- SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,
|
| +- ERR_R_ECDSA_LIB);
|
| ++ SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, ERR_R_ECDSA_LIB);
|
| + goto err;
|
| + }
|
| +- s2n(j,p);
|
| +- n=j+2;
|
| ++ s2n(signature_length, p);
|
| ++ n = signature_length + 2;
|
| + }
|
| + else
|
| + #endif
|
| + if (pkey->type == NID_id_GostR3410_94 || pkey->type == NID_id_GostR3410_2001)
|
| +- {
|
| +- unsigned char signbuf[64];
|
| +- int i;
|
| +- size_t sigsize=64;
|
| +- s->method->ssl3_enc->cert_verify_mac(s,
|
| +- NID_id_GostR3411_94,
|
| +- data);
|
| +- if (EVP_PKEY_sign(pctx, signbuf, &sigsize, data, 32) <= 0) {
|
| +- SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,
|
| +- ERR_R_INTERNAL_ERROR);
|
| +- goto err;
|
| +- }
|
| +- for (i=63,j=0; i>=0; j++, i--) {
|
| +- p[2+j]=signbuf[i];
|
| +- }
|
| +- s2n(j,p);
|
| +- n=j+2;
|
| +- }
|
| ++ {
|
| ++ unsigned char signbuf[64];
|
| ++ int i, j;
|
| ++ size_t sigsize=64;
|
| ++
|
| ++ s->method->ssl3_enc->cert_verify_mac(s,
|
| ++ NID_id_GostR3411_94,
|
| ++ data);
|
| ++ pctx = EVP_PKEY_CTX_new(pkey, NULL);
|
| ++ EVP_PKEY_sign_init(pctx);
|
| ++ if (EVP_PKEY_sign(pctx, signbuf, &sigsize, data, 32) <= 0) {
|
| ++ SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,
|
| ++ ERR_R_INTERNAL_ERROR);
|
| ++ goto err;
|
| ++ }
|
| ++ for (i=63,j=0; i>=0; j++, i--) {
|
| ++ p[2+j]=signbuf[i];
|
| ++ }
|
| ++ s2n(j,p);
|
| ++ n=j+2;
|
| ++ }
|
| + else
|
| +- {
|
| ++ {
|
| + SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,ERR_R_INTERNAL_ERROR);
|
| + goto err;
|
| +- }
|
| ++ }
|
| + *(d++)=SSL3_MT_CERTIFICATE_VERIFY;
|
| + l2n3(n,d);
|
| +
|
|
|