Added SILC Thread Queue API
[silc.git] / lib / silcasn1 / tests / test_silcasn1.c
index c92deee733d3c8f6cf1221c6d7586f6b0685e748..c6266e1e2e311eb1d23f207a54b683d6aed507f1 100644 (file)
@@ -1,4 +1,4 @@
-#include "silcincludes.h"
+#include "silc.h"
 
 /*
 silc_asn1_encode(asn1, node,
@@ -48,10 +48,14 @@ int main(int argc, char **argv)
   SilcBufferStruct node, node2;
   SilcAsn1 asn1;
   SilcBool success = FALSE;
-  SilcBool val = TRUE;
+  SilcBool val = TRUE, nval;
   int i;
-  unsigned char *str;
-  SilcUInt32 str_len;
+  unsigned char *str, buf[512];
+  SilcUInt32 str_len, tmpint, choice;
+  char tmp[32];
+  SilcRng rng;
+  SilcMPInt mpint, mpint2;
+  SilcStack stack;
 
   memset(&node, 0, sizeof(node));
   memset(&node2, 0, sizeof(node2));
@@ -59,11 +63,17 @@ int main(int argc, char **argv)
   if (argc > 1 && !strcmp(argv[1], "-d")) {
     silc_log_debug(TRUE);
     silc_log_debug_hexdump(TRUE);
-    silc_log_set_debug_string("*asn1*,*ber*");
+    silc_log_set_debug_string("*asn1*,*ber*,*stack*");
   }
 
+  silc_hash_register_default();
+  rng = silc_rng_alloc();
+  silc_rng_init(rng);
+
+  stack = silc_stack_alloc(0, NULL);
+
   SILC_LOG_DEBUG(("Allocating ASN.1 context"));
-  asn1 = silc_asn1_alloc();
+  asn1 = silc_asn1_alloc(stack);
   if (!asn1)
     goto out;
 
@@ -173,7 +183,10 @@ int main(int argc, char **argv)
                       SILC_ASN1_SEQUENCE_T(SILC_ASN1_EXPLICIT, 9),
                         SILC_ASN1_SEQUENCE_T(SILC_ASN1_INDEFINITE, 0),
                           SILC_ASN1_BOOLEAN_T(0, 4, &val),
-                          SILC_ASN1_BOOLEAN(&val),
+                          SILC_ASN1_CHOICE(&choice),
+                            SILC_ASN1_SHORT_INT(&tmpint),
+                            SILC_ASN1_BOOLEAN(&val),
+                          SILC_ASN1_END,
                         SILC_ASN1_END,
                       SILC_ASN1_END,
                     SILC_ASN1_END, SILC_ASN1_END);
@@ -183,6 +196,9 @@ int main(int argc, char **argv)
   }
   SILC_LOG_DEBUG(("Decoding success"));
   SILC_LOG_DEBUG(("Boolean val %d", val));
+  SILC_LOG_DEBUG(("Choice index %d", choice));
+  if (choice != 2)
+    goto out;
   printf("\n");
 
 
@@ -323,6 +339,112 @@ int main(int argc, char **argv)
   printf("\n");
 
 
+  memset(&node, 0, sizeof(node));
+  SILC_LOG_DEBUG(("Encoding ASN.1 tree (ANY_PRIMITIVE)"));
+  memset(tmp, 0, sizeof(tmp));
+  tmp[0] = 0xff;
+  silc_buffer_set(&node2, tmp, 1);
+  SILC_LOG_DEBUG(("Encoding success"));
+  success =
+    silc_asn1_encode(asn1, &node,
+                    SILC_ASN1_SEQUENCE,
+                      SILC_ASN1_ANY_PRIMITIVE(SILC_ASN1_TAG_BOOLEAN,
+                                              &node2),
+                    SILC_ASN1_END, SILC_ASN1_END);
+  if (!success) {
+    SILC_LOG_DEBUG(("Encoding failed"));
+    goto out;
+  }
+  SILC_LOG_DEBUG(("Encoding success"));
+  SILC_LOG_HEXDUMP(("ASN.1 tree"), node.data, silc_buffer_len(&node));
+  memset(&node2, 0, sizeof(node2));
+  SILC_LOG_DEBUG(("Decoding ASN.1 tree (ANY_PRIMITIVE)"));
+  success =
+    silc_asn1_decode(asn1, &node,
+                    SILC_ASN1_SEQUENCE,
+                      SILC_ASN1_ANY_PRIMITIVE(SILC_ASN1_TAG_BOOLEAN,
+                                              &node2),
+                    SILC_ASN1_END, SILC_ASN1_END);
+  if (!success) {
+    SILC_LOG_DEBUG(("Decoding failed"));
+    goto out;
+  }
+  SILC_LOG_DEBUG(("Boolean val %d", node2.data[0]));
+  if (node2.data[0] != 0xff) {
+    SILC_LOG_DEBUG(("Decoding failed"));
+    goto out;
+  }
+  SILC_LOG_DEBUG(("Decoding success"));
+  memset(&node, 0, sizeof(node));
+  SILC_LOG_DEBUG(("Encoding ASN.1 tree (ANY_PRIMITIVE)"));
+  memset(tmp, 0, sizeof(tmp));
+  tmp[0] = 0xff;
+  silc_buffer_set(&node2, tmp, 1);
+  SILC_LOG_DEBUG(("Encoding success"));
+  success =
+    silc_asn1_encode(asn1, &node,
+                    SILC_ASN1_SEQUENCE,
+                      SILC_ASN1_ANY_PRIMITIVE(SILC_ASN1_TAG_BOOLEAN,
+                                              &node2),
+                    SILC_ASN1_END, SILC_ASN1_END);
+  if (!success) {
+    SILC_LOG_DEBUG(("Encoding failed"));
+    goto out;
+  }
+  SILC_LOG_DEBUG(("Encoding success"));
+  SILC_LOG_HEXDUMP(("ASN.1 tree"), node.data, silc_buffer_len(&node));
+  memset(&node2, 0, sizeof(node2));
+  SILC_LOG_DEBUG(("Decoding ASN.1 tree (ANY_PRIMITIVE)"));
+  success =
+    silc_asn1_decode(asn1, &node,
+                    SILC_ASN1_SEQUENCE,
+                      SILC_ASN1_BOOLEAN(&val),
+                    SILC_ASN1_END, SILC_ASN1_END);
+  if (!success) {
+    SILC_LOG_DEBUG(("Decoding failed"));
+    goto out;
+  }
+  SILC_LOG_DEBUG(("Decoding success"));
+  SILC_LOG_DEBUG(("Boolean val %d", val));
+  memset(&node, 0, sizeof(node));
+  SILC_LOG_DEBUG(("Encoding ASN.1 tree (ANY_PRIMITIVE)"));
+  memset(tmp, 0, sizeof(tmp));
+  tmp[0] = 0xff;
+  silc_buffer_set(&node2, tmp, 1);
+  SILC_LOG_DEBUG(("Encoding success"));
+  success =
+    silc_asn1_encode(asn1, &node,
+                    SILC_ASN1_SEQUENCE,
+                      SILC_ASN1_BOOLEAN(val),
+                    SILC_ASN1_END, SILC_ASN1_END);
+  if (!success) {
+    SILC_LOG_DEBUG(("Encoding failed"));
+    goto out;
+  }
+  SILC_LOG_DEBUG(("Encoding success"));
+  SILC_LOG_HEXDUMP(("ASN.1 tree"), node.data, silc_buffer_len(&node));
+  memset(&node2, 0, sizeof(node2));
+  SILC_LOG_DEBUG(("Decoding ASN.1 tree (ANY_PRIMITIVE)"));
+  success =
+    silc_asn1_decode(asn1, &node,
+                    SILC_ASN1_SEQUENCE,
+                      SILC_ASN1_ANY_PRIMITIVE(SILC_ASN1_TAG_BOOLEAN,
+                                              &node2),
+                    SILC_ASN1_END, SILC_ASN1_END);
+  if (!success) {
+    SILC_LOG_DEBUG(("Decoding failed"));
+    goto out;
+  }
+  SILC_LOG_DEBUG(("Boolean val %d", node2.data[0]));
+  if (node2.data[0] != 0xff) {
+    SILC_LOG_DEBUG(("Decoding failed"));
+    goto out;
+  }
+  SILC_LOG_DEBUG(("Decoding success"));
+  memset(&node2, 0, sizeof(node2));
+  printf("\n");
+
+
   memset(&node, 0, sizeof(node));
   SILC_LOG_DEBUG(("Encoding ASN.1 tree 6"));
   success =
@@ -476,6 +598,7 @@ int main(int argc, char **argv)
   memset(&node, 0, sizeof(node));
   printf("\n");
 
+
   memset(&node, 0, sizeof(node));
   SILC_LOG_DEBUG(("Encoding ASN.1 tree 9"));
   success =
@@ -490,7 +613,7 @@ int main(int argc, char **argv)
                         SILC_ASN1_BOOLEAN_T(0, 100, val),
                       SILC_ASN1_END,
                       SILC_ASN1_SEQUENCE,
-                        SILC_ASN1_NULL,
+                        SILC_ASN1_NULL(TRUE),
                         SILC_ASN1_BOOLEAN_T(SILC_ASN1_EXPLICIT, 0, val),
                         SILC_ASN1_OCTET_STRING("foobar", 6),
                         SILC_ASN1_BOOLEAN_T(SILC_ASN1_PRIVATE, 43, val),
@@ -517,7 +640,7 @@ int main(int argc, char **argv)
                         SILC_ASN1_BOOLEAN_T(0, 100, &val),
                       SILC_ASN1_END,
                       SILC_ASN1_SEQUENCE,
-                        SILC_ASN1_NULL,
+                        SILC_ASN1_NULL(&nval),
                         SILC_ASN1_BOOLEAN_T(SILC_ASN1_EXPLICIT, 0, &val),
                         SILC_ASN1_OCTET_STRING(&str, &str_len),
                         SILC_ASN1_BOOLEAN_T(SILC_ASN1_PRIVATE, 43, &val),
@@ -531,12 +654,114 @@ int main(int argc, char **argv)
   }
   SILC_LOG_DEBUG(("Decoding success"));
   SILC_LOG_DEBUG(("Boolean val %d", val));
+  SILC_LOG_DEBUG(("NULL is present %s", nval ? "yes" : "no"));
   SILC_LOG_DEBUG(("Ooctet-string %s, len %d", str, str_len));
   printf("\n");
 
-#endif
+
+  memset(&node, 0, sizeof(node));
+  SILC_LOG_DEBUG(("Encoding ASN.1 tree 10 (INTEGER)"));
+  silc_rng_get_rn_data(rng, 256, buf, sizeof(buf));
+  silc_mp_init(&mpint);
+  silc_mp_init(&mpint2);
+  silc_mp_bin2mp(buf, 256, &mpint);
+  success =
+    silc_asn1_encode(asn1, &node,
+                    SILC_ASN1_INT(&mpint),
+                    SILC_ASN1_END);
+  if (!success) {
+    SILC_LOG_DEBUG(("Encoding failed"));
+    goto out;
+  }
+  SILC_LOG_DEBUG(("Encoding success"));
+  SILC_LOG_HEXDUMP(("ASN.1 tree"), node.data, silc_buffer_len(&node));
+  SILC_LOG_DEBUG(("Decoding ASN.1 tree 10 (INTEGER)"));
+  success =
+    silc_asn1_decode(asn1, &node,
+                    SILC_ASN1_INT(&mpint2),
+                    SILC_ASN1_END);
+  if (silc_mp_cmp(&mpint, &mpint2) != 0) {
+    SILC_LOG_DEBUG(("INTEGER MISMATCH"));
+    goto out;
+  }
+  if (!success) {
+    SILC_LOG_DEBUG(("Decoding failed"));
+    goto out;
+  }
+  SILC_LOG_DEBUG(("Decoding success"));
+  printf("\n");
+
+
+  memset(&node, 0, sizeof(node));
+  SILC_LOG_DEBUG(("Encoding ASN.1 tree 11 (OID)"));
+  success =
+    silc_asn1_encode(asn1, &node,
+                    SILC_ASN1_OPTS(SILC_ASN1_ACCUMUL),
+                    SILC_ASN1_OID("1.2.840.113549"),
+                    SILC_ASN1_END);
+  if (!success) {
+    SILC_LOG_DEBUG(("Encoding failed"));
+    goto out;
+  }
+  SILC_LOG_DEBUG(("Encoding success"));
+  SILC_LOG_HEXDUMP(("ASN.1 tree"), node.data, silc_buffer_len(&node));
+  SILC_LOG_DEBUG(("Decoding ASN.1 tree 11 (OID)"));
+  success =
+    silc_asn1_decode(asn1, &node,
+                    SILC_ASN1_OPTS(SILC_ASN1_ACCUMUL),
+                    SILC_ASN1_OID(&str),
+                    SILC_ASN1_END);
+  if (!success) {
+    SILC_LOG_DEBUG(("Decoding failed"));
+    goto out;
+  }
+  SILC_LOG_DEBUG(("Decoding success"));
+  SILC_LOG_DEBUG(("OID %s", str));
+  printf("\n");
+
+
+  memset(&node, 0, sizeof(node));
+  SILC_LOG_DEBUG(("Encoding ASN.1 tree 12 (SHORT INTEGER)"));
+  str_len = 198761;
+  tmpint = 0;
+  SILC_LOG_DEBUG(("Short integer: %d", str_len));
+  SILC_LOG_DEBUG(("Short integer: %d", tmpint));
+  success =
+    silc_asn1_encode(asn1, &node,
+                    SILC_ASN1_SHORT_INT(str_len),
+                    SILC_ASN1_SHORT_INT_T(SILC_ASN1_IMPLICIT, 100, tmpint),
+                    SILC_ASN1_END);
+  if (!success) {
+    SILC_LOG_DEBUG(("Encoding failed"));
+    goto out;
+  }
+  SILC_LOG_DEBUG(("Encoding success"));
+  SILC_LOG_HEXDUMP(("ASN.1 tree"), node.data, silc_buffer_len(&node));
+  SILC_LOG_DEBUG(("Decoding ASN.1 tree 12 (SHORT INTEGER)"));
+  success =
+    silc_asn1_decode(asn1, &node,
+                    SILC_ASN1_SHORT_INT(&str_len),
+                    SILC_ASN1_SHORT_INT_T(SILC_ASN1_IMPLICIT, 100, &tmpint),
+                    SILC_ASN1_END);
+  if (!success) {
+    SILC_LOG_DEBUG(("Decoding failed"));
+    goto out;
+  }
+  SILC_LOG_DEBUG(("Short integer: %d", str_len));
+  SILC_LOG_DEBUG(("Short integer: %d", tmpint));
+  SILC_LOG_DEBUG(("Decoding success"));
+  printf("\n");
+
+#endif /* 1 */
   silc_asn1_free(asn1);
+  silc_rng_free(rng);
+  silc_hash_unregister_all();
+  silc_stack_free(stack);
 
+  success = TRUE;
  out:
-  exit(success);
+  SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
+  fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
+
+  return success;
 }