@@ -41,11 +41,11 @@ public static String BinaryToString(Byte[] rawData, EncodingType encoding = Enco
4141 if ( rawData == null || rawData . Length == 0 ) {
4242 return String . Empty ;
4343 }
44+ if ( PemHeader . ContainsEncoding ( encoding ) ) {
45+ return BinaryToStringFormatter . ToBase64 ( rawData , encoding , format , start , count ) ;
46+ }
4447 switch ( encoding ) {
4548 case EncodingType . Base64 :
46- case EncodingType . Base64Header :
47- case EncodingType . Base64CrlHeader :
48- case EncodingType . Base64RequestHeader :
4949 return BinaryToStringFormatter . ToBase64 ( rawData , encoding , format , start , count ) ;
5050 case EncodingType . Hex :
5151 return BinaryToStringFormatter . ToHex ( rawData , format , start , count , forceUpperCase ) ;
@@ -90,13 +90,20 @@ public static String BinaryToString(Byte[] rawData, EncodingType encoding = Enco
9090 /// </list>
9191 /// </remarks>
9292 public static String BinaryToString ( Asn1Reader asn , EncodingType encoding = EncodingType . HexRaw , EncodingFormat format = EncodingFormat . CRLF , Boolean forceUpperCase = false ) {
93- if ( asn == null ) { throw new ArgumentNullException ( nameof ( asn ) ) ; }
94- if ( asn . PayloadLength == 0 ) { return String . Empty ; }
93+ if ( asn == null ) {
94+ throw new ArgumentNullException ( nameof ( asn ) ) ;
95+ }
96+ if ( asn . PayloadLength == 0 ) {
97+ return String . Empty ;
98+ }
99+ if ( ( Int32 ) encoding > 20 && ( Int32 ) encoding < 45 ) {
100+ return BinaryToStringFormatter . ToBase64 ( asn . GetRawData ( ) , encoding , format , asn . PayloadStartOffset , asn . PayloadLength ) ;
101+ }
102+ if ( PemHeader . ContainsEncoding ( encoding ) ) {
103+ return BinaryToStringFormatter . ToBase64 ( asn . GetRawData ( ) , encoding , format , asn . PayloadStartOffset , asn . PayloadLength ) ;
104+ }
95105 switch ( encoding ) {
96106 case EncodingType . Base64 :
97- case EncodingType . Base64Header :
98- case EncodingType . Base64CrlHeader :
99- case EncodingType . Base64RequestHeader :
100107 return BinaryToStringFormatter . ToBase64 ( asn . GetRawData ( ) , encoding , format , asn . PayloadStartOffset , asn . PayloadLength ) ;
101108 case EncodingType . Hex :
102109 return BinaryToStringFormatter . ToHex ( asn . GetRawData ( ) , format , asn . PayloadStartOffset , asn . PayloadLength , forceUpperCase ) ;
@@ -120,53 +127,56 @@ public static String BinaryToString(Asn1Reader asn, EncodingType encoding = Enco
120127 /// <exception cref="ArgumentException">And invalid encoding is specified.</exception>
121128 /// <exception cref="InvalidDataException">The string cannot be decoded.</exception>
122129 /// <returns>Original byte array.</returns>
123- /// <remarks>This method may not be fully compatible with
124- /// <see cref="BinaryToString(Byte[],EncodingType,EncodingFormat,Int32,Int32,Boolean)">BinaryToString</see>
125- /// method.
130+ /// <remarks>
131+ /// This method may not be fully compatible with
132+ /// <see cref="BinaryToString(Byte[],EncodingType,EncodingFormat,Int32,Int32,Boolean)">BinaryToString</see>
133+ /// method.
134+ /// <para>
135+ /// If encoding parameter is set to <strong>Base64Header</strong>, the method will accept any properly formatted PEM header
136+ /// and footer.
137+ /// </para>
126138 /// </remarks>
127139 public static Byte [ ] StringToBinary ( String input , EncodingType encoding = EncodingType . Base64 ) {
128140 Byte [ ] rawData ;
129- switch ( encoding ) {
130- case EncodingType . Binary :
131- rawData = StringToBinaryFormatter . FromBinary ( input ) ;
132- break ;
133- case EncodingType . Base64 :
134- rawData = StringToBinaryFormatter . FromBase64 ( input ) ;
135- break ;
136- case EncodingType . Base64Header :
137- rawData = StringToBinaryFormatter . FromBase64Header ( input ) ;
138- break ;
139- case EncodingType . Base64CrlHeader :
140- rawData = StringToBinaryFormatter . FromBase64Crl ( input ) ;
141- break ;
142- case EncodingType . Base64RequestHeader :
143- rawData = StringToBinaryFormatter . FromBase64Request ( input ) ;
144- break ;
145- case EncodingType . Base64Any :
146- rawData = StringToBinaryFormatter . FromBase64Any ( input ) ;
147- break ;
148- case EncodingType . StringAny :
149- rawData = StringToBinaryFormatter . FromStringAny ( input ) ;
150- break ;
151- case EncodingType . Hex :
152- case EncodingType . HexRaw :
153- rawData = StringToBinaryFormatter . FromHex ( input ) ;
154- break ;
155- case EncodingType . HexAddress :
156- rawData = StringToBinaryFormatter . FromHexAddr ( input ) ;
157- break ;
158- case EncodingType . HexAscii :
159- rawData = StringToBinaryFormatter . FromHexAscii ( input ) ;
160- break ;
161- case EncodingType . HexAsciiAddress :
162- rawData = StringToBinaryFormatter . FromHexAddrAscii ( input ) ;
163- break ;
164- case EncodingType . HexAny :
165- rawData = StringToBinaryFormatter . FromHexAny ( input ) ;
166- break ;
167- default :
168- throw new ArgumentException ( "Invalid encoding type is specified." ) ;
141+ if ( PemHeader . ContainsEncoding ( encoding ) ) {
142+ var pemHeader = PemHeader . GetHeader ( encoding ) ;
143+ rawData = StringToBinaryFormatter . FromBase64Header ( input , pemHeader . GetHeader ( ) , pemHeader . GetFooter ( ) ) ;
144+ } else {
145+ switch ( encoding ) {
146+ case EncodingType . Binary :
147+ rawData = StringToBinaryFormatter . FromBinary ( input ) ;
148+ break ;
149+ case EncodingType . Base64 :
150+ rawData = StringToBinaryFormatter . FromBase64 ( input ) ;
151+ break ;
152+ case EncodingType . Base64Any :
153+ rawData = StringToBinaryFormatter . FromBase64Any ( input ) ;
154+ break ;
155+ case EncodingType . StringAny :
156+ rawData = StringToBinaryFormatter . FromStringAny ( input ) ;
157+ break ;
158+ case EncodingType . Hex :
159+ case EncodingType . HexRaw :
160+ rawData = StringToBinaryFormatter . FromHex ( input ) ;
161+ break ;
162+ case EncodingType . HexAddress :
163+ rawData = StringToBinaryFormatter . FromHexAddr ( input ) ;
164+ break ;
165+ case EncodingType . HexAscii :
166+ rawData = StringToBinaryFormatter . FromHexAscii ( input ) ;
167+ break ;
168+ case EncodingType . HexAsciiAddress :
169+ rawData = StringToBinaryFormatter . FromHexAddrAscii ( input ) ;
170+ break ;
171+ case EncodingType . HexAny :
172+ rawData = StringToBinaryFormatter . FromHexAny ( input ) ;
173+ break ;
174+ default :
175+ throw new ArgumentException ( "Invalid encoding type is specified." ) ;
176+ }
169177 }
178+
179+
170180 if ( rawData == null ) {
171181 throw new InvalidDataException ( "The data is invalid." ) ;
172182 }
@@ -180,13 +190,12 @@ public static Byte[] StringToBinary(String input, EncodingType encoding = Encodi
180190 /// Resolved input string format. If format cannot be determined, <string>Binary</string> type is returned.
181191 /// </returns>
182192 public static EncodingType TestInputString ( String input ) {
183- Byte [ ] rawBytes = StringToBinaryFormatter . FromBase64Crl ( input ) ;
184- if ( rawBytes != null ) {
185- return EncodingType . Base64CrlHeader ;
186- }
187- rawBytes = StringToBinaryFormatter . FromBase64Request ( input ) ;
188- if ( rawBytes != null ) {
189- return EncodingType . Base64RequestHeader ;
193+ Byte [ ] rawBytes ;
194+ foreach ( PemHeader pemHeader in PemHeader . GetPemHeaders ( ) ) {
195+ rawBytes = StringToBinaryFormatter . FromBase64Header ( input , pemHeader . GetHeader ( ) , pemHeader . GetFooter ( ) ) ;
196+ if ( rawBytes != null ) {
197+ return pemHeader . Encoding ;
198+ }
190199 }
191200 rawBytes = StringToBinaryFormatter . FromBase64Header ( input ) ;
192201 if ( rawBytes != null ) {
0 commit comments