Skip to content

Commit 8cec32c

Browse files
sgramponeBeta Bot
authored and
Beta Bot
committed
Cherry pick branch 'genexuslabs:gamutils_eo' into beta
1 parent dde2e65 commit 8cec32c

File tree

1 file changed

+25
-8
lines changed
  • dotnet/src/extensions/gam/src/DotNetFramework/GamUtils/Utils

1 file changed

+25
-8
lines changed

dotnet/src/extensions/gam/src/DotNetFramework/GamUtils/Utils/Pkce.cs

+25-8
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
using System;
12
using System.Security;
3+
using System.Security.Cryptography;
4+
using System.Text;
5+
using System.Web;
26
using GeneXus;
37
using log4net;
48
using Org.BouncyCastle.Crypto;
@@ -16,14 +20,15 @@ public class Pkce
1620
internal static string Create(int len, string option)
1721
{
1822
logger.Trace("Create");
19-
string code_verifier = Random.Alphanumeric(len);
23+
byte[] code_verifier_bytes = GetRandomBytes(len);
24+
string code_verifier = System.Text.Encoding.UTF8.GetString(UrlBase64.Encode(code_verifier_bytes));
2025
switch (option.ToUpper().Trim())
2126
{
2227
case "S256":
23-
byte[] digest = Hash(new Sha256Digest(), System.Text.Encoding.UTF8.GetBytes(code_verifier.Trim()));
24-
return $"{code_verifier.Trim()},{System.Text.Encoding.UTF8.GetString(UrlBase64.Encode(digest))}";
28+
byte[] digest = Hash(new Sha256Digest(), System.Text.Encoding.ASCII.GetBytes(code_verifier));
29+
return $"{code_verifier},{Jose.Base64Url.Encode(digest)}";
2530
case "PLAIN":
26-
return $"{code_verifier.Trim()},{Encoding.ToBase64Url(code_verifier.Trim())}";
31+
return $"{code_verifier},{code_verifier}";
2732
default:
2833
logger.Error("Unknown PKCE option");
2934
return "";
@@ -37,11 +42,10 @@ public static bool Verify(string code_verifier, string code_challenge, string op
3742
switch (option.ToUpper().Trim())
3843
{
3944
case "S256":
40-
byte[] digest = Hash(new Sha256Digest(), System.Text.Encoding.UTF8.GetBytes(code_verifier.Trim()));
41-
return System.Text.Encoding.UTF8.GetString(UrlBase64.Encode(digest)).Equals(code_challenge.Trim());
45+
byte[] digest = Hash(new Sha256Digest(), System.Text.Encoding.ASCII.GetBytes(code_verifier));
46+
return Jose.Base64Url.Encode(digest).Equals(code_challenge.Trim());
4247
case "PLAIN":
43-
byte[] bytes_plain = UrlBase64.Decode(System.Text.Encoding.UTF8.GetBytes(code_challenge.Trim()));
44-
return System.Text.Encoding.UTF8.GetString(bytes_plain).Equals(code_verifier.Trim());
48+
return code_challenge.Trim().Equals(code_verifier.Trim());
4549
default:
4650
logger.Error("Unknown PKCE option");
4751
return false;
@@ -55,5 +59,18 @@ private static byte[] Hash(IDigest digest, byte[] inputBytes)
5559
digest.DoFinal(retValue, 0);
5660
return retValue;
5761
}
62+
63+
private static byte[] GetRandomBytes(int len)
64+
{
65+
byte[] data = new byte[len];
66+
#if NETCORE
67+
var arraySpan = new Span<byte>(data);
68+
System.Security.Cryptography.RandomNumberGenerator.Fill(arraySpan);
69+
#else
70+
RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();
71+
crypto.GetBytes(data);
72+
#endif
73+
return data;
74+
}
5875
}
5976
}

0 commit comments

Comments
 (0)