예제 #1
0
        /// <summary>
        /// Tries to get the verified message.
        /// </summary>
        /// <param name="signedMessage">The signed message.</param>
        /// <param name="verifiedMessage">The verified message.</param>
        /// <param name="hidden">The hidden.</param>
        /// <returns>false if signature is not correct</returns>
        public bool TryGetVerifiedMessage(WebBase64 signedMessage, out string verifiedMessage, byte[] hidden = null)
        {
            byte[] output;
            var    verified = TryGetVerifiedMessage(signedMessage.ToBytes(), out output, hidden);

            verifiedMessage = Config.RawStringEncoding.GetString(output);
            return(verified);
        }
예제 #2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="SessionCrypter" /> class.
        /// </summary>
        /// <param name="keyDecrypter">The key decrypter.</param>
        /// <param name="sessionMaterial">The session material.</param>
        /// <param name="verifier">The verifier, optionally used to certify sender. (Equivialent to SignedSessionDecrypter)</param>
        /// <param name="keyPacker">The key packer.</param>
        public SessionCrypter(Crypter keyDecrypter, WebBase64 sessionMaterial, AttachedVerifier verifier = null,
                              ISessionKeyPacker keyPacker = null)
        {
            Workings initLazy()
            {
                var workings = new Workings();

                if (verifier != null)
                {
                    keyPacker = keyPacker ?? new NonceSignedSessionPacker();
                }
                keyPacker = keyPacker ?? new SimpleAesHmacSha1KeyPacker();

                var sessionMaterialBytes = sessionMaterial.ToBytes();
                var sessionPacker        = keyPacker as IInteroperableSessionMaterialPacker;

                workings._verifier = verifier;

                if (sessionPacker == null && workings._verifier != null)
                {
                    sessionMaterialBytes = workings._verifier.VerifiedMessage(sessionMaterialBytes);
                }
                var packedBytes = keyDecrypter.Decrypt(sessionMaterialBytes);

                Key key;

                if (sessionPacker == null)
                {
                    key = keyPacker.Unpack(packedBytes, Config);
                }
                else
                {
                    var nonceSession = sessionPacker.UnpackMaterial(packedBytes, Config);
                    key             = nonceSession.Key;
                    workings._nonce = nonceSession.Nonce.ToBytes();
                }

                workings._keyset          = new ImportedKeySet(key, KeyPurpose.DecryptAndEncrypt);
                workings._crypter         = new Crypter(workings._keyset);
                workings._sessionMaterial = sessionMaterial;
                return(workings);
            }

            _working = new Lazy <Workings>(initLazy);
        }
예제 #3
0
        /// <summary>
        /// Initializes a new instance of the <see cref="SessionCrypter" /> class.
        /// </summary>
        /// <param name="keyEncrypter">The key encrypter.</param>
        /// <param name="signer">The signer, optionally used to certify sender. (Equivialent to SignedSessionEncrypter)</param>
        /// <param name="keySize">Size of the key.</param>
        /// <param name="symmetricKeyType">Type of the symmetric key. (requires unofficial keypacker)</param>
        /// <param name="keyPacker">The key packer.</param>
        /// <exception cref="System.ArgumentException">Without a supplying a keypacker you may only use KeyType.AES;symmetricKeyType</exception>
        public SessionCrypter(Encrypter keyEncrypter, AttachedSigner signer = null, int?keySize = null,
                              KeyType symmetricKeyType = null, ISessionKeyPacker keyPacker      = null)
        {
            symmetricKeyType = symmetricKeyType ?? KeyType.Aes;
            if (keyPacker == null && symmetricKeyType != KeyType.Aes)
            {
                throw new ArgumentException("Without a supplying a keypacker you may only use KeyType.AES",
                                            "symmetricKeyType");
            }

            if (signer != null)
            {
                keyPacker = keyPacker ?? new NonceSignedSessionPacker();
            }
            keyPacker = keyPacker ?? new SimpleAesHmacSha1KeyPacker();

            var key = Key.Generate(symmetricKeyType, keySize ?? symmetricKeyType.DefaultSize);

            _keyset  = new ImportedKeySet(key, KeyPurpose.DecryptAndEncrypt);
            _crypter = new Crypter(_keyset);
            _signer  = signer;


            byte[] packedKey;
            var    sessionPacker = keyPacker as IInteroperableSessionMaterialPacker;

            if (sessionPacker == null)
            {
                packedKey = keyPacker.Pack(key);
            }
            else
            {
                var nonceSession = new NonceSessionMaterial((AesKey)key);
                packedKey = sessionPacker.PackMaterial(nonceSession);
                _nonce    = nonceSession.Nonce.ToBytes();
            }

            _sessionMaterial = WebBase64.FromBytes(keyEncrypter.Encrypt(packedKey));
            if (sessionPacker == null && _signer != null)
            {
                _sessionMaterial = WebBase64.FromBytes(_signer.Sign(_sessionMaterial.ToBytes()));
            }
        }
예제 #4
0
        /// <summary>
        /// Initializes a new instance of the <see cref="SessionCrypter" /> class.
        /// </summary>
        /// <param name="keyDecrypter">The key decrypter.</param>
        /// <param name="sessionMaterial">The session material.</param>
        /// <param name="verifier">The verifier, optionally used to certify sender. (Equivialent to SignedSessionDecrypter)</param>
        /// <param name="keyPacker">The key packer.</param>
        public SessionCrypter(Crypter keyDecrypter, WebBase64 sessionMaterial, AttachedVerifier verifier = null,
                              ISessionKeyPacker keyPacker = null)
        {
            if (verifier != null)
            {
                keyPacker = keyPacker ?? new NonceSignedSessionPacker();
            }
            keyPacker = keyPacker ?? new SimpleAesHmacSha1KeyPacker();

            var sessionMaterialBytes = sessionMaterial.ToBytes();
            var sessionPacker        = keyPacker as IInteroperableSessionMaterialPacker;

            _verifier = verifier;

            if (sessionPacker == null && _verifier != null)
            {
                sessionMaterialBytes = _verifier.VerifiedMessage(sessionMaterialBytes);
            }
            var packedBytes = keyDecrypter.Decrypt(sessionMaterialBytes);

            Key key;

            if (sessionPacker == null)
            {
                key = keyPacker.Unpack(packedBytes);
            }
            else
            {
                var nonceSession = sessionPacker.UnpackMaterial(packedBytes);
                key    = nonceSession.Key;
                _nonce = nonceSession.Nonce.ToBytes();
            }

            _keyset          = new ImportedKeySet(key, KeyPurpose.DecryptAndEncrypt);
            _crypter         = new Crypter(_keyset);
            _sessionMaterial = sessionMaterial;
        }
예제 #5
0
 /// <summary>
 /// Decrypts the specified data.
 /// </summary>
 /// <param name="data">The data.</param>
 /// <returns></returns>
 public string Decrypt(WebBase64 data)
 {
     return(Keyczar.RawStringEncoding.GetString(Decrypt(data.ToBytes())));
 }
예제 #6
0
 /// <summary>
 /// Verifies the specified raw data.
 /// </summary>
 /// <param name="rawData">The raw data.</param>
 /// <param name="signature">The signature.</param>
 /// <returns></returns>
 public bool Verify(string rawData, WebBase64 signature)
 {
     return(Verify(RawStringEncoding.GetBytes(rawData), signature.ToBytes()));
 }
예제 #7
0
 /// <summary>
 /// Gets Verified message from signed message
 /// </summary>
 /// <param name="rawData">The raw data.</param>
 /// <param name="hidden">Optional hidden data used to generate the digest signature.</param>
 /// <returns></returns>
 /// <exception cref="InvalidCryptoDataException">Data Doesn't Match Signature!</exception>
 public string VerifiedMessage(WebBase64 rawData, byte[] hidden = null)
 => Config.RawStringEncoding.GetString(VerifiedMessage(rawData.ToBytes(), hidden));
예제 #8
0
 /// <summary>
 /// Verifies the specified message.
 /// </summary>
 /// <param name="signedMessage">The signed message.</param>
 /// <param name="hidden">Optional hidden data used to generate the digest signature.</param>
 /// <returns></returns>
 public bool Verify(WebBase64 signedMessage, byte[] hidden = null) =>
 Verify(signedMessage.ToBytes(), hidden);
예제 #9
0
 /// <summary>
 /// Verifies the specified message.
 /// </summary>
 /// <param name="signedMessage">The signed message.</param>
 /// <param name="hidden">Optional hidden data used to generate the digest signature.</param>
 /// <returns></returns>
 public bool Verify(WebBase64 signedMessage, byte[] hidden = null)
 {
     return(Verify(signedMessage.ToBytes(), hidden));
 }
예제 #10
0
 /// <summary>
 /// Verifies the specified raw data.
 /// </summary>
 /// <param name="rawData">The raw data.</param>
 /// <param name="signature">The signature.</param>
 /// <returns></returns>
 public bool Verify(string rawData, WebBase64 signature)
 => Verify(Config.RawStringEncoding.GetBytes(rawData), signature.ToBytes());