private int ProcessOneTag( int Index, byte[] TagsBuffer ) { try { StatusString += "Top of ProcessOneTag().\r\n"; if( IntMath == null ) IntMath = new IntegerMath(); if( TagsBuffer == null ) { StatusString += "Tags buffer was null.\r\n"; return -1; } if( ObjectIDNames == null ) ObjectIDNames = new X509ObjectIDNames(); if( Index < 0 ) { StatusString += "Index < 0.\r\n"; return -1; } if( Index >= TagsBuffer.Length ) { StatusString += "It's past the end of the buffer.\r\n"; return -1; } StatusString += "Index: " + Index.ToString() + "\r\n"; int Tag = TagsBuffer[Index]; Index++; int ClassBits = Tag & 0xC0; ClassBits >>= 6; StatusString += "ClassBits: " + ClassBits.ToString( "X0" ) + "\r\n"; int PrimitiveOrConstructed = Tag & 0x20; if( (PrimitiveOrConstructed & 0x20) == 0 ) StatusString += "Tag is a Primitive type.\r\n"; else StatusString += "Tag is a Constructed type.\r\n"; int TagVal = Tag & 0x1F; // Bottom 5 bits. ShowTagType( TagVal ); MostRecentTagValue = TagVal; int Length = TagsBuffer[Index]; Index++; if( (Length & 0x80) != 0 ) { // Then it's in the long form. int HowManyBytes = Length & 0x7F; if( HowManyBytes > 4 ) throw( new Exception( "This can't be right for HowManyBytes: " + HowManyBytes.ToString() )); StatusString += "Long form HowManyBytes: " + HowManyBytes.ToString() + "\r\n"; Length = 0; for( int Count = 0; Count < HowManyBytes; Count++ ) { Length <<= 8; Length |= TagsBuffer[Index]; Index++; } } else { StatusString += "Length is in short form.\r\n"; } StatusString += "Length is: " + Length.ToString() + "\r\n"; if( Length > TagsBuffer.Length ) { StatusString += "The Length is not a reasonable number.\r\n"; return -1; } if( // (TagVal == 0) || // That context specific tag. (TagVal == 1) || // Boolean // (TagVal == 4) || // Octet String (TagVal == 5) || // Null (Should have a length of zero.) (TagVal == 7) || // Object Descriptor // (TagVal == 8) || // External (TagVal == 9) || // Real/Float (TagVal == 10) || // Enumerated (TagVal == 11) || // Embedded PDV (TagVal == 12) || // UTF8 String (TagVal == 13) || // Relative OID // (TagVal == 14) || // Reserved // (TagVal == 15) || // Reserved // (TagVal == 16) || // Sequence // (TagVal == 17) || // Set (TagVal == 18) || // Numeric String (TagVal == 20) || // T61 String (TagVal == 21) || // Videotex String // (TagVal == 22) || // IA5 String (TagVal == 23) || // UTC Time (TagVal == 24) || // Generalized Time (TagVal == 25) || // Graphic String (TagVal == 26) || // Visible String (TagVal == 27) || // General String (TagVal == 28) || // Universal String (TagVal == 29) || // Character String (TagVal == 30)) // BMP String { for( int Count = 0; Count < Length; Count++ ) { int ContentByte = TagsBuffer[Index]; Index++; StatusString += " Byte: 0x" + ContentByte.ToString( "X2" ) + "\r\n"; } } if( TagVal == 2 ) // Integer { // This length was already checked above to see if it's a reasonable // number. byte[] BytesToSet = new byte[Length]; try { for( int Count = 0; Count < Length; Count++ ) { BytesToSet[Count] = TagsBuffer[Index]; Index++; } } catch( Exception Except ) { // Probably over-ran the buffer. StatusString += "Exception at: BytesToSet[Count] = TagsBuffer[Index].\r\nIn DomainX509Record.ProcessOneTag().\r\n"; StatusString += Except.Message + "\r\n"; return -1; } try { MostRecentIntegerValue.SetFromBigEndianByteArray( BytesToSet ); StatusString += "MostRecentIntegerValue: " + IntMath.ToString10( MostRecentIntegerValue ) + "\r\n"; } catch( Exception Except ) { // Probably over-ran the buffer. StatusString += "Exception at: SetFromBigEndianByteArray().\r\nIn DomainX509Record.ProcessOneTag().\r\n"; StatusString += Except.Message + "\r\n"; return -1; } } if( TagVal == 3 ) // bit String { // This length was already checked above to see if it's a reasonable // number. byte[] BytesToSet = new byte[Length]; try { for( int Count = 0; Count < Length; Count++ ) { BytesToSet[Count] = TagsBuffer[Index]; Index++; } } catch( Exception Except ) { // Probably over-ran the buffer. StatusString += "Exception at: BytesToSet[Count] = TagsBuffer[Index].\r\nIn DomainX509Record.ProcessOneTag().\r\n"; StatusString += Except.Message + "\r\n"; return -1; } try { BitStreamRec Rec = new BitStreamRec(); Rec.BitStream = BytesToSet; Rec.OIDString = MostRecentObjectIDString; AddBitStreamRec( Rec ); } catch( Exception Except ) { // Probably over-ran the buffer. StatusString += "Exception at: AddBitStreamRec().\r\nIn DomainX509Record.ProcessOneTag().\r\n"; StatusString += Except.Message + "\r\n"; return -1; } } // Just a rough draft, to see what's in them. if( TagVal == 4 ) // Octet String { for( int Count = 0; Count < Length; Count++ ) { char ContentChar = (char)TagsBuffer[Index]; Index++; // Make sure it has valid ASCII characters. if( ContentChar > 126 ) continue; if( ContentChar < 32 ) // Space character. continue; StatusString += Char.ToString( ContentChar ); } StatusString += "\r\n"; } // UTF8String. if( TagVal == 19 ) // Printable String { for( int Count = 0; Count < Length; Count++ ) { char ContentChar = (char)TagsBuffer[Index]; Index++; // Make sure it has valid ASCII characters. if( ContentChar > 126 ) // 127 is the ASCII DEL character. continue; if( ContentChar < 32 ) // Space character. continue; StatusString += Char.ToString( ContentChar ); } StatusString += "\r\n"; } if( TagVal == 22 ) // IA5 String { for( int Count = 0; Count < Length; Count++ ) { char ContentChar = (char)TagsBuffer[Index]; Index++; // Make sure it has valid ASCII characters. if( ContentChar > 126 ) continue; if( ContentChar < 32 ) // Space character. continue; StatusString += Char.ToString( ContentChar ); } StatusString += "\r\n"; } if( TagVal == 6 ) // Object Indentifier { if( Length < 2 ) { StatusString += "The Length can't be right for this OID.\r\n"; return -1; } byte[] CodedBytes = new byte[Length]; for( int Count = 0; Count < Length; Count++ ) { CodedBytes[Count] = TagsBuffer[Index]; Index++; } X509ObjectID X509ID = new X509ObjectID(); if( !X509ID.MakeFromBytes( CodedBytes )) { StatusString += "X509ID.MakeFromBytes() returned false.\r\n"; return -1; } MostRecentObjectIDString = X509ID.GetStringValue(); StatusString += X509ID.GetStatusString(); StatusString += "StringValue is: " + X509ID.GetStringValue() + "\r\n"; StatusString += "OID Name is: " + ObjectIDNames.GetNameFromDictionary( X509ID.GetStringValue()) + "\r\n"; } StatusString += "\r\n"; return Index; } catch( Exception Except ) { // Probably over-ran the buffer. StatusString += "Exception in DomainX509Record.ProcessOneTag().\r\n"; StatusString += Except.Message + "\r\n"; return -1; } }
internal void AddBitStreamRec( BitStreamRec Rec ) { // if( Rec == null ) // return false; BitStreamRecArray[BitStreamRecArrayLast] = Rec; BitStreamRecArrayLast++; if( BitStreamRecArrayLast >= BitStreamRecArray.Length ) { try { Array.Resize( ref BitStreamRecArray, BitStreamRecArray.Length + 8 ); } catch( Exception Except ) { throw( new Exception( "Couldn't resize the arrays for AddBitStreamRec(). " + Except.Message )); } } }