Longer default PKCS keys
[silc.git] / lib / silcapputil / silcapputil.c
index 059fbce3b19641833d9b256d25158458571817cc..9c7f136f1559d08f1ee0b6eb5ac9f268a69434d2 100644 (file)
@@ -108,13 +108,13 @@ New pair of keys will be created.  Please, answer to following questions.\n\
   if (!key_len_bits) {
     if (interactive) {
       char *length = NULL;
-      length = silc_get_input("Key length in key_len_bits [2048]: ", FALSE);
+      length = silc_get_input("Key length in key_len_bits [4096]: ", FALSE);
       if (length)
        key_len_bits = atoi(length);
       silc_free(length);
     }
     if (!key_len_bits)
-      key_len_bits = 2048;
+      key_len_bits = 4096;
   }
 
   if (!identifier) {
@@ -146,6 +146,12 @@ New pair of keys will be created.  Please, answer to following questions.\n\
     silc_free(def);
   }
 
+  if (!strstr(identifier, "UN=") || !strstr(identifier, "HN=")) {
+    fprintf(stderr, "Invalid public key identifier.  You must specify both "
+           "UN and HN\n");
+    return FALSE;
+  }
+
   rng = silc_rng_alloc();
   silc_rng_init(rng);
   silc_rng_global_init(rng);
@@ -202,12 +208,14 @@ New pair of keys will be created.  Please, answer to following questions.\n\
     return FALSE;
 
   /* Save public key into file */
-  silc_pkcs_save_public_key(pkfile, public_key, SILC_PKCS_FILE_BASE64);
+  if (!silc_pkcs_save_public_key(pkfile, public_key, SILC_PKCS_FILE_BASE64))
+    return FALSE;
 
   /* Save private key into file */
-  silc_pkcs_save_private_key(prvfile, private_key,
-                            (const unsigned char *)pass, strlen(pass),
-                            SILC_PKCS_FILE_BIN, rng);
+  if (!silc_pkcs_save_private_key(prvfile, private_key,
+                                 (const unsigned char *)pass, strlen(pass),
+                                 SILC_PKCS_FILE_BIN, rng))
+    return FALSE;
 
   if (return_public_key)
     *return_public_key = public_key;
@@ -265,6 +273,8 @@ SilcBool silc_load_key_pair(const char *pub_filename,
   if (!silc_pkcs_load_private_key(prv_filename,
                                  (const unsigned char *)pass, strlen(pass),
                                  return_private_key)) {
+    silc_pkcs_public_key_free(*return_public_key);
+    *return_public_key = NULL;
     memset(pass, 0, strlen(pass));
     silc_free(pass);
     return FALSE;
@@ -287,18 +297,14 @@ SilcBool silc_show_public_key(SilcPublicKey public_key)
   SilcUInt32 key_len = 0;
 
   silc_pubkey = silc_pkcs_get_context(SILC_PKCS_SILC, public_key);
-  if (!silc_pubkey) {
-    silc_pkcs_public_key_free(public_key);
+  if (!silc_pubkey)
     return FALSE;
-  }
 
   ident = &silc_pubkey->identifier;
   key_len = silc_pkcs_public_key_get_len(public_key);
   pk = silc_pkcs_public_key_encode(public_key, &pk_len);
-  if (!pk) {
-    silc_pkcs_public_key_free(public_key);
+  if (!pk)
     return FALSE;
-  }
   fingerprint = silc_hash_fingerprint(NULL, pk, pk_len);
   babbleprint = silc_hash_babbleprint(NULL, pk, pk_len);
 
@@ -618,6 +624,7 @@ static const SilcStatusMessage silc_status_messages[] = {
   { STAT(OPERATION_ALLOWED), "Operation is not allowed" },
   { STAT(BAD_SERVER), "Bad server name" },
   { STAT(BAD_USERNAME), "Bad user name" },
+  { STAT(NO_SUCH_PUBLIC_KEY), "Unknown public key" },
 
   { 0, NULL }
 };
@@ -744,7 +751,7 @@ SilcBool silc_parse_version_string(const char *version,
     return FALSE;
 
   cp = (char *)version + 5;
-  if (!cp)
+  if (!cp || !(*cp))
     return FALSE;
 
   /* Take protocol version */
@@ -798,6 +805,10 @@ SilcBool silc_parse_version_string(const char *version,
     cp = strchr(cp, '.') + 1;
     if (cp && *cp && vendor_version)
       *vendor_version = strdup(cp);
+  } else if (strchr(cp, ' ')) {
+    cp = strchr(cp, ' ') + 1;
+    if (cp && *cp && vendor_version)
+      *vendor_version = strdup(cp);
   }
 
   return TRUE;