public static bool IsOidStr(string inStr)
 {
     bool retval = false;
     MemoryStream ms = new MemoryStream();
     Oid xoid = new Oid();
     xoid.Encode(ms, inStr);
     ms.Close();
     retval = true;
     return retval;
 }
 public static bool EditNode(IWin32Window parent, Asn1Node aNode, bool enableTagEdit, bool pureHexMode)
 {
     byte[] val;
     byte[] data;
     FormNodeContentEditor ed = new FormNodeContentEditor();
     ed.aNode = aNode;
     MemoryStream ms = new MemoryStream();
     ed.checker = FormNodeContentEditor.DataChecker.None;
     ed.enableTagEdit = enableTagEdit;
     ed.pureHexMode = pureHexMode;
     if (
         ((aNode.Tag&Asn1Tag.TAG_MASK) == Asn1Tag.BIT_STRING) &&
         (aNode.ChildNodeCount<1))
     {
         ed.panelUnusedBits.Visible = true;
         ed.textBoxUnusedBits.Text = aNode.UnusedBits.ToString();
     }
     else
     {
         ed.panelUnusedBits.Visible = false;
     }
     if (pureHexMode)
     {
         ed.checker = DataChecker.Hex;
         ed.ShowDialog(parent);
         if (!ed.isOK) return false;
         data = Asn1Util.HexStrToBytes(ed.GetValueStr());
         aNode.Data = data;
     }
     else
     {
         byte[] oidVal;
         switch (aNode.Tag)
         {
             case Asn1Tag.OBJECT_IDENTIFIER:
                 ed.checker = DataChecker.Oid;
                 ed.ShowDialog(parent);
                 if (!ed.isOK) return false;
                 Oid xoid = new Oid();
                 xoid.Encode(ms, ed.GetValueStr());
                 ms.Position = 0;
                 oidVal = new byte[ms.Length];
                 ms.Read(oidVal, 0, (int)ms.Length);
                 ms.Close();
                 aNode.Data = oidVal;
                 break;
             case Asn1Tag.RELATIVE_OID:
                 ed.checker = DataChecker.Roid;
                 ed.ShowDialog(parent);
                 if (!ed.isOK) return false;
                 RelativeOid roid = new RelativeOid();
                 roid.Encode(ms, ed.GetValueStr());
                 ms.Position = 0;
                 oidVal = new byte[ms.Length];
                 ms.Read(oidVal, 0, (int)ms.Length);
                 ms.Close();
                 aNode.Data = oidVal;
                 break;
             case Asn1Tag.PRINTABLE_STRING:
             case Asn1Tag.IA5_STRING:
             case Asn1Tag.UNIVERSAL_STRING:
             case Asn1Tag.VISIBLE_STRING:
             case Asn1Tag.NUMERIC_STRING:
             case Asn1Tag.UTC_TIME:
             case Asn1Tag.GENERAL_STRING:
             case Asn1Tag.GENERALIZED_TIME:
                 ed.ShowDialog(parent);
                 if (!ed.isOK) return false;
                 val = Asn1Util.StringToBytes(ed.GetValueStr());
                 aNode.Data = val;
                 break;
             case Asn1Tag.UTF8_STRING:
                 ed.ShowDialog(parent);
                 if (!ed.isOK) return false;
                 UTF8Encoding u8 = new UTF8Encoding(false);
                 val = u8.GetBytes(ed.GetValueStr());
                 aNode.Data = val;
                 break;
             case Asn1Tag.BMPSTRING:
                 ed.ShowDialog(parent);
                 if (!ed.isOK) return false;
                 byte[] tmpval = Asn1Util.StringToBytes(ed.GetValueStr());
                 val = new byte[tmpval.Length*2];
                 for (int i = 0; i<tmpval.Length; i++)
                 {
                     val[i*2] = 0;
                     val[i*2+1] = tmpval[i];
                 }
                 aNode.Data = val;
                 break;
             case Asn1Tag.INTEGER:
             case Asn1Tag.BIT_STRING:
                 ed.checker = DataChecker.Hex;
                 ed.ShowDialog(parent);
                 if (!ed.isOK) return false;
                 aNode.UnusedBits = (byte)(Convert.ToUInt16(ed.textBoxUnusedBits.Text)%8);
                 data = Asn1Util.HexStrToBytes(ed.GetValueStr());
                 aNode.Data = data;
                 break;
             default:
                 if ((aNode.Tag & Asn1Tag.TAG_MASK) == 6) // Visible string for certificate
                 {
                     ed.ShowDialog(parent);
                     if (!ed.isOK) return false;
                     val = Asn1Util.StringToBytes(ed.GetValueStr());
                     aNode.Data = val;
                 }
                 else
                 {
                     ed.checker = DataChecker.Hex;
                     ed.ShowDialog(parent);
                     if (!ed.isOK) return false;
                     data = Asn1Util.HexStrToBytes(ed.GetValueStr());
                     aNode.Data = data;
                 }
                 break;
         };
     }
     return true;
 }