]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
PKCS #12 generation, finaly can interoperate with openssl even in the encrypted case.
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Thu, 26 Jun 2003 19:01:34 +0000 (19:01 +0000)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Thu, 26 Jun 2003 19:01:34 +0000 (19:01 +0000)
lib/x509/pkcs12.c
lib/x509/privkey_pkcs8.c

index 54c87b2c7626e2fe8723d56b72365e05bdb7d278..fcee84af83c757c9a5a0e61e9610af193a0d62f2 100644 (file)
@@ -617,12 +617,12 @@ int gnutls_pkcs12_set_bag(gnutls_pkcs12 pkcs12, gnutls_pkcs12_bag bag)
                }
        } else {
                result = _gnutls_x509_der_encode_and_copy( safe_cont, "", c2, "?LAST.content", 1);
-               if (result != ASN1_SUCCESS) {
+               if (result < 0) {
                        gnutls_assert();
-                       result = _gnutls_asn2err(result);
                        goto cleanup;
                }
        }
+
        asn1_delete_structure(&safe_cont);
 
        
index f195678bcff9bfde37e7d353539c8f2231cab7f8..6bce6c19c9295e29375327b52b5cf4664d8a98fd 100644 (file)
@@ -1230,7 +1230,11 @@ static int decrypt_data(schema_id schema, ASN1_TYPE pkcs8_asn, const char *root,
        }
 
        decrypted_data->data = data;
-       decrypted_data->size = data_size - data[data_size - 1];
+
+       if ( _gnutls_cipher_get_block_size(enc_params->cipher) != 1) 
+               decrypted_data->size = data_size - data[data_size - 1];
+       else
+               decrypted_data->size = data_size;
 
        _gnutls_cipher_deinit(ch);
 
@@ -1579,20 +1583,27 @@ static int encrypt_data( const gnutls_datum * plain,
        opaque *data = NULL;
        gnutls_datum div;
        GNUTLS_CIPHER_HANDLE ch = NULL;
-       opaque pad;
+       opaque pad, pad_size;
+
+       pad_size = _gnutls_cipher_get_block_size(enc_params->cipher);
+       
+       if (pad_size == 1) /* stream */ pad_size = 0;
 
-       data = gnutls_malloc(plain->size + 8);
+       data = gnutls_malloc(plain->size + pad_size);
        if (data == NULL) {
                gnutls_assert();
                return GNUTLS_E_MEMORY_ERROR;
        }
 
        memcpy(data, plain->data, plain->size);
-       pad = 8 - (plain->size % 8);
-       if (pad == 0)
-               pad = 8;
 
-       memset(&data[plain->size], pad, pad);
+       if (pad_size > 0) {
+               pad = pad_size - (plain->size % pad_size);
+               if (pad == 0)
+                       pad = pad_size;
+               memset(&data[plain->size], pad, pad);
+       } else pad = 0;
+
        data_size = plain->size + pad;
 
        div.data = (opaque *) enc_params->iv;
@@ -1820,7 +1831,7 @@ int _gnutls_pkcs7_encrypt_data(schema_id schema, const gnutls_datum * data,
        /* Now write the rest of the pkcs-7 stuff.
         */
 
-       result = _gnutls_x509_write_uint32( pkcs7_asn, "version", 4);
+       result = _gnutls_x509_write_uint32( pkcs7_asn, "version", 0);
        if (result < 0) {
                gnutls_assert();
                goto error;
@@ -1834,6 +1845,14 @@ int _gnutls_pkcs7_encrypt_data(schema_id schema, const gnutls_datum * data,
                goto error;
        }
 
+       result =
+           asn1_write_value(pkcs7_asn, "unprotectedAttrs", NULL, 0);
+       if (result != ASN1_SUCCESS) {
+               gnutls_assert();
+               result = _gnutls_asn2err(result);
+               goto error;
+       }
+
        /* Now encode and copy the DER stuff.
         */
        result = _gnutls_x509_der_encode( pkcs7_asn, "", enc, 0);