예제 #1
0
파일: JWK.cs 프로젝트: bently0602/JWK
 /// <summary>
 /// Create a JWK with optionally all elements
 /// </summary>
 /// <param name="keyType"></param>
 /// <param name="keyParameters"></param>
 /// <param name="publicKeyUse"></param>
 /// <param name="keyOperations"></param>
 /// <param name="algorithm"></param>
 /// <param name="keyId"></param>
 public JWK(KeyType keyType, Dictionary <KeyParameter, string> keyParameters, PublicKeyUse publicKeyUse = null, IEnumerable <KeyOperation> keyOperations = null, Algorithm algorithm = null, string keyId = null) : this(keyType, keyParameters)
 {
     PublicKeyUse  = publicKeyUse;
     KeyOperations = new HashSet <KeyOperation>(keyOperations);
     Algorithm     = algorithm;
     KeyID         = keyId;
 }
예제 #2
0
        public void JWKWithECKeyRoundTrip()
        {
            KeyType      keyType       = KeyType.EllipticCurve;
            PublicKeyUse keyUse        = PublicKeyUse.Signature;
            var          keyOperations = new HashSet <KeyOperation>(new[] { KeyOperation.ComputeDigitalSignature, KeyOperation.VerifyDigitalSignature });
            Algorithm    algorithm     = Algorithm.ES256;
            var          keyParameters = new Dictionary <KeyParameter, string>
            {
                { ECKeyParameterCRV, "curveName" },
                { ECKeyParameterX, "publicKeyX" },
                { ECKeyParameterY, "publicKeyY" },
                { ECKeyParameterD, "privateKeyD" }
            };
            JWK jwk = new JWK(keyType, keyParameters, keyUse, keyOperations, algorithm, "test");

            string jwkString = jwk.Export(true);
            var    parsedJWK = JObject.Parse(jwkString);

            parsedJWK.GetValue("crv").ToString().Should().Be(keyParameters.GetValueOrDefault(ECKeyParameterCRV));
            parsedJWK.GetValue("x").ToString().Should().Be(keyParameters.GetValueOrDefault(ECKeyParameterX));
            parsedJWK.GetValue("y").ToString().Should().Be(keyParameters.GetValueOrDefault(ECKeyParameterY));
            parsedJWK.GetValue("d").ToString().Should().Be(keyParameters.GetValueOrDefault(ECKeyParameterD));
            parsedJWK.GetValue("kid").ToString().Should().Be("test");

            jwk = new JWK(jwkString);
            jwk.KeyType.Should().Be(keyType);
            jwk.PublicKeyUse.Should().Be(keyUse);
            jwk.KeyOperations.Should().BeEquivalentTo(keyOperations);
            jwk.Algorithm.Should().Be(algorithm);
            jwk.KeyParameters.Should().BeEquivalentTo(keyParameters);
        }
예제 #3
0
        public void JWKWithAESKeyParametersCanBeCreated()
        {
            KeyType      keyType       = KeyType.RSA;
            PublicKeyUse keyUse        = PublicKeyUse.Signature;
            var          keyOperations = new HashSet <KeyOperation>(new[] { KeyOperation.ComputeDigitalSignature, KeyOperation.VerifyDigitalSignature });
            Algorithm    algorithm     = Algorithm.ES256;
            var          keyParameters = new Dictionary <KeyParameter, string>
            {
                { RSAKeyParameterN, "modulus" },
                { RSAKeyParameterE, "exponent" },
                { RSAKeyParameterD, "privateExponent" },
                { RSAKeyParameterP, "firstPrimeFactor" },
                { RSAKeyParameterQ, "secondPrimeFactor" },
                { RSAKeyParameterDP, "firstFactorCRTExponent" },
                { RSAKeyParameterDQ, "secondFactorCRTExponent" },
                { RSAKeyParameterQI, "firstCRTCoefficient" }
            };
            JWK jwk = new JWK(keyType, keyParameters, keyUse, keyOperations, algorithm, "test");

            string jwkString = jwk.Export(true);
            var    parsedJWK = JObject.Parse(jwkString);

            parsedJWK.GetValue("n").ToString().Should().Be(keyParameters.GetValueOrDefault(RSAKeyParameterN));
            parsedJWK.GetValue("e").ToString().Should().Be(keyParameters.GetValueOrDefault(RSAKeyParameterE));
            parsedJWK.GetValue("d").ToString().Should().Be(keyParameters.GetValueOrDefault(RSAKeyParameterD));
            parsedJWK.GetValue("p").ToString().Should().Be(keyParameters.GetValueOrDefault(RSAKeyParameterP));
            parsedJWK.GetValue("q").ToString().Should().Be(keyParameters.GetValueOrDefault(RSAKeyParameterQ));
            parsedJWK.GetValue("dp").ToString().Should().Be(keyParameters.GetValueOrDefault(RSAKeyParameterDP));
            parsedJWK.GetValue("dq").ToString().Should().Be(keyParameters.GetValueOrDefault(RSAKeyParameterDQ));
            parsedJWK.GetValue("qi").ToString().Should().Be(keyParameters.GetValueOrDefault(RSAKeyParameterQI));
            parsedJWK.GetValue("kid").ToString().Should().Be("test");
        }
예제 #4
0
        public void JWKCheckECPrivateKeyParametersExport()
        {
            PublicKeyUse keyUse        = PublicKeyUse.Signature;
            var          keyOperations = new HashSet <KeyOperation>(new[] { KeyOperation.ComputeDigitalSignature, KeyOperation.VerifyDigitalSignature });
            Algorithm    algorithm     = Algorithm.ES256;
            JWK          jwk           = new JWK(algorithm, keyUse, keyOperations);

            string jwkString = jwk.Export(false);
            var    parsedJWK = JObject.Parse(jwkString);

            parsedJWK.TryGetValue("kty", out var _).Should().BeTrue();
            parsedJWK.TryGetValue("alg", out var _).Should().BeTrue();
            parsedJWK.TryGetValue("use", out var _).Should().BeTrue();
            parsedJWK.TryGetValue("kid", out var _).Should().BeTrue();
            parsedJWK.TryGetValue("crv", out var _).Should().BeTrue();
            parsedJWK.TryGetValue("x", out var _).Should().BeTrue();
            parsedJWK.TryGetValue("y", out var _).Should().BeTrue();
            parsedJWK.TryGetValue("d", out var _).Should().BeFalse();

            parsedJWK.GetValue("kty").ToString().Should().Be("EC");
            parsedJWK.GetValue("alg").ToString().Should().Be(Algorithm.ES256.Name);
            parsedJWK.GetValue("use").ToString().Should().Be(PublicKeyUse.Signature.KeyUse);
            parsedJWK.GetValue("key_ops").Values <string>().Count().Should().Be(2);
            parsedJWK.GetValue("key_ops").Values <string>().Should().BeEquivalentTo(new[] { KeyOperation.ComputeDigitalSignature.Operation, KeyOperation.VerifyDigitalSignature.Operation });
        }
예제 #5
0
파일: JWK.cs 프로젝트: bently0602/JWK
        /// <summary>
        /// Create a JWK by only providing a specific algorithm. A new key for the corresponding algorithm is generated in the background
        /// </summary>
        /// <param name="algorithm"></param>
        /// <param name="publicKeyUse"></param>
        /// <param name="keyOperations"></param>
        public JWK(Algorithm algorithm, PublicKeyUse publicKeyUse = null, IEnumerable <KeyOperation> keyOperations = null)
        {
            PublicKeyUse  = publicKeyUse;
            KeyOperations = keyOperations;
            Algorithm     = algorithm;
            KeyID         = Guid.NewGuid().ToString();
            KeyType       = DeriveKeyType(algorithm);

            InitializeKey();
        }
예제 #6
0
        static void Main(string[] args)
        {
            Console.WriteLine("Implementation of JSON Web Keys (RFC7517)");

            JWK           jwk           = new JWK();
            PublicKeyUse  keyUse        = PublicKeyUse.Signature;
            KeyOperations keyOperations = KeyOperations.ComputeDigitalSignature;
            Algorithm     algorithm     = Algorithm.ES256;
            string        jwkString     = jwk.JWKfromOptions(keyUse, keyOperations, algorithm);

            Console.WriteLine(jwkString);
        }