internal async Task SendInviteAsync(string name, byte[] preSharedKey, UserIdentity receiver) { if (_disposed) { throw new ObjectDisposedException(null); } try { var invite = new Invite { Name = name, PreSharedKey = preSharedKey, Sender = _publicIdentity }; var signedData = await CreateSignAndEncodeDataAsync(invite); var publicKey = PemUtils.GetKeyFromPem(receiver.PublicKey); var aesKey = CryptUtils.GenrateAesKey(); var encryptedAesKey = CryptUtils.RsaEncryptWithPublic(aesKey, publicKey); var encryptedData = CryptUtils.AesEncryptByteArray(signedData, aesKey); var packet = new InvitePacket(encryptedData, encryptedAesKey); await _networkHandler.SendPacketAsync(packet); } catch (Exception) when(_disposed) { } }
private static async Task <T> GetAndVerifySignedDataAsync <T>(string signedDataJson) where T : class { var signedData = await JsonUtils.DeserializeAsync <SignedData>(signedDataJson); var dataJson = Config.DefaultEncoding.GetString(signedData.Data); var baseModel = await JsonUtils.DeserializeAsync <BaseModel>(dataJson); if (baseModel?.Sender?.PublicKey == null) { return(null); } AsymmetricKeyParameter publicKey; try { var publicKeyPem = baseModel.Sender.PublicKey.Replace("RSA PUBLIC KEY", "PUBLIC KEY"); publicKey = PemUtils.GetKeyFromPem(publicKeyPem); } catch (ArgumentException) { return(null); } var dataToVerify = Config.DefaultEncoding.GetBytes(Convert.ToBase64String(signedData.Data)); var isValid = SignUtils.Verify(dataToVerify, signedData.Signature, publicKey); if (!isValid) { return(null); } var text = Config.DefaultEncoding.GetString(signedData.Data); var model = await JsonUtils.DeserializeAsync <T>(text); return(model); }
public PersonalIdentity(string username, AsymmetricCipherKeyPair keyPair) : base(username, PemUtils.GetPemFromKey(keyPair.Public)) { KeyPair = keyPair; }