|
@@ -38,6 +38,7 @@ type
|
|
function CreateUnsignedInput(JOSEAlg, ClaimsIssuer: string): string;
|
|
function CreateUnsignedInput(JOSEAlg, ClaimsIssuer: string): string;
|
|
Property JWT : TJWT Read FJWT;
|
|
Property JWT : TJWT Read FJWT;
|
|
Property Key : TJWTKey Read FKey;
|
|
Property Key : TJWTKey Read FKey;
|
|
|
|
+ procedure TestVerifyRSAPem(SignerClass: TJWTSignerRSAClass); virtual;
|
|
published
|
|
published
|
|
procedure TestSignNone;
|
|
procedure TestSignNone;
|
|
procedure TestVerifyNone;
|
|
procedure TestVerifyNone;
|
|
@@ -50,6 +51,8 @@ type
|
|
procedure TestVerifyES256;
|
|
procedure TestVerifyES256;
|
|
procedure TestVerifyES256Pem;
|
|
procedure TestVerifyES256Pem;
|
|
procedure TestVerifyRS256Pem;
|
|
procedure TestVerifyRS256Pem;
|
|
|
|
+ procedure TestVerifyRS384Pem;
|
|
|
|
+ procedure TestVerifyRS512Pem;
|
|
end;
|
|
end;
|
|
|
|
|
|
implementation
|
|
implementation
|
|
@@ -280,6 +283,52 @@ begin
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TTestJWT.TestVerifyRS256Pem;
|
|
procedure TTestJWT.TestVerifyRS256Pem;
|
|
|
|
+begin
|
|
|
|
+ TestVerifyRSAPem(TJWTSignerRS256);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+procedure TTestJWT.TestVerifyRS384Pem;
|
|
|
|
+begin
|
|
|
|
+ TestVerifyRSAPem(TJWTSignerRS384);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+procedure TTestJWT.TestVerifyRS512Pem;
|
|
|
|
+begin
|
|
|
|
+ TestVerifyRSAPem(TJWTSignerRS512);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+procedure TTestJWT.SetUp;
|
|
|
|
+begin
|
|
|
|
+ Inherited;
|
|
|
|
+ FKey:=TJWTKey.Create('mysecretkey');
|
|
|
|
+ FJWT:=TMyJWT.Create;
|
|
|
|
+ FJWT.JOSE.alg:='none';
|
|
|
|
+ FJWT.JOSE.typ:='JWT';
|
|
|
|
+ FJWT.Claims.sub:='1234567890';
|
|
|
|
+ FJWT.Claims.iat:=1516239022;
|
|
|
|
+ (FJWT.Claims as TMyClaims).Name:='John Doe';
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+procedure TTestJWT.TearDown;
|
|
|
|
+begin
|
|
|
|
+ FreeAndNil(FJWT);
|
|
|
|
+ FreeAndNil(FVerifyResult);
|
|
|
|
+ Inherited;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TTestJWT.CreateUnsignedInput(JOSEAlg, ClaimsIssuer: string): string;
|
|
|
|
+var
|
|
|
|
+ IssuedAt, Expire: Int64;
|
|
|
|
+ Header, Claims: String;
|
|
|
|
+begin
|
|
|
|
+ IssuedAt:=DateTimeToUnix(Now-1);
|
|
|
|
+ Expire:=IssuedAt+1000000;
|
|
|
|
+ Header:='{"typ":"JWT","alg":"'+JOSEAlg+'"}';
|
|
|
|
+ Claims:='{"iat":'+IntToStr(IssuedAt)+',"exp":'+IntToStr(Expire)+',"iss":"'+ClaimsIssuer+'"}';
|
|
|
|
+ Result:=Base64URL.Encode(Header,false)+'.'+Base64URL.Encode(Claims,false);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+procedure TTestJWT.TestVerifyRSAPem(SignerClass: TJWTSignerRSAClass);
|
|
const
|
|
const
|
|
// generated with
|
|
// generated with
|
|
// openssl genrsa -out private.pem 2048
|
|
// openssl genrsa -out private.pem 2048
|
|
@@ -313,10 +362,10 @@ const
|
|
'-----END RSA PRIVATE KEY-----'#10;
|
|
'-----END RSA PRIVATE KEY-----'#10;
|
|
var
|
|
var
|
|
aInput: String;
|
|
aInput: String;
|
|
- Signer: TJWTSignerRS256;
|
|
|
|
|
|
+ Signer: TJWTSignerRSA;
|
|
begin
|
|
begin
|
|
// header
|
|
// header
|
|
- jwt.JOSE.alg:='RS256';
|
|
|
|
|
|
+ jwt.JOSE.alg:=SignerClass.AlgorithmName;
|
|
|
|
|
|
// claims
|
|
// claims
|
|
jwt.Claims.exp:=DateTimeToUnix(Now+10);
|
|
jwt.Claims.exp:=DateTimeToUnix(Now+10);
|
|
@@ -325,7 +374,7 @@ begin
|
|
// load private key from pem
|
|
// load private key from pem
|
|
FKey.AsBytes:=PemToDER(APrivateKeyPem,_BEGIN_RSA_PRIVATE_KEY,_END_RSA_PRIVATE_KEY);
|
|
FKey.AsBytes:=PemToDER(APrivateKeyPem,_BEGIN_RSA_PRIVATE_KEY,_END_RSA_PRIVATE_KEY);
|
|
|
|
|
|
- Signer:=TJWTSignerRS256.Create;
|
|
|
|
|
|
+ Signer:=TJWTSignerRSA(SignerClass.Create);
|
|
try
|
|
try
|
|
aInput:=Signer.AppendSignature(JWT,Key);
|
|
aInput:=Signer.AppendSignature(JWT,Key);
|
|
finally
|
|
finally
|
|
@@ -337,44 +386,13 @@ begin
|
|
AssertEquals('Correct class',TMyJWT,FVerifyResult.ClassType);
|
|
AssertEquals('Correct class',TMyJWT,FVerifyResult.ClassType);
|
|
AssertNotNull('Have result.claims',FVerifyResult.Claims);
|
|
AssertNotNull('Have result.claims',FVerifyResult.Claims);
|
|
AssertEquals('Correct claims class',TMyClaims,FVerifyResult.Claims.ClassType);
|
|
AssertEquals('Correct claims class',TMyClaims,FVerifyResult.Claims.ClassType);
|
|
- AssertEquals('Have correct algorithm','RS256',FVerifyResult.JOSE.Alg);
|
|
|
|
|
|
+ AssertEquals('Have correct algorithm',SignerClass.AlgorithmName,FVerifyResult.JOSE.Alg);
|
|
AssertEquals('Have correct typ','JWT',FVerifyResult.JOSE.typ);
|
|
AssertEquals('Have correct typ','JWT',FVerifyResult.JOSE.typ);
|
|
AssertEquals('Have correct sub','1234567890',FVerifyResult.Claims.sub);
|
|
AssertEquals('Have correct sub','1234567890',FVerifyResult.Claims.sub);
|
|
AssertEquals('Have correct name','John Doe',(TMyJWT(FVerifyResult).Claims as TMyClaims).Name);
|
|
AssertEquals('Have correct name','John Doe',(TMyJWT(FVerifyResult).Claims as TMyClaims).Name);
|
|
AssertEquals('Have correct admin',False,(TMyJWT(FVerifyResult).Claims as TMyClaims).Admin);
|
|
AssertEquals('Have correct admin',False,(TMyJWT(FVerifyResult).Claims as TMyClaims).Admin);
|
|
end;
|
|
end;
|
|
|
|
|
|
-procedure TTestJWT.SetUp;
|
|
|
|
-begin
|
|
|
|
- Inherited;
|
|
|
|
- FKey:=TJWTKey.Create('mysecretkey');
|
|
|
|
- FJWT:=TMyJWT.Create;
|
|
|
|
- FJWT.JOSE.alg:='none';
|
|
|
|
- FJWT.JOSE.typ:='JWT';
|
|
|
|
- FJWT.Claims.sub:='1234567890';
|
|
|
|
- FJWT.Claims.iat:=1516239022;
|
|
|
|
- (FJWT.Claims as TMyClaims).Name:='John Doe';
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-procedure TTestJWT.TearDown;
|
|
|
|
-begin
|
|
|
|
- FreeAndNil(FJWT);
|
|
|
|
- FreeAndNil(FVerifyResult);
|
|
|
|
- Inherited;
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-function TTestJWT.CreateUnsignedInput(JOSEAlg, ClaimsIssuer: string): string;
|
|
|
|
-var
|
|
|
|
- IssuedAt, Expire: Int64;
|
|
|
|
- Header, Claims: String;
|
|
|
|
-begin
|
|
|
|
- IssuedAt:=DateTimeToUnix(Now-1);
|
|
|
|
- Expire:=IssuedAt+1000000;
|
|
|
|
- Header:='{"typ":"JWT","alg":"'+JOSEAlg+'"}';
|
|
|
|
- Claims:='{"iat":'+IntToStr(IssuedAt)+',"exp":'+IntToStr(Expire)+',"iss":"'+ClaimsIssuer+'"}';
|
|
|
|
- Result:=Base64URL.Encode(Header,false)+'.'+Base64URL.Encode(Claims,false);
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
initialization
|
|
initialization
|
|
RegisterTest(TTestJWT);
|
|
RegisterTest(TTestJWT);
|
|
end.
|
|
end.
|