Example #1
0
 public static void CreateNew(ICryptoLibrary cryptoLibrary, out RegistrationPrivateKey privateKey, out RegistrationId registrationId)
 {
     privateKey = new RegistrationPrivateKey {
         ed25519privateKey = cryptoLibrary.GeneratePrivateKeyEd25519()
     };
     registrationId = new RegistrationId(cryptoLibrary.GetPublicKeyEd25519(privateKey.ed25519privateKey));
 }
Example #2
0
        private void CryptoClientForm_Load(object sender, EventArgs e)
        {
            // add algoritams in drop down
            ToolStripMenuItem menu = new ToolStripMenuItem("Algorithams");

            ToolStripMenuItem item = new ToolStripMenuItem("Substitution");
            ICryptoLibrary    alg  = new SimpleSubstitution();

            item.Tag       = alg;
            this.algorithm = alg;
            menu.DropDownItems.Add(item);

            alg      = new XXTEA();
            item     = new ToolStripMenuItem("XXTEA");
            item.Tag = alg;
            menu.DropDownItems.Add(item);

            alg      = new SHA2();
            item     = new ToolStripMenuItem("SHA2");
            item.Tag = alg;
            menu.DropDownItems.Add(item);
            // TODO: add Knapsack

            menu.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.OnClickedItem);
            this.msOptions.Items.Add(menu);


            this.Init();
        }
        /// <param name="ack1SdIsReady">
        /// =true for SD in ACK2
        /// =false for SD in ACK1 (since the SessionDescription is not initialized yet)
        /// </param>
        internal byte[] Encrypt(ICryptoLibrary cryptoLibrary, InviteRequestPacket req, InviteAck1Packet ack1, InviteSession session,
                                bool ack1SdIsReady
                                )
        {
            BinaryProcedures.CreateBinaryWriter(out var ms, out var w);
            w.Write(Flags);
            UserCertificate.Encode(w, false);
            BinaryProcedures.EncodeIPEndPoint(w, DirectChannelEndPoint);
            NatBehaviour.Encode(w);
            DirectChannelToken32.Encode(w);
            w.Write((byte)SessionType);
            UserCertificateSignature.Encode(w);
            var bytesInLastBlock = (int)ms.Position % CryptoLibraries.AesBlockSize;

            if (bytesInLastBlock != 0)
            {
                var bytesRemainingTillFullAesBlock = CryptoLibraries.AesBlockSize - bytesInLastBlock;
                w.Write(cryptoLibrary.GetRandomBytes(bytesRemainingTillFullAesBlock));
            }
            var plainTextSdData = ms.ToArray();
            var encryptedSdData = new byte[plainTextSdData.Length];

            #region key, iv
            BinaryProcedures.CreateBinaryWriter(out var ms2, out var w2);
            req.GetSharedSignedFields(w2);
            ack1.GetSharedSignedFields(w2, ack1SdIsReady);
            var iv = cryptoLibrary.GetHashSHA256(ms2.ToArray()).Take(16).ToArray();
            ms2.Write(session.SharedInviteAckDhSecret, 0, session.SharedInviteAckDhSecret.Length);
            var aesKey = cryptoLibrary.GetHashSHA256(ms2.ToArray()); // here SHA256 is used as KDF, together with common fields from packets, including both ECDH public keys and timestamp
            #endregion

            cryptoLibrary.ProcessAesCbcBlocks(true, aesKey, iv, plainTextSdData, encryptedSdData);

            return(encryptedSdData);
        }
Example #4
0
        public static LocalDrpPeerConfiguration  Create(ICryptoLibrary cryptoLibrary, int?numberOfDimensions = null, byte[] ed25519privateKey = null, RegistrationId registrationId = null)
        {
            LocalDrpPeerConfiguration r;

            if (ed25519privateKey != null && registrationId != null)
            {
                r = new LocalDrpPeerConfiguration
                {
                    LocalPeerRegistrationPrivateKey = new RegistrationPrivateKey {
                        ed25519privateKey = ed25519privateKey
                    },
                    LocalPeerRegistrationId = registrationId
                };
            }
            else
            {
                RegistrationId.CreateNew(cryptoLibrary, out var newPrivateKey, out var newRegistrationId);
                r = new LocalDrpPeerConfiguration
                {
                    LocalPeerRegistrationPrivateKey = newPrivateKey,
                    LocalPeerRegistrationId         = newRegistrationId
                };
            }

            if (numberOfDimensions == 2)
            {
                r.MinDesiredNumberOfNeighbors  = 5;
                r.SoftMaxNumberOfNeighbors     = 7;
                r.AbsoluteMaxNumberOfNeighbors = 10;
            }
            return(r);
        }
Example #5
0
 public static Ike1Invitation CreateNew(ICryptoLibrary cryptoLibrary, RegistrationId registrationId)
 {
     return(new Ike1Invitation
     {
         ContactInvitationToken = cryptoLibrary.GetRandomBytes(InviteRequestPacket.ContactInvitationTokenSize),
         InvitationInitiatorRegistrationId = registrationId
     });
 }
Example #6
0
        private void CryptoClientForm_Load(object sender, EventArgs e)
        {
            this.tbSrcPath.Text = ".\\" + this.defaultSrcPath;
            this.tbDstPath.Text = ".\\" + this.defaultDstPath;
            this.defaultSrcPath = AppDomain.CurrentDomain.BaseDirectory.ToString() + this.defaultSrcPath;
            this.defaultDstPath = AppDomain.CurrentDomain.BaseDirectory.ToString() + this.defaultDstPath;

            string[] srcDicFiles = Directory.GetFiles(this.defaultSrcPath);

            foreach (string f in srcDicFiles)
            {
                this.lbFilesToEncrypt.Items.Add(f);
            }

            string[] dstDicFiles = Directory.GetFiles(this.defaultDstPath);

            foreach (string f in dstDicFiles)
            {
                this.lbEncryptedFiles.Items.Add(f);
            }

            this.CreateNewFileWatcher();


            ICryptoLibrary[] algorithams = new ICryptoLibrary[4];
            algorithams[0] = new SimpleSubstitution();
            algorithams[1] = new XXTEA();
            algorithams[2] = new SHA2();
            algorithams[3] = new Knapsack();

            specs = new Dictionary <string, byte[]>();

            // add algoritams in drop down
            ToolStripMenuItem menu = new ToolStripMenuItem("Algorithams");
            ToolStripMenuItem item;

            for (int i = 0; i < algorithams.Length; i++)
            {
                item     = new ToolStripMenuItem(algorithams[i].ToString());
                item.Tag = algorithams[i];
                menu.DropDownItems.Add(item);
                if (i == 0)
                {
                    this.algoritham = algorithams[i];
                }
            }

            menu.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.OnClickedItem);
            this.msOptions.Items.Add(menu);

            this.Init();
            tbN.KeyPress  += this.tbKey_KeyPress;
            tbM.KeyPress  += this.tbKey_KeyPress;
            tbIM.KeyPress += this.tbKey_KeyPress;
            lbHint.Visible = false;
        }
Example #7
0
        public static RegistrationSignature DecodeAndVerify(BinaryReader reader, ICryptoLibrary cryptoLibrary, Action <BinaryWriter> writeSignedFields, RegistrationId publicKey)
        {
            var r = Decode(reader);

            if (!r.Verify(cryptoLibrary, writeSignedFields, publicKey))
            {
                throw new BadSignatureException("invalid registration signature 135");
            }
            return(r);
        }
Example #8
0
        public static RegistrationSignature Sign(ICryptoLibrary cryptoLibrary, Action <BinaryWriter> writeSignedFields, RegistrationPrivateKey privateKey)
        {
            var r  = new RegistrationSignature();
            var ms = new MemoryStream(); using (var writer = new BinaryWriter(ms)) writeSignedFields(writer);

            r.ed25519signature = cryptoLibrary.SignEd25519(
                ms.ToArray(),
                privateKey.ed25519privateKey);
            return(r);
        }
Example #9
0
        public bool Verify(ICryptoLibrary cryptoLibrary, Action <BinaryWriter> writeSignedFields, RegistrationId publicKey)
        {
            var signedData = new MemoryStream();

            using (var writer = new BinaryWriter(signedData))
                writeSignedFields(writer);
            if (cryptoLibrary.VerifyEd25519(signedData.ToArray(), ed25519signature, publicKey.Ed25519publicKey) == false)
            {
                return(false);
            }
            return(true);
        }
Example #10
0
        public static double GetMutualP2pConnectionValue(ICryptoLibrary cryptoLibrary, RegistrationId registrationId1, ushort neighborsBusySectorIds1,
                                                         RegistrationId registrationId2, ushort neighborsBusySectorIds2, int numberOfDimensions,
                                                         bool thisConnectionAlreadyExists, bool anotherNeighborToSameSectorExists1, bool anotherNeighborToSameSectorExists2, bool allowConnectionsToSameRegistrationId)
        {
            if (registrationId1.Equals(registrationId2))
            {
                return(allowConnectionsToSameRegistrationId ? SameRegistrationIdConnectionValue : -SameRegistrationIdConnectionValue);
            }

            double r        = 0;
            var    distance = registrationId1.GetDistanceTo(cryptoLibrary, registrationId2, numberOfDimensions).ToDouble();

            r -= distance;

            if (thisConnectionAlreadyExists)
            {
                if (anotherNeighborToSameSectorExists1 == false)
                {
                    r += EmptySectorOccupationValue;
                }
                if (anotherNeighborToSameSectorExists2 == false)
                {
                    r += EmptySectorOccupationValue;
                }
            }
            else
            {
                var vsic                       = new VectorSectorIndexCalculator(numberOfDimensions);
                var vector1to2                 = RegistrationId.GetDifferenceVectorF(registrationId1, registrationId2, cryptoLibrary, numberOfDimensions);
                var vector1to2SectorIndex      = vsic.GetSectorIndex(vector1to2);
                var vector1to2IsInVacantSector = ((neighborsBusySectorIds1 >> vector1to2SectorIndex) & 0x0001) == 0;
                if (vector1to2IsInVacantSector)
                {
                    r += EmptySectorOccupationValue;
                }

                var vector2to1 = new float[numberOfDimensions];
                for (int i = 0; i < numberOfDimensions; i++)
                {
                    vector2to1[i] = -vector1to2[i];
                }
                var vector2to1SectorIndex = vsic.GetSectorIndex(vector2to1);

                var vector2to1IsInVacantSector = ((neighborsBusySectorIds2 >> vector2to1SectorIndex) & 0x0001) == 0;
                if (vector2to1IsInVacantSector)
                {
                    r += EmptySectorOccupationValue;
                }
            }

            return(r);
        }
Example #11
0
 private void OnClickedItem(object sender, ToolStripItemClickedEventArgs e)
 {
     this.algorithm = (ICryptoLibrary)e.ClickedItem.Tag;
     byte[] key;
     if (this.algorithm.GetType() != typeof(SHA2))
     {
         key = this.algorithm.GenerateRandomKey();
     }
     else
     {
         key = ((SHA2)this.algorithm).GetKey();
     }
     this.tbKey.Text = System.Text.Encoding.UTF8.GetString(key);
 }
Example #12
0
        internal byte[] EncryptShortSingleMessage(ICryptoLibrary cryptoLibrary, string messageText)
        {
            if (Status != MessageSessionStatusCode.inProgress)
            {
                throw new InvalidOperationException();
            }

            var decryptedMessageData = MessageEncoderDecoder.EncodePlainTextMessageWithPadding_plainTextUtf8_256(cryptoLibrary, messageText);
            var encryptedMessageData = new byte[decryptedMessageData.Length];

            cryptoLibrary.ProcessAesCbcBlocks(true, _aesKey, _iv, decryptedMessageData, encryptedMessageData);

            Status = MessageSessionStatusCode.encryptionDecryptionCompleted;
            return(encryptedMessageData);
        }
Example #13
0
        internal byte[] EncryptIke1Data(ICryptoLibrary cryptoLibrary, Ike1Data ike1Data)
        {
            if (Status != MessageSessionStatusCode.inProgress)
            {
                throw new InvalidOperationException();
            }

            var decryptedMessageData = MessageEncoderDecoder.EncodeIke1DataWithPadding(cryptoLibrary, ike1Data);
            var encryptedMessageData = new byte[decryptedMessageData.Length];

            cryptoLibrary.ProcessAesCbcBlocks(true, _aesKey, _iv, decryptedMessageData, encryptedMessageData);

            Status = MessageSessionStatusCode.encryptionDecryptionCompleted;
            return(encryptedMessageData);
        }
Example #14
0
        internal void DeriveKeys(ICryptoLibrary cryptoLibrary, byte[] sharedPingPongHmacKey, MessageStartPacket messageStart,
                                 byte[] directChannelSharedDhSecret)
        {
            if (Status != MessageSessionStatusCode.created)
            {
                throw new InvalidOperationException();
            }

            BinaryProcedures.CreateBinaryWriter(out var msE, out var wE);
            messageStart.GetSignedFieldsForMessageHMAC(wE, false);
            wE.Write(sharedPingPongHmacKey);
            _iv = cryptoLibrary.GetHashSHA256(msE.ToArray()).Take(16).ToArray();
            wE.Write(directChannelSharedDhSecret);
            _aesKey = cryptoLibrary.GetHashSHA256(msE.ToArray());

            Status = MessageSessionStatusCode.inProgress;
        }
        /// <param name="receivedFromUser">comes from local contact book. is null if it is contact invitation</param>
        internal static InviteSessionDescription Decrypt_Verify(ICryptoLibrary cryptoLibrary, byte[] encryptedSdData,
                                                                InviteRequestPacket req,
                                                                InviteAck1Packet ack1,
                                                                bool ack1SdIsReady,
                                                                InviteSession session,
                                                                UserId receivedFromUserNullable,
                                                                DateTime localTimeNowUtc
                                                                )
        {
            #region key, iv
            BinaryProcedures.CreateBinaryWriter(out var ms2, out var w2);
            req.GetSharedSignedFields(w2);
            ack1.GetSharedSignedFields(w2, ack1SdIsReady);
            var iv = cryptoLibrary.GetHashSHA256(ms2.ToArray()).Take(16).ToArray();
            ms2.Write(session.SharedInviteAckDhSecret, 0, session.SharedInviteAckDhSecret.Length);
            var aesKey = cryptoLibrary.GetHashSHA256(ms2.ToArray()); // here SHA256 is used as KDF, together with common fields from packets, including both ECDH public keys and timestamp
            #endregion

            // decrypt
            var plainTextSdData = new byte[encryptedSdData.Length];
            cryptoLibrary.ProcessAesCbcBlocks(false, aesKey, iv, encryptedSdData, plainTextSdData);

            var r      = new InviteSessionDescription();
            var reader = BinaryProcedures.CreateBinaryReader(plainTextSdData, 0);
            r.Flags = reader.ReadByte();
            if ((r.Flags & FlagsMask_MustBeZero) != 0)
            {
                throw new NotImplementedException();
            }
            r.UserCertificate          = UserCertificate.Decode_AssertIsValidNow(reader, cryptoLibrary, receivedFromUserNullable, localTimeNowUtc);
            r.DirectChannelEndPoint    = BinaryProcedures.DecodeIPEndPoint(reader);
            r.NatBehaviour             = NatBehaviourModel.Decode(reader);
            r.DirectChannelToken32     = DirectChannelToken32.Decode(reader);
            r.SessionType              = (SessionType)reader.ReadByte();
            r.UserCertificateSignature = UserCertificateSignature.DecodeAndVerify(reader, cryptoLibrary,
                                                                                  w =>
            {
                req.GetSharedSignedFields(w);
                ack1.GetSharedSignedFields(w, ack1SdIsReady);
                r.WriteSignedFields(w);
            },
                                                                                  r.UserCertificate);
            return(r);
        }
Example #16
0
        public static LocalDrpPeerConfiguration  Create(ICryptoLibrary cryptoLibrary, int numberOfDimensions, byte[] ed25519privateKey = null, RegistrationId registrationId = null)
        {
            var privatekey = new RegistrationPrivateKey {
                ed25519privateKey = ed25519privateKey ?? cryptoLibrary.GeneratePrivateKeyEd25519()
            };
            var r = new LocalDrpPeerConfiguration
            {
                LocalPeerRegistrationPrivateKey = privatekey,
                LocalPeerRegistrationId         = new RegistrationId(registrationId?.Ed25519publicKey ?? cryptoLibrary.GetPublicKeyEd25519(privatekey.ed25519privateKey))
            };

            if (numberOfDimensions == 2)
            {
                r.MinDesiredNumberOfNeighbors  = 5;
                r.SoftMaxNumberOfNeighbors     = 7;
                r.AbsoluteMaxNumberOfNeighbors = 10;
            }
            return(r);
        }
Example #17
0
        public UserAppDatabase(ICryptoLibrary cryptoLibrary, IDatabaseKeyProvider keyProvider, VisionChannel visionChannel, string visionChannelSourceId, string basePathNullable)
        {
            _keyProvider           = keyProvider;
            _cryptoLibrary         = cryptoLibrary;
            _visionChannel         = visionChannel;
            _visionChannelSourceId = visionChannelSourceId;

            if (basePathNullable == null)
            {
                basePathNullable = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
            }
            var mainDatabaseFileName = Path.Combine(basePathNullable, "dcomms_main.db");

            WriteToLog_deepDetail($"basePath={basePathNullable}, databaseFileName={mainDatabaseFileName}");

            _db_main = new SQLiteConnection(mainDatabaseFileName);
            _db_main.CreateTable <User>(CreateFlags.None);
            _db_main.CreateTable <RootUserKeys>(CreateFlags.None);
            _db_main.CreateTable <UserRegistrationID>(CreateFlags.None);
            WriteToLog_deepDetail($"initialized sqlite database");
        }
Example #18
0
        internal static byte[] EncodePlainTextMessageWithPadding_plainTextUtf8_256(ICryptoLibrary cryptoLibrary, string messageText)
        {
            var messageTextData = Encoding.UTF8.GetBytes(messageText);

            if (messageTextData.Length > 255)
            {
                throw new ArgumentException();
            }
            BinaryProcedures.CreateBinaryWriter(out var ms, out var w);
            w.Write((byte)EncodedDataType.plainTextUtf8_256);
            w.Write((byte)messageTextData.Length);
            w.Write(messageTextData);

            // add padding with random data
            var bytesInLastBlock = (int)ms.Position % CryptoLibraries.AesBlockSize;

            if (bytesInLastBlock != 0)
            {
                var bytesRemainingTillFullAesBlock = CryptoLibraries.AesBlockSize - bytesInLastBlock;
                w.Write(cryptoLibrary.GetRandomBytes(bytesRemainingTillFullAesBlock));
            }

            return(ms.ToArray());
        }
Example #19
0
        internal static byte[] EncodeIke1DataWithPadding(ICryptoLibrary cryptoLibrary, Ike1Data ike1Data)
        {
            BinaryProcedures.CreateBinaryWriter(out var ms, out var w);
            byte flags = 0;

            w.Write(flags);
            ike1Data.UserId.Encode(w);
            w.Write((byte)ike1Data.RegistrationIds.Length);
            foreach (var localRegistrationId in ike1Data.RegistrationIds)
            {
                localRegistrationId.Encode(w);
            }

            // add padding with random data
            var bytesInLastBlock = (int)ms.Position % CryptoLibraries.AesBlockSize;

            if (bytesInLastBlock != 0)
            {
                var bytesRemainingTillFullAesBlock = CryptoLibraries.AesBlockSize - bytesInLastBlock;
                w.Write(cryptoLibrary.GetRandomBytes(bytesRemainingTillFullAesBlock));
            }

            return(ms.ToArray());
        }
Example #20
0
        double _distance_sumSqr; // 32 bytes of reg. public key: split into 16 dimensions of 2 bytes //   euclidean distance
        public unsafe RegistrationIdDistance(ICryptoLibrary cryptoLibrary, RegistrationId rpk1, RegistrationId rpk2, int numberOfDimensions)
        {
            if (rpk1.CachedEd25519publicKeySha256 == null)
            {
                rpk1.CachedEd25519publicKeySha256 = cryptoLibrary.GetHashSHA256(rpk1.Ed25519publicKey);
            }
            var rpk1_ed25519publicKey_sha256 = rpk1.CachedEd25519publicKeySha256;

            if (rpk2.CachedEd25519publicKeySha256 == null)
            {
                rpk2.CachedEd25519publicKeySha256 = cryptoLibrary.GetHashSHA256(rpk2.Ed25519publicKey);
            }
            var rpk2_ed25519publicKey_sha256 = rpk2.CachedEd25519publicKeySha256;

            if (rpk1_ed25519publicKey_sha256.Length != rpk2_ed25519publicKey_sha256.Length)
            {
                throw new ArgumentException();
            }
            _distance_sumSqr = 0;

            if (numberOfDimensions == 16)
            {
                fixed(byte *rpk1a = rpk1_ed25519publicKey_sha256, rpk2a = rpk2_ed25519publicKey_sha256)
                {
                    ushort *rpk1aPtr = (ushort *)rpk1a, rpk2aPtr = (ushort *)rpk2a;
                    int     l = rpk1_ed25519publicKey_sha256.Length / 2;

                    for (int i = 0; i < l; i++, rpk1aPtr++, rpk2aPtr++)
                    {
                        var d_i = VectorComponentRoutine(*rpk1aPtr, *rpk2aPtr);
                        _distance_sumSqr += d_i * d_i;
                    }
                }
            }
            else if (numberOfDimensions == 8)
            {
                fixed(byte *rpk1a = rpk1_ed25519publicKey_sha256, rpk2a = rpk2_ed25519publicKey_sha256)
                {
                    uint *rpk1aPtr = (uint *)rpk1a, rpk2aPtr = (uint *)rpk2a;
                    int   l = rpk1_ed25519publicKey_sha256.Length / 4;

                    for (int i = 0; i < l; i++, rpk1aPtr++, rpk2aPtr++)
                    {
                        var d_i = VectorComponentRoutine(*rpk1aPtr, *rpk2aPtr);
                        _distance_sumSqr += d_i * d_i;
                    }
                }
            }
            else if (numberOfDimensions == 4)
            {
                fixed(byte *rpk1a = rpk1_ed25519publicKey_sha256, rpk2a = rpk2_ed25519publicKey_sha256)
                {
                    ulong *rpk1aPtr = (ulong *)rpk1a, rpk2aPtr = (ulong *)rpk2a;
                    int    l = rpk1_ed25519publicKey_sha256.Length / 8;

                    for (int i = 0; i < l; i++, rpk1aPtr++, rpk2aPtr++)
                    {
                        var d_i = VectorComponentRoutine(*rpk1aPtr, *rpk2aPtr);
                        _distance_sumSqr += d_i * d_i;
                    }
                }
            }
            else if (numberOfDimensions == 2)
            {
                GetVectorValues_2(rpk1_ed25519publicKey_sha256, out var v1_0, out var v1_1);
                GetVectorValues_2(rpk2_ed25519publicKey_sha256, out var v2_0, out var v2_1);

                var d_0 = VectorComponentRoutine(v1_0, v2_0);
                var d_1 = VectorComponentRoutine(v1_1, v2_1);
                _distance_sumSqr += d_0 * d_0;
                _distance_sumSqr += d_1 * d_1;
            }
            else
            {
                throw new NotImplementedException();
            }
        }
Example #21
0
 public static float[] GetDifferenceVectorF(RegistrationId from, RegistrationId to, ICryptoLibrary cryptoLibrary, int numberOfDimensions)
 => GetDifferenceVector(from, to, cryptoLibrary, numberOfDimensions).Select(x => (float)x).ToArray();
Example #22
0
        public static double[] GetDifferenceVector(RegistrationId from, RegistrationId to, ICryptoLibrary cryptoLibrary, int numberOfDimensions)
        {
            var fromRegIdVector        = RegistrationIdDistance.GetVectorValues(cryptoLibrary, from, numberOfDimensions);
            var destinationRegIdVector = RegistrationIdDistance.GetVectorValues(cryptoLibrary, to, numberOfDimensions);
            var diff = new double[fromRegIdVector.Length];

            for (int i = 0; i < diff.Length; i++)
            {
                diff[i] = RegistrationIdDistance.GetDifferenceInLoopedRegistrationIdSpace(fromRegIdVector[i], destinationRegIdVector[i]);
            }
            return(diff);
        }
Example #23
0
 public RegistrationIdDistance GetDistanceTo(ICryptoLibrary cryptoLibrary, RegistrationId another, int numberOfDimensions) => new RegistrationIdDistance(cryptoLibrary, this, another, numberOfDimensions);
Example #24
0
        public static unsafe double[] GetVectorValues(ICryptoLibrary cryptoLibrary, RegistrationId rid, int numberOfDimensions)
        {
            var r = new double[numberOfDimensions];

            if (rid.CachedEd25519publicKeySha256 == null)
            {
                rid.CachedEd25519publicKeySha256 = cryptoLibrary.GetHashSHA256(rid.Ed25519publicKey);
            }
            var rid_ed25519publicKey_sha256 = rid.CachedEd25519publicKeySha256;

            if (numberOfDimensions == 16)
            {
                fixed(byte *rpk1a = rid_ed25519publicKey_sha256)
                {
                    ushort *rpk1aPtr = (ushort *)rpk1a;
                    int     l        = rid_ed25519publicKey_sha256.Length / 2;

                    for (int i = 0; i < l; i++, rpk1aPtr++)
                    {
                        r[i] = (double)(*rpk1aPtr) / UInt16.MaxValue;
                    }
                }
            }
            else if (numberOfDimensions == 8)
            {
                fixed(byte *rpk1a = rid_ed25519publicKey_sha256)
                {
                    uint *rpk1aPtr = (uint *)rpk1a;
                    int   l        = rid_ed25519publicKey_sha256.Length / 4;

                    for (int i = 0; i < l; i++, rpk1aPtr++)
                    {
                        r[i] = (double)(*rpk1aPtr) / UInt32.MaxValue;
                    }
                }
            }
            else if (numberOfDimensions == 4)
            {
                fixed(byte *rpk1a = rid_ed25519publicKey_sha256)
                {
                    ulong *rpk1aPtr = (ulong *)rpk1a;
                    int    l        = rid_ed25519publicKey_sha256.Length / 8;

                    for (int i = 0; i < l; i++, rpk1aPtr++)
                    {
                        r[i] = (double)(*rpk1aPtr) / ulong.MaxValue;
                    }
                }
            }
            else if (numberOfDimensions == 2)
            {
                GetVectorValues_2(rid_ed25519publicKey_sha256, out var v0, out var v1);
                r[0] = v0;
                r[1] = v1;
            }
            else
            {
                throw new NotImplementedException();
            }

            return(r);
        }
Example #25
0
        private void OnClickedItem(object sender, ToolStripItemClickedEventArgs e)
        {
            if (algoritham.GetType() != ((ICryptoLibrary)e.ClickedItem.Tag).GetType())
            {
                this.algoritham = (ICryptoLibrary)e.ClickedItem.Tag;
                byte[] key;
                if (this.algoritham.GetType() != typeof(SHA2))
                {
                    key = this.algoritham.GenerateRandomKey();
                    btnRandomGenerateKey.Enabled = true;
                    btnSetKey.Enabled            = true;
                    btnDecode.Enabled            = true;
                    btnDecryptAll.Enabled        = true;
                    btnDecryptSeleced.Enabled    = true;
                    btnDecodeFromFile.Enabled    = true;
                }
                else
                {
                    key = ((SHA2)this.algoritham).GetKey();
                    btnRandomGenerateKey.Enabled = false;
                    btnSetKey.Enabled            = false;
                    btnDecode.Enabled            = false;
                    btnDecryptAll.Enabled        = false;
                    btnDecryptSeleced.Enabled    = false;
                    btnDecodeFromFile.Enabled    = false;
                }

                if (this.algoritham.GetType() != typeof(Knapsack))
                {
                    gbKnapSackProp.Enabled = false;
                    //tbKey.Enabled = true;
                    tbKey.KeyPress -= this.tbKey_KeyPress;
                    lbHint.Visible  = false;
                }
                else
                {
                    // set up for knapsack
                    gbKnapSackProp.Enabled = true;
                    //tbKey.Enabled = false;
                    tbKey.KeyPress += this.tbKey_KeyPress;

                    tbN.Text       = ((Knapsack)this.algoritham).n.ToString();
                    tbM.Text       = ((Knapsack)this.algoritham).m.ToString();
                    tbIM.Text      = ((Knapsack)this.algoritham).mInverse.ToString();
                    lbHint.Visible = true;
                }

                // encoding problem fixed like this :)
                if (this.algoritham.GetType() != typeof(Knapsack))
                {
                    this.tbKey.Text = new string(Encoding.Default.GetChars(key));
                }
                else
                {
                    uint[] temp       = new uint[key.Length / 4];
                    string tempKeyStr = string.Empty;

                    for (
                        int i = 0; i < key.Length; i += 4)
                    {
                        temp[i / 4] = BitConverter.ToUInt32(key, i);
                        tempKeyStr += " " + BitConverter.ToUInt32(key, i);
                    }

                    this.tbKey.Text = tempKeyStr;
                    //this.tbKey.Text = string.Join(", ", key.Select(x => x.ToString()).ToArray());
                }
                this.gbAlgorithm.Text = this.algoritham.ToString();
            }
        }
Example #26
0
 internal void DeriveSharedInviteAckDhSecret(ICryptoLibrary cryptoLibrary, byte[] remotePublicEcdheKey)
 {
     SharedInviteAckDhSecret = cryptoLibrary.DeriveEcdh25519SharedSecret(LocalInviteAckEcdhePrivateKey, remotePublicEcdheKey);
 }