I use: Delphi JOSE and JWT Library and OpenSSL libraries version 1.0.2
uses
...
JSON,
System.DateUtils,
JOSE.Core.JWT,
JOSE.Core.JWS,
JOSE.Core.JWK,
JOSE.Core.JWA;
...
procedure TForm1.Button1Click(Sender: TObject);
var
LToken: TJWT;
LSigner: TJWS;
LKey: TJWK;
LAlg: TJOSEAlgorithmId;
LPrivateKey, LPublicKey, LClaims, LHeader: TJSONObject;
LKeys: TKeyPair;
begin
LToken := TJWT.Create;
LPrivateKey := TJSONObject.Create;
LPrivateKey.AddPair('kty', 'EC');
LPrivateKey.AddPair('alg', 'ES256');
LPrivateKey.AddPair('crv', 'P-256');
LPrivateKey.AddPair('x', 'sDbcYT8HzBk1tUl849ZHrhpIn8ZV7HfD1DwYdsP1ip0');
LPrivateKey.AddPair('y', 'EWodfKWQ6oE0ppyi7tRO_61BgAQsZyDjDGj9kLZiUts');
LPrivateKey.AddPair('d', 'Rwyv99W3GnfjYbI0X-b5Umhvh88oRCKQkPxiwCPVGgg');
LKeys := TKeyPair.Create;
LKeys.PrivateKey.Key := LPrivateKey.ToString;
LClaims := TJSONObject.Create;
LClaims.AddPair('email', 'myemail@mail.com');
LClaims.AddPair('aud', 'usr');
LClaims.AddPair('iat', TJSONNumber.Create(DateTimeToUnix(TTimeZone.Local.ToUniversalTime(now))));
LClaims.AddPair('jti', '0x'+IntToHex(Random(High(Integer))));
LHeader := TJSONObject.Create;
LHeader.AddPair('alg','ES256');
LHeader.AddPair('kid', '1');
LToken.Header.JSON := LHeader;
LToken.Claims.JSON := LClaims;
LAlg := TJOSEAlgorithmId.ES256;
LSigner := TJWS.Create(LToken);
LSigner.SkipKeyValidation := True;
// Sign the token!
LSigner.Sign(LKeys.PrivateKey, LAlg);
Memo1.Lines.Add('Header: ' + LSigner.Header);
Memo1.Lines.Add('Payload: ' + LSigner.Payload);
Memo1.Lines.Add('Signature: ' + LSigner.Signature);
Memo1.Lines.Add('Compact Token: ' + LSigner.CompactToken);
end;
The error occurs when signing a token:
Exception class ESignException with message '[ECDSA] Unable to load private key:
error:0906D06C:lib(9):func(109):reason(108)'
I suspect that the private key needs to be submitted in a different format. In the Delphi JOSE and JWT Library examples, the private key is stored in a PM-file and has the following format:
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIFzS3/5bCnrlpa4902/zkYzUQF6E2D8pazgnKu4smhpQoAoGCCqLSM49
AwEHoUQDQgBEqTjyg2z65i+zbyUXW8BQ+K87DNsICRaEH7Fy7Nm3MseXy9ItSCQU
VeJbtO6kYUA00mx7bKoC1sx5sbtFExnYPQ==
-----END EC PRIVATE KEY-----
It looks like base64, but when I convert my key to base64, the library returns the same error. I would be glad to any advice.