Skip to content

Instantly share code, notes, and snippets.

@achechulin
Created September 21, 2022 10:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save achechulin/32128d922589fc06c98e9eb0595bfc24 to your computer and use it in GitHub Desktop.
Save achechulin/32128d922589fc06c98e9eb0595bfc24 to your computer and use it in GitHub Desktop.
Use DerParse instead of AsnParse
procedure DerToEccSign(const algo: TCryptAsymAlgo; const sign_der: RawByteString;
var sign: RawUtf8);
const
DER_SEQUENCE = #$30;
CAA_ECCBYTES: array[TCryptAsymAlgo] of Integer = (
32, // caaES256
48, // caaES384
66, // caaES512
32, // caaES256K
0, // caaRS256
0, // caaRS384
0, // caaRS512
0, // caaPS256
0, // caaPS384
0, // caaPS512
32); // caaEdDSA
var
derlen: Cardinal;
der: PByteArray;
eccbytes: Integer;
buf: array [0..131] of AnsiChar;
len: Integer;
begin
if algo = caaEdDSA then
begin
sign := BinToBase64uri(pointer(sign_der), length(sign_der));
exit;
end;
derlen := length(sign_der);
der := PByteArray(sign_der);
if (derlen < 50) or
(der[0] <> ord(DER_SEQUENCE)) or
(der[1] > derlen - 2) then
exit;
eccbytes := CAA_ECCBYTES[algo];
if der[1] and $80 <> 0 then
begin
// 2-byte length
assert((der[1] and $7f) = 1);
len := der[2];
if DerParse(DerParse(@der[3], @buf[0], eccbytes),
@buf[eccbytes], eccbytes) <> PAnsiChar(@der[len + 3]) then
exit;
end
else
begin
len := der[1];
if DerParse(DerParse(@der[2], @buf[0], eccbytes),
@buf[eccbytes], eccbytes) <> PAnsiChar(@der[len + 2]) then
exit;
end;
sign := BinToBase64uri(@buf[0], eccbytes * 2);
end;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment