@@ -4,22 +4,43 @@ namespace GitCredentialManager
44{
55 public static class Base64UrlConvert
66 {
7+
8+ // The base64url format is the same as regular base64 format except:
9+ // 1. character 62 is "-" (minus) not "+" (plus)
10+ // 2. character 63 is "_" (underscore) not "/" (slash)
11+ // 3. padding is optional
12+ private const char base64PadCharacter = '=' ;
13+ private const char base64Character62 = '+' ;
14+ private const char base64Character63 = '/' ;
15+ private const char base64UrlCharacter62 = '-' ;
16+ private const char base64UrlCharacter63 = '_' ;
17+
718 public static string Encode ( byte [ ] data , bool includePadding = true )
819 {
9- const char base64PadCharacter = '=' ;
10- const char base64Character62 = '+' ;
11- const char base64Character63 = '/' ;
12- const char base64UrlCharacter62 = '-' ;
13- const char base64UrlCharacter63 = '_' ;
14-
15- // The base64url format is the same as regular base64 format except:
16- // 1. character 62 is "-" (minus) not "+" (plus)
17- // 2. character 63 is "_" (underscore) not "/" (slash)
1820 string base64Url = Convert . ToBase64String ( data )
1921 . Replace ( base64Character62 , base64UrlCharacter62 )
2022 . Replace ( base64Character63 , base64UrlCharacter63 ) ;
2123
2224 return includePadding ? base64Url : base64Url . TrimEnd ( base64PadCharacter ) ;
2325 }
26+
27+ public static byte [ ] Decode ( string data )
28+ {
29+ string base64 = data
30+ . Replace ( base64UrlCharacter62 , base64Character62 )
31+ . Replace ( base64UrlCharacter63 , base64Character63 ) ;
32+
33+ switch ( base64 . Length % 4 )
34+ {
35+ case 2 :
36+ base64 += base64PadCharacter ;
37+ goto case 3 ;
38+ case 3 :
39+ base64 += base64PadCharacter ;
40+ break ;
41+ }
42+
43+ return Convert . FromBase64String ( base64 ) ;
44+ }
2445 }
2546}
0 commit comments