summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2004-04-07 08:07:01 +0000
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2004-04-07 08:07:01 +0000
commit97efbba58f05b80af1ca01842d3c115b0f2274dc (patch)
tree99890c5aba18154c4a56068e444d38303f96574a
parent9f9addae11390165841c07fa1b2ed537359d2af4 (diff)
downloadgnutls-97efbba58f05b80af1ca01842d3c115b0f2274dc.tar.gz
Optimized (a bit) the rsa_parameter copying. I don't like it.
-rw-r--r--lib/gnutls_rsa_export.c11
-rw-r--r--lib/x509/privkey.c110
-rw-r--r--lib/x509/x509.h5
3 files changed, 88 insertions, 38 deletions
diff --git a/lib/gnutls_rsa_export.c b/lib/gnutls_rsa_export.c
index fa1ed8b853..57e15ebb12 100644
--- a/lib/gnutls_rsa_export.c
+++ b/lib/gnutls_rsa_export.c
@@ -186,8 +186,17 @@ int gnutls_rsa_params_import_raw(gnutls_rsa_params rsa_params,
**/
int gnutls_rsa_params_init(gnutls_rsa_params * rsa_params)
{
+int ret;
- return gnutls_x509_privkey_init( rsa_params);
+ ret = gnutls_x509_privkey_init( rsa_params);
+ if (ret < 0) {
+ gnutls_assert();
+ return ret;
+ }
+
+ (*rsa_params)->crippled = 1;
+
+ return 0;
}
/**
diff --git a/lib/x509/privkey.c b/lib/x509/privkey.c
index 70fe0ddc64..b38ea376df 100644
--- a/lib/x509/privkey.c
+++ b/lib/x509/privkey.c
@@ -103,25 +103,28 @@ int i, ret;
dst->params_size = src->params_size;
dst->pk_algorithm = src->pk_algorithm;
-
- switch( dst->pk_algorithm) {
- case GNUTLS_PK_DSA:
- ret = _encode_dsa( &dst->key, dst->params);
- if (ret < 0) {
- gnutls_assert();
- return ret;
- }
- break;
- case GNUTLS_PK_RSA:
- ret = _encode_rsa( &dst->key, dst->params);
- if (ret < 0) {
+ dst->crippled = src->crippled;
+
+ if (!src->crippled) {
+ switch( dst->pk_algorithm) {
+ case GNUTLS_PK_DSA:
+ ret = _encode_dsa( &dst->key, dst->params);
+ if (ret < 0) {
+ gnutls_assert();
+ return ret;
+ }
+ break;
+ case GNUTLS_PK_RSA:
+ ret = _encode_rsa( &dst->key, dst->params);
+ if (ret < 0) {
+ gnutls_assert();
+ return ret;
+ }
+ break;
+ default:
gnutls_assert();
- return ret;
- }
- break;
- default:
- gnutls_assert();
- return GNUTLS_E_INVALID_REQUEST;
+ return GNUTLS_E_INVALID_REQUEST;
+ }
}
return 0;
@@ -478,11 +481,13 @@ int gnutls_x509_privkey_import_rsa_raw(gnutls_x509_privkey key,
return GNUTLS_E_MPI_SCAN_FAILED;
}
- ret = _encode_rsa( &key->key, key->params);
- if (ret < 0) {
- gnutls_assert();
- FREE_RSA_PRIVATE_PARAMS;
- return ret;
+ if (!key->crippled) {
+ ret = _encode_rsa( &key->key, key->params);
+ if (ret < 0) {
+ gnutls_assert();
+ FREE_RSA_PRIVATE_PARAMS;
+ return ret;
+ }
}
key->params_size = RSA_PRIVATE_PARAMS;
@@ -553,11 +558,13 @@ int gnutls_x509_privkey_import_dsa_raw(gnutls_x509_privkey key,
return GNUTLS_E_MPI_SCAN_FAILED;
}
- ret = _encode_dsa( &key->key, key->params);
- if (ret < 0) {
- gnutls_assert();
- FREE_DSA_PRIVATE_PARAMS;
- return ret;
+ if (!key->crippled) {
+ ret = _encode_dsa( &key->key, key->params);
+ if (ret < 0) {
+ gnutls_assert();
+ FREE_DSA_PRIVATE_PARAMS;
+ return ret;
+ }
}
key->params_size = DSA_PRIVATE_PARAMS;
@@ -615,6 +622,7 @@ int gnutls_x509_privkey_export( gnutls_x509_privkey key,
gnutls_x509_crt_fmt format, void* output_data, size_t* output_data_size)
{
char * msg;
+ int ret;
if (key == NULL) {
gnutls_assert();
@@ -627,6 +635,29 @@ int gnutls_x509_privkey_export( gnutls_x509_privkey key,
msg = PEM_KEY_DSA;
else msg = NULL;
+ if (key->crippled) { /* encode the parameters on the fly.
+ */
+ switch( key->pk_algorithm) {
+ case GNUTLS_PK_DSA:
+ ret = _encode_dsa( &key->key, key->params);
+ if (ret < 0) {
+ gnutls_assert();
+ return ret;
+ }
+ break;
+ case GNUTLS_PK_RSA:
+ ret = _encode_rsa( &key->key, key->params);
+ if (ret < 0) {
+ gnutls_assert();
+ return ret;
+ }
+ break;
+ default:
+ gnutls_assert();
+ return GNUTLS_E_INVALID_REQUEST;
+ }
+ }
+
return _gnutls_x509_export_int( key->key, format, msg, *output_data_size,
output_data, output_data_size);
}
@@ -1190,10 +1221,12 @@ int i;
return ret;
}
- ret = _encode_dsa( &key->key, key->params);
- if (ret < 0) {
- gnutls_assert();
- goto cleanup;
+ if (!key->crippled) {
+ ret = _encode_dsa( &key->key, key->params);
+ if (ret < 0) {
+ gnutls_assert();
+ goto cleanup;
+ }
}
key->params_size = params_len;
key->pk_algorithm = GNUTLS_PK_DSA;
@@ -1206,11 +1239,14 @@ int i;
return ret;
}
- ret = _encode_rsa( &key->key, key->params);
- if (ret < 0) {
- gnutls_assert();
- goto cleanup;
+ if (!key->crippled) {
+ ret = _encode_rsa( &key->key, key->params);
+ if (ret < 0) {
+ gnutls_assert();
+ goto cleanup;
+ }
}
+
key->params_size = params_len;
key->pk_algorithm = GNUTLS_PK_RSA;
@@ -1257,7 +1293,7 @@ int result;
GNUTLS_HASH_HANDLE hd;
gnutls_datum der = { NULL, 0 };
- if (key == NULL) {
+ if (key == NULL || key->crippled) {
gnutls_assert();
return GNUTLS_E_INVALID_REQUEST;
}
diff --git a/lib/x509/x509.h b/lib/x509/x509.h
index ee5c949e1a..3d2052cbd4 100644
--- a/lib/x509/x509.h
+++ b/lib/x509/x509.h
@@ -51,6 +51,11 @@ typedef struct gnutls_x509_privkey_int {
gnutls_pk_algorithm pk_algorithm;
+ int crippled; /* The crippled keys will not use the ASN1_TYPE key.
+ * The encoding will only be performed at the export
+ * phase, to optimize copying etc. Cannot be used with
+ * the exported API (used internally only).
+ */
ASN1_TYPE key;
} gnutls_x509_privkey_int;