Skip to content

Commit 791e3d8

Browse files
authored
Merge pull request #4 from rjmcguire/nopadding
do not pad any base64 output
2 parents e65c1d8 + 92822f9 commit 791e3d8

File tree

1 file changed

+15
-18
lines changed

1 file changed

+15
-18
lines changed

source/fastjwt/jwt.d

+15-18
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import vibe.data.json;
44

55
//import fastjwt.stringbuf;
66
import stringbuffer;
7+
import std.base64 : Base64Impl, Base64;
78

89
version(unittest) {
910
import std.stdio;
@@ -16,13 +17,12 @@ enum JWTAlgorithm {
1617
HS512
1718
}
1819

20+
alias URLSafeBase64 = Base64Impl!('-', '_', Base64.NoPadding);
21+
1922
void hash(ref StringBuffer buf, string data, string secret, JWTAlgorithm alg) {
2023
import std.digest.hmac;
2124
import std.digest.sha;
2225
import std.string : representation;
23-
import std.base64 : Base64Impl;
24-
25-
alias URLSafeBase64 = Base64Impl!('-', '_', Base64.NoPadding);
2626

2727
final switch(alg) {
2828
case JWTAlgorithm.HS256:
@@ -45,13 +45,11 @@ void hash(ref StringBuffer buf, string data, string secret, JWTAlgorithm alg) {
4545
}
4646
}
4747

48-
import std.base64;
49-
5048
const base64HeaderStrings = [
51-
Base64.encode(cast(ubyte[])"{\"alg\":\"none\",\"typ\":\"JWT\"}"),
52-
Base64.encode(cast(ubyte[])"{\"alg\":\"HS256\",\"typ\":\"JWT\"}"),
53-
Base64.encode(cast(ubyte[])"{\"alg\":\"HS384\",\"typ\":\"JWT\"}"),
54-
Base64.encode(cast(ubyte[])"{\"alg\":\"HS512\",\"typ\":\"JWT\"}")
49+
URLSafeBase64.encode(cast(ubyte[])"{\"alg\":\"none\",\"typ\":\"JWT\"}"),
50+
URLSafeBase64.encode(cast(ubyte[])"{\"alg\":\"HS256\",\"typ\":\"JWT\"}"),
51+
URLSafeBase64.encode(cast(ubyte[])"{\"alg\":\"HS384\",\"typ\":\"JWT\"}"),
52+
URLSafeBase64.encode(cast(ubyte[])"{\"alg\":\"HS512\",\"typ\":\"JWT\"}")
5553
];
5654

5755
void headerBase64(Out)(const JWTAlgorithm alg, ref Out output) {
@@ -72,7 +70,7 @@ void payloadToBase64(Out)(ref Out output, const(Json) payload) {
7270
Base64.encode(jsonString.getData!(ubyte[])(), output.writer());
7371
}
7472

75-
void payloadToBase64(Out,Args...)(ref Out output, Args args)
73+
void payloadToBase64(Out,Args...)(ref Out output, Args args)
7674
if(args.length > 0 && args.length % 2 == 0 && !is(args[0] == Json))
7775
{
7876
import std.format : formattedWrite;
@@ -91,7 +89,7 @@ void payloadToBase64(Out,Args...)(ref Out output, Args args)
9189
} else static if(is(S == bool)) {
9290
formattedWrite(loutput, "\"%s\":%s", t, s);
9391
}
94-
92+
9593
static if(args.length > 0) {
9694
impl(loutput, false, args);
9795
}
@@ -102,12 +100,11 @@ void payloadToBase64(Out,Args...)(ref Out output, Args args)
102100
w.put("{");
103101
impl(w, true, args);
104102
w.put("}");
105-
106-
Base64.encode(jsonString.getData!(ubyte[])(), output.writer());
103+
URLSafeBase64.encode(jsonString.getData!(ubyte[])(), output.writer());
107104
}
108105

109106
unittest {
110-
Json j1 = Json(["field1": Json("foo"), "field2": Json(42),
107+
Json j1 = Json(["field1": Json("foo"), "field2": Json(42),
111108
"field3": Json(true)]
112109
);
113110

@@ -189,8 +186,8 @@ Params:
189186
190187
Returns: 0 if everything is ok, everything means the token is not ok
191188
*/
192-
int decodeJWTToken(string encodedToken, string secret,
193-
JWTAlgorithm algo, ref StringBuffer header, ref StringBuffer payload)
189+
int decodeJWTToken(string encodedToken, string secret,
190+
JWTAlgorithm algo, ref StringBuffer header, ref StringBuffer payload)
194191
{
195192
import std.algorithm.iteration : splitter;
196193
import std.string : indexOf;
@@ -215,8 +212,8 @@ int decodeJWTToken(string encodedToken, string secret,
215212
return 3;
216213
}
217214

218-
Base64.decode(encodedToken[0 .. dots[0]], header.writer());
219-
Base64.decode(encodedToken[dots[0] + 1 .. dots[1]], payload.writer());
215+
URLSafeBase64.decode(encodedToken[0 .. dots[0]], header.writer());
216+
URLSafeBase64.decode(encodedToken[dots[0] + 1 .. dots[1]], payload.writer());
220217

221218
return 0;
222219
}

0 commit comments

Comments
 (0)