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