Merge branch 'topic/mm-fixes' of git://208.110.73.182/silc into silc.1.1.branch
[silc.git] / lib / silccrypt / silcpk.c
index 4752b1d66b84c4686ef8ebe867705e688ba08768..e4a000788c79f71fdae9da4e7516470d498d612f 100644 (file)
@@ -124,7 +124,7 @@ SilcBool silc_pkcs_silc_decode_identifier(const char *identifier,
   int len;
 
   /* Protocol says that at least UN and HN must be provided as identifier */
-  if (!strstr(identifier, "UN=") && !strstr(identifier, "HN=")) {
+  if (!strstr(identifier, "UN=") || !strstr(identifier, "HN=")) {
     SILC_LOG_DEBUG(("The public does not have the required UN= and HN= "
                    "identifiers"));
     return FALSE;
@@ -206,7 +206,7 @@ char *silc_pkcs_silc_encode_identifier(char *username, char *host,
 
   if (!username || !host)
     return NULL;
-  if (strlen(username) < 3 || strlen(host) < 3)
+  if (strlen(username) < 1 || strlen(host) < 1)
     return NULL;
 
   memset(&buf, 0, sizeof(buf));
@@ -323,11 +323,15 @@ SilcBool silc_pkcs_silc_import_public_key_file(unsigned char *filedata,
 
   /* Check start of file and remove header from the data. */
   len = strlen(SILC_PKCS_PUBLIC_KEYFILE_BEGIN);
-  if (filedata_len < len + strlen(SILC_PKCS_PUBLIC_KEYFILE_END))
+  if (filedata_len < len + strlen(SILC_PKCS_PUBLIC_KEYFILE_END)) {
+    SILC_LOG_ERROR(("Malformed SILC public key header"));
     return FALSE;
+  }
   for (i = 0; i < len; i++) {
-    if (*filedata != SILC_PKCS_PUBLIC_KEYFILE_BEGIN[i])
+    if (*filedata != SILC_PKCS_PUBLIC_KEYFILE_BEGIN[i]) {
+      SILC_LOG_ERROR(("Malformed SILC public key header"));
       return FALSE;
+    }
     filedata++;
   }
   filedata_len -= (strlen(SILC_PKCS_PUBLIC_KEYFILE_BEGIN) +
@@ -591,8 +595,10 @@ unsigned char *silc_pkcs_silc_export_public_key(void *public_key,
   /* Export PKCS algorithm public key */
   if (pkcs->export_public_key)
     pk = pkcs->export_public_key(silc_pubkey->public_key, &pk_len);
-  if (!pk)
+  if (!pk) {
+    SILC_LOG_ERROR(("Error exporting PKCS algorithm key"));
     return NULL;
+  }
   silc_buffer_set(&alg_key, pk, pk_len);
 
   /* Encode identifier */
@@ -604,8 +610,10 @@ unsigned char *silc_pkcs_silc_export_public_key(void *public_key,
                                     silc_pubkey->identifier.org,
                                     silc_pubkey->identifier.country,
                                     silc_pubkey->identifier.version);
-  if (!identifier)
+  if (!identifier) {
+    SILC_LOG_ERROR(("Error encoding SILC public key identifier"));
     goto err;
+  }
 
   asn1 = silc_asn1_alloc();
   if (!asn1)
@@ -654,7 +662,7 @@ unsigned char *silc_pkcs_silc_export_public_key(void *public_key,
     goto err;
 
   } else {
-    SILC_LOG_DEBUG(("Unsupported PKCS algorithm"));
+    SILC_LOG_ERROR(("Unsupported PKCS algorithm: %s", pkcs->name));
     goto err;
   }
 
@@ -844,11 +852,15 @@ SilcBool silc_pkcs_silc_import_private_key_file(unsigned char *filedata,
 
   /* Check start of file and remove header from the data. */
   len = strlen(SILC_PKCS_PRIVATE_KEYFILE_BEGIN);
-  if (filedata_len < len + strlen(SILC_PKCS_PRIVATE_KEYFILE_END))
+  if (filedata_len < len + strlen(SILC_PKCS_PRIVATE_KEYFILE_END)) {
+    SILC_LOG_ERROR(("Malformed SILC private key header"));
     return FALSE;
+  }
   for (i = 0; i < len; i++) {
-    if (*filedata != SILC_PKCS_PRIVATE_KEYFILE_BEGIN[i])
+    if (*filedata != SILC_PKCS_PRIVATE_KEYFILE_BEGIN[i]) {
+      SILC_LOG_ERROR(("Malformed SILC private key header"));
       return FALSE;
+    }
     filedata++;
   }
 
@@ -1267,6 +1279,7 @@ int silc_pkcs_silc_import_private_key(unsigned char *key,
   silc_free(silc_privkey);
   if (asn1)
     silc_asn1_free(asn1);
+  SILC_LOG_ERROR(("Malformed SILC private key "));
   return 0;
 }