コード例 #1
0
ファイル: RSAPKCS1Algorithm.cs プロジェクト: MaxDeg/NJose
        public byte[] Sign(JoseHeader header, string data)
        {
            if (header == null)
            {
                throw new ArgumentNullException(nameof(header));
            }
            if (string.IsNullOrWhiteSpace(data))
            {
                throw new ArgumentNullException(nameof(data));
            }
            if (this.privateKey == null)
            {
                throw new InvalidOperationException("Private key not defined");
            }
            if (this.Disposed)
            {
                throw new ObjectDisposedException(this.GetType().Name);
            }

            RSAPKCS1SignatureFormatter rsaFormatter = new RSAPKCS1SignatureFormatter(this.privateKey);

            rsaFormatter.SetHashAlgorithm(this.hashAlgorithm);

            return(rsaFormatter.CreateSignature(ASCII.GetBytes(data)));
        }
コード例 #2
0
ファイル: JWSCompactSerializer.cs プロジェクト: MaxDeg/NJose
        public async Task <JsonWebToken> DeserializeAsync(string token)
        {
            if (token == null)
            {
                throw new ArgumentNullException(nameof(token));
            }

            var splittedToken = token.Split('.');

            // JWS compact token has always 3 parts
            if (splittedToken.Length != 3)
            {
                throw new InvalidJsonWebSignatureToken("invalid token format");
            }

            var header = JoseHeader.Parse(UTF8.GetString(splittedToken[0].FromBase64Url()));

            // the algorithm must be the same to avoid vulnerabilities
            if (this.algorithm.Name != header.Algorithm)
            {
                throw new InvalidJsonWebSignatureToken("Algorithms mismatch");
            }

            var payload       = UTF8.GetString(splittedToken[1].FromBase64Url());
            var signature     = splittedToken.Skip(2).Single().FromBase64Url();
            var contentToSign = string.Join(".", splittedToken.Take(2));

            if (!await this.algorithm.VerifyAsync(header, contentToSign, signature))
            {
                throw new InvalidJsonWebSignatureToken("signatures mismatch");
            }

            return(JsonWebToken.Parse(payload));
        }
コード例 #3
0
ファイル: NoAlgorithm.cs プロジェクト: MaxDeg/NJose
        public bool Verify(JoseHeader header, string payload, byte[] signature)
        {
            if (signature == null)
                throw new ArgumentNullException(nameof(signature));
            if (this.disposed)
                throw new ObjectDisposedException(this.GetType().Name);

            return Array.Empty<byte>().SequenceEqual(signature);
        }
コード例 #4
0
ファイル: JWSCompactSerializer.cs プロジェクト: MaxDeg/NJose
        public string Serialize(string payload, JoseHeader header)
        {
            if (payload == null)
                throw new ArgumentNullException(nameof(payload));

            header.Algorithm = this.algorithm.Name;

            var contentToSign = string.Join(".", header.ToJson().ToBase64Url(), payload.ToBase64Url());
            var signature = this.algorithm.Sign(header, contentToSign).ToBase64Url();

            return string.Join(".", header.ToJson().ToBase64Url(), payload.ToBase64Url(), signature);
        }
コード例 #5
0
        public void Set(string src)
        {
            var token = src.Split('.');
            if (token == null || token.Length != 3)
            {
                throw new IllegalEncryptionTokenException();
            }

            joseHeader = new JoseHeader();
            joseHeader.SetSerialize(token[0]);
            payload = Base64.base64urldecode(token[1]);
            signature = Base64.base64urldecode(token[2]);
        }
コード例 #6
0
ファイル: NoAlgorithm.cs プロジェクト: MaxDeg/NJose
        public bool Verify(JoseHeader header, string payload, byte[] signature)
        {
            if (signature == null)
            {
                throw new ArgumentNullException(nameof(signature));
            }
            if (this.disposed)
            {
                throw new ObjectDisposedException(this.GetType().Name);
            }

            return(Array.Empty <byte>().SequenceEqual(signature));
        }
コード例 #7
0
ファイル: JWSCompactSerializer.cs プロジェクト: MaxDeg/NJose
        public string Serialize(string payload, JoseHeader header)
        {
            if (payload == null)
            {
                throw new ArgumentNullException(nameof(payload));
            }

            header.Algorithm = this.algorithm.Name;

            var contentToSign = string.Join(".", header.ToJson().ToBase64Url(), payload.ToBase64Url());
            var signature     = this.algorithm.Sign(header, contentToSign).ToBase64Url();

            return(string.Join(".", header.ToJson().ToBase64Url(), payload.ToBase64Url(), signature));
        }
コード例 #8
0
        public void Set(string src)
        {
            var token = src.Split('.');
            if (token == null || token.Length != 5)
            {
                throw new IllegalEncryptionTokenException();
            }

            joseHeader = new JoseHeader();
            joseHeader.SetSerialize(token[0]);
            cek = Base64.base64urldecode(token[1]);
            iv = Base64.base64urldecode(token[2]);
            cipherText = Base64.base64urldecode(token[3]);
            at = Base64.base64urldecode(token[4]);
        }
コード例 #9
0
ファイル: HMACAlgorithm.cs プロジェクト: MaxDeg/NJose
        public byte[] Sign(JoseHeader header, string data)
        {
            if (header == null)
            {
                throw new ArgumentNullException(nameof(header));
            }
            if (string.IsNullOrWhiteSpace(data))
            {
                throw new ArgumentNullException(nameof(data));
            }
            if (this.Disposed)
            {
                throw new ObjectDisposedException(this.GetType().Name);
            }

            return(this.HashAlgorithm.ComputeHash(ASCII.GetBytes(data)));
        }
コード例 #10
0
ファイル: RSAPKCS1Algorithm.cs プロジェクト: MaxDeg/NJose
        public bool VerifyInternal(JoseHeader header, string data, byte[] signature)
        {
            if (string.IsNullOrWhiteSpace(data))
            {
                throw new ArgumentNullException(nameof(data));
            }
            if (signature == null || signature.Length == 0)
            {
                throw new ArgumentNullException(nameof(signature));
            }

            RSAPKCS1SignatureDeformatter rsaDeformatter = new RSAPKCS1SignatureDeformatter(this.publicKey);

            rsaDeformatter.SetHashAlgorithm(this.hashAlgorithm);

            return(rsaDeformatter.VerifySignature(ASCII.GetBytes(data), signature));
        }
コード例 #11
0
ファイル: RSAPKCS1Algorithm.cs プロジェクト: MaxDeg/NJose
        public async Task <bool> VerifyAsync(JoseHeader header, string data, byte[] signature)
        {
            if (header == null)
            {
                throw new ArgumentNullException(nameof(header));
            }
            if (this.Disposed)
            {
                throw new ObjectDisposedException(this.GetType().Name);
            }

            // Get it from header :)
            if (this.publicKey == null)
            {
                this.SetKey(await header.GetPublicKeyAsync());
            }

            return(this.VerifyInternal(header, data, signature));
        }
コード例 #12
0
ファイル: HMACAlgorithm.cs プロジェクト: MaxDeg/NJose
        public bool Verify(JoseHeader header, string data, byte[] signature)
        {
            if (header == null)
            {
                throw new ArgumentNullException(nameof(header));
            }
            if (string.IsNullOrWhiteSpace(data))
            {
                throw new ArgumentNullException(nameof(data));
            }
            if (signature == null || signature.Length == 0)
            {
                throw new ArgumentNullException(nameof(signature));
            }
            if (this.Disposed)
            {
                throw new ObjectDisposedException(this.GetType().Name);
            }

            return(this.Sign(header, data).SequenceEqual(signature));
        }
コード例 #13
0
        public async Task Verify_RS512_Algorithm_Serialization()
        {
            var keySet = await JWKSet.GetAsync(this.keySetUri);

            var key = keySet["rsa-512"];

            var token = new JsonWebToken {
                Issuer = "joe", ExpirationTime = 1300819380
            };

            token.AddClaim("http://example.com/is_root", true);
            var header = new JoseHeader()
            {
                JwkSetUrl = this.keySetUri, KeyId = "rsa-512"
            };

            var serializer        = new JWSCompactSerializer(new RS512Algorithm(privateKey: key));
            var strToken          = serializer.Serialize(token.ToJson(), header);
            var deserializedToken = await serializer.DeserializeAsync(strToken);

            Assert.AreEqual(token.ToJson(), deserializedToken.ToJson());
        }
コード例 #14
0
ファイル: NoAlgorithm.cs プロジェクト: MaxDeg/NJose
 public byte[] Sign(JoseHeader header, string payload)
 {
     // No signature for this algorithm type ;)
     return(Array.Empty <byte>());
 }
コード例 #15
0
ファイル: RSAPKCS1Algorithm.cs プロジェクト: MaxDeg/NJose
        public byte[] Sign(JoseHeader header, string data)
        {
            if (header == null)
                throw new ArgumentNullException(nameof(header));
            if (string.IsNullOrWhiteSpace(data))
                throw new ArgumentNullException(nameof(data));
            if (this.privateKey == null)
                throw new InvalidOperationException("Private key not defined");
            if (this.Disposed)
                throw new ObjectDisposedException(this.GetType().Name);

            RSAPKCS1SignatureFormatter rsaFormatter = new RSAPKCS1SignatureFormatter(this.privateKey);
            rsaFormatter.SetHashAlgorithm(this.hashAlgorithm);

            return rsaFormatter.CreateSignature(ASCII.GetBytes(data));
        }
コード例 #16
0
ファイル: JoseHeaderUnitTest.cs プロジェクト: MaxDeg/NJose
 public void Critical_Header_As_String()
 {
     JoseHeader.Parse(@"{ typ: 'example', cty: 'application/example;part=""1/2""', crit: 'test', 'test': 'dsgffgdf' }");
 }
コード例 #17
0
ファイル: JoseHeaderUnitTest.cs プロジェクト: MaxDeg/NJose
 public void Critical_Header_As_List()
 {
     JoseHeader.Parse(@"{ typ: 'example', cty: 'application/example;part=""1/2""', crit: ['test', 'tt'], 'test': 'dsgffgdf', 'tt': '..' }");
 }
コード例 #18
0
 public JweSerializer(JoseHeader header, string payload, string key)
 {
     this.jweStructure.joseHeader = header;
     this.payload = payload;
     this.key = StringUtils.StringToByte(key);
 }
コード例 #19
0
 public string Serialize(string token, JoseHeader header)
 {
     // sign token with all algorithm in the order
     throw new NotImplementedException();
 }
コード例 #20
0
ファイル: NoAlgorithm.cs プロジェクト: MaxDeg/NJose
 public byte[] Sign(JoseHeader header, string payload)
 {
     // No signature for this algorithm type ;)
     return Array.Empty<byte>();
 }
コード例 #21
0
ファイル: NoAlgorithm.cs プロジェクト: MaxDeg/NJose
 public Task<bool> VerifyAsync(JoseHeader header, string payload, byte[] signature)
 {
     throw new InvalidOperationException();
 }
コード例 #22
0
 public JwsSerializer(JoseHeader header, string payload, string key)
 {
     jwsStructure.joseHeader = header;
     jwsStructure.payload = StringUtils.StringToByte(payload);
     this.key = StringUtils.StringToByte(key);
 }
コード例 #23
0
ファイル: RSAPKCS1Algorithm.cs プロジェクト: MaxDeg/NJose
        public bool VerifyInternal(JoseHeader header, string data, byte[] signature)
        {
            if (string.IsNullOrWhiteSpace(data))
                throw new ArgumentNullException(nameof(data));
            if (signature == null || signature.Length == 0)
                throw new ArgumentNullException(nameof(signature));

            RSAPKCS1SignatureDeformatter rsaDeformatter = new RSAPKCS1SignatureDeformatter(this.publicKey);
            rsaDeformatter.SetHashAlgorithm(this.hashAlgorithm);

            return rsaDeformatter.VerifySignature(ASCII.GetBytes(data), signature);
        }
コード例 #24
0
ファイル: NoAlgorithm.cs プロジェクト: MaxDeg/NJose
 public Task <bool> VerifyAsync(JoseHeader header, string payload, byte[] signature)
 {
     throw new InvalidOperationException();
 }
コード例 #25
0
ファイル: RSAPKCS1Algorithm.cs プロジェクト: MaxDeg/NJose
        public async Task<bool> VerifyAsync(JoseHeader header, string data, byte[] signature)
        {
            if (header == null)
                throw new ArgumentNullException(nameof(header));
            if (this.Disposed)
                throw new ObjectDisposedException(this.GetType().Name);

            // Get it from header :)
            if (this.publicKey == null)
                this.SetKey(await header.GetPublicKeyAsync());

            return this.VerifyInternal(header, data, signature);
        }
コード例 #26
0
        public async Task Verify_RS512_Algorithm_Serialization()
        {
            var keySet = await JWKSet.GetAsync(this.keySetUri);
            var key = keySet["rsa-512"];

            var token = new JsonWebToken { Issuer = "joe", ExpirationTime = 1300819380 };
            token.AddClaim("http://example.com/is_root", true);
            var header = new JoseHeader() { JwkSetUrl = this.keySetUri, KeyId = "rsa-512" };

            var serializer = new JWSCompactSerializer(new RS512Algorithm(privateKey: key));
            var strToken = serializer.Serialize(token.ToJson(), header);
            var deserializedToken = await serializer.DeserializeAsync(strToken);

            Assert.AreEqual(token.ToJson(), deserializedToken.ToJson());
        }