Make sure not to read beyond end of buffer
[oweals/openssl.git] / crypto / pkcs12 / p12_npas.c
index a549433eebb93134e0cb41c82d5a2c8a064defab..48eacc5c49c42f73ee9e4aed32eb8da5ed7960ba 100644 (file)
@@ -77,28 +77,26 @@ static int alg_get(X509_ALGOR *alg, int *pnid, int *piter, int *psaltlen);
 
 int PKCS12_newpass(PKCS12 *p12, char *oldpass, char *newpass)
 {
+       /* Check for NULL PKCS12 structure */
 
-/* Check for NULL PKCS12 structure */
-
-if(!p12) {
-       PKCS12err(PKCS12_F_PKCS12_NEWPASS,PKCS12_R_INVALID_NULL_PKCS12_POINTER);
-       return 0;
-}
-
-/* Check the mac */
-
-if (!PKCS12_verify_mac(p12, oldpass, -1)) {
-       PKCS12err(PKCS12_F_PKCS12_NEWPASS,PKCS12_R_MAC_VERIFY_FAILURE);
-       return 0;
-}
+       if(!p12) {
+               PKCS12err(PKCS12_F_PKCS12_NEWPASS,PKCS12_R_INVALID_NULL_PKCS12_POINTER);
+               return 0;
+       }
 
-if (!newpass_p12(p12, oldpass, newpass)) {
-       PKCS12err(PKCS12_F_PKCS12_NEWPASS,PKCS12_R_PARSE_ERROR);
-       return 0;
-}
+       /* Check the mac */
+       
+       if (!PKCS12_verify_mac(p12, oldpass, -1)) {
+               PKCS12err(PKCS12_F_PKCS12_NEWPASS,PKCS12_R_MAC_VERIFY_FAILURE);
+               return 0;
+       }
 
-return 1;
+       if (!newpass_p12(p12, oldpass, newpass)) {
+               PKCS12err(PKCS12_F_PKCS12_NEWPASS,PKCS12_R_PARSE_ERROR);
+               return 0;
+       }
 
+       return 1;
 }
 
 /* Parse the outer PKCS#12 structure */
@@ -107,7 +105,7 @@ static int newpass_p12(PKCS12 *p12, char *oldpass, char *newpass)
 {
        STACK_OF(PKCS7) *asafes, *newsafes;
        STACK_OF(PKCS12_SAFEBAG) *bags;
-       int i, bagnid, pbe_nid, pbe_iter, pbe_saltlen;
+       int i, bagnid, pbe_nid = 0, pbe_iter = 0, pbe_saltlen = 0;
        PKCS7 *p7, *p7new;
        ASN1_OCTET_STRING *p12_data_tmp = NULL, *macnew = NULL;
        unsigned char mac[EVP_MAX_MD_SIZE];
@@ -206,7 +204,8 @@ static int newpass_bag(PKCS12_SAFEBAG *bag, char *oldpass, char *newpass)
 static int alg_get(X509_ALGOR *alg, int *pnid, int *piter, int *psaltlen)
 {
         PBEPARAM *pbe;
-        unsigned char *p;
+        const unsigned char *p;
+
         p = alg->parameter->value.sequence->data;
         pbe = d2i_PBEPARAM(NULL, &p, alg->parameter->value.sequence->length);
         *pnid = OBJ_obj2nid(alg->algorithm);