diff --git a/Keyczar/Keyczar/KeySet/Metadata/KeyVersion.cs b/Keyczar/Keyczar/KeySet/Metadata/KeyVersion.cs index 26da1b9d..36350b0e 100644 --- a/Keyczar/Keyczar/KeySet/Metadata/KeyVersion.cs +++ b/Keyczar/Keyczar/KeySet/Metadata/KeyVersion.cs @@ -14,6 +14,7 @@ */ using System; +using System.ComponentModel; using System.Linq; using Keyczar.Util; using Newtonsoft.Json; @@ -86,8 +87,10 @@ public KeyVersion(KeyVersion keyVersion) /// /// The version number. public int VersionNumber { get; set; } + - + [DefaultValue("")] + [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)] public string Comment { get; set; } /// diff --git a/Keyczar/Keyczar/Unofficial/JwtSigner.cs b/Keyczar/Keyczar/Unofficial/JwtSigner.cs index fa87157a..78746a59 100644 --- a/Keyczar/Keyczar/Unofficial/JwtSigner.cs +++ b/Keyczar/Keyczar/Unofficial/JwtSigner.cs @@ -22,6 +22,11 @@ public string SignCompact(JObject payload) { return _signer.SignCompact(payload); } + + public string SignCompact(byte[] payload) + { + return _signer.SignCompact(payload); + } protected override void Dispose(bool disposing) { @@ -54,8 +59,8 @@ protected override void PostfixDataSign(HashingStream signingStream, object extr { } - - public string SignCompact(JObject payload) + + public string SignCompact(byte[] payload) { var key = this.GetPrimaryKey(); @@ -72,15 +77,15 @@ public string SignCompact(JObject payload) kid = WebBase64.FromBytes(key.GetKeyHash()) }; - + + var stringHeader = JsonConvert.SerializeObject(header); var encodedHeader = Jwt.EncodeToBase64(stringHeader); - var stringPayload = JsonConvert.SerializeObject(payload); - - var encodedPayload = Jwt.EncodeToBase64(stringPayload); + var encodedPayload = WebBase64.FromBytes(payload); + var input =Encoding.UTF8.GetBytes($"{encodedHeader}.{encodedPayload}"); using (var outStream = new MemoryStream()) using (var memStream = new MemoryStream(input)) @@ -88,8 +93,20 @@ public string SignCompact(JObject payload) Sign(memStream, outStream, null, null, input, -1); return Encoding.UTF8.GetString(outStream.ToArray()); } + + } + + public string SignCompact(JObject payload) + { + + var stringPayload = JsonConvert.SerializeObject(payload); + + return SignCompact(Encoding.UTF8.GetBytes(stringPayload)); + } + + protected override void PadSignature(byte[] signature, Stream outputStream, object extra) { var input = (byte[]) extra; diff --git a/Keyczar/Keyczar/Unofficial/JwtVerifier.cs b/Keyczar/Keyczar/Unofficial/JwtVerifier.cs index 2289e865..7ee17c0c 100644 --- a/Keyczar/Keyczar/Unofficial/JwtVerifier.cs +++ b/Keyczar/Keyczar/Unofficial/JwtVerifier.cs @@ -19,7 +19,7 @@ public class JwtVerifier:KeyczarBase public bool VerifyCompact(string input) { - return _verifier.VerifyCompact(input, out JObject payload); + return _verifier.VerifyCompact(input, out byte[] payload); } public bool VerifyCompact(string input, out JObject payload) @@ -27,6 +27,11 @@ public bool VerifyCompact(string input, out JObject payload) return _verifier.VerifyCompact(input, out payload); } + public bool VerifyCompact(string input, out byte[] payload) + { + return _verifier.VerifyCompact(input, out payload); + } + protected override void Dispose(bool disposing) { _verifier = _verifier.SafeDispose(); @@ -64,6 +69,17 @@ public override KeyczarConfig Config } public bool VerifyCompact(string input, out JObject payload) + { + if(VerifyCompact(input, out byte[] bytePayload)) + { + payload = JObject.Parse(Encoding.UTF8.GetString(bytePayload)); + return true; + } + payload = null; + return false; + } + + public bool VerifyCompact(string input, out byte[] payload) { var pieces = input.Split('.'); @@ -79,7 +95,7 @@ public bool VerifyCompact(string input, out JObject payload) var verify = Verify(message, Encoding.UTF8.GetBytes(input)); payload = verify - ? JObject.Parse(Jwt.DecodeToJsonString(pieces[1])) + ? ((WebBase64)(pieces[1])).ToBytes() : null; return verify; diff --git a/Keyczar/KeyczarTest/SignerTest.cs b/Keyczar/KeyczarTest/SignerTest.cs index 486fd85d..6fd19026 100644 --- a/Keyczar/KeyczarTest/SignerTest.cs +++ b/Keyczar/KeyczarTest/SignerTest.cs @@ -26,6 +26,7 @@ using Keyczar.Compat; using NUnit.Framework; using Keyczar; +using Keyczar.Unofficial; namespace KeyczarTest { @@ -91,17 +92,30 @@ public void TestPublicVerify(String subDir, string nestDir) public void TestPublicVerifySizes(String subDir, string nestDir) { var subPath = Util.TestDataPath(TEST_DATA, subDir, nestDir); - var ks = new FileSystemKeySet(subPath); - using (var verifier = new Verifier(subPath)) - using (var publicVerifier = new Verifier(subPath + ".public")) + using( var ks = new FileSystemKeySet(subPath)) + using(var pks = new FileSystemKeySet(subPath + ".public")) + using (var verifier = new Verifier(ks)) + using (var publicVerifier = new Verifier(pks)) + using (var jwtVerifier = new JwtVerifier(ks)) + using (var publicJwtVerifier = new JwtVerifier(pks)) { foreach (var size in ks.Metadata.GetKeyType(1).KeySizeOptions) { var activeSignature = - (WebBase64) File.ReadAllLines(Path.Combine(subPath, String.Format("{0}.out", size))).First(); + (WebBase64) File.ReadAllLines(Path.Combine(subPath, $@"{size}.out")).First(); Expect(verifier.Verify(input, activeSignature), Is.True); Expect(publicVerifier.Verify(input, activeSignature), Is.True); + + var jwtPath = Path.Combine(subPath, $@"{size}.jwt"); + + if (File.Exists(jwtPath)) + { + var activeToken = File.ReadAllLines(jwtPath).First(); + + Expect(jwtVerifier.VerifyCompact(activeToken), Is.True); + Expect(publicJwtVerifier.VerifyCompact(activeToken), Is.True); + } } } } @@ -111,17 +125,25 @@ public void TestPublicVerifySizes(String subDir, string nestDir) public void TestVerifySizes(String subDir, string nestDir) { var subPath = Util.TestDataPath(TEST_DATA, subDir, nestDir); - var ks = new FileSystemKeySet(subPath); - using (var verifier = new Verifier(subPath)) - using (var publicVerifier = new Verifier(subPath)) + using (var ks = new FileSystemKeySet(subPath)) + using (var verifier = new Verifier(ks)) + using (var jwtVerifier = new JwtVerifier(ks)) { foreach (var size in ks.Metadata.GetKeyType(1).KeySizeOptions) { var activeSignature = - (WebBase64)File.ReadAllLines(Path.Combine(subPath, String.Format("{0}.out", size))).First(); + (WebBase64)File.ReadAllLines(Path.Combine(subPath, $"{size}.out")).First(); Expect(verifier.Verify(input, activeSignature), Is.True); - Expect(publicVerifier.Verify(input, activeSignature), Is.True); + + var jwtPath = Path.Combine(subPath, $@"{size}.jwt"); + + if (File.Exists(jwtPath)) + { + var activeToken = File.ReadAllLines(jwtPath).First(); + + Expect(jwtVerifier.VerifyCompact(activeToken), Is.True); + } } } } diff --git a/Keyczar/KeyczarTool/Commands/UseKey.cs b/Keyczar/KeyczarTool/Commands/UseKey.cs index 3c8ba190..7db76456 100644 --- a/Keyczar/KeyczarTool/Commands/UseKey.cs +++ b/Keyczar/KeyczarTool/Commands/UseKey.cs @@ -192,7 +192,9 @@ private void EncodeData(Stream outstream, string destination) { var memstream = (MemoryStream) outstream; outstream.Flush(); - var encodedOutput = WebSafeBase64.Encode(memstream.ToArray()); + var encodedOutput = _format != WireFormat.SignJwt + ? WebBase64.FromBytes(memstream.ToArray()).ToString() + : Encoding.UTF8.GetString(memstream.ToArray()); if (String.IsNullOrWhiteSpace(destination)) { @@ -203,7 +205,7 @@ private void EncodeData(Stream outstream, string destination) if (File.Exists(destination)) throw new Exception("File already Exists!!"); - File.WriteAllText(destination, new string(encodedOutput)); + File.WriteAllText(destination, encodedOutput); } } diff --git a/Keyczar/TestData/remote-testdata b/Keyczar/TestData/remote-testdata index 465ab264..aafde2f3 160000 --- a/Keyczar/TestData/remote-testdata +++ b/Keyczar/TestData/remote-testdata @@ -1 +1 @@ -Subproject commit 465ab264fbe2c99ff4a02f53a5a61d529df73c46 +Subproject commit aafde2f3babaf954705b6910b35cbde146980f67