예제 #1
0
        public static byte[] decrypt(byte[] enc, KeyPair kp, EncParams param)
        {
            byte[] dec         = new byte[param.max_msg_len()];
            ushort dec_len     = 0;
            IntPtr dec_len_ptr = new IntPtr(dec_len);
            IntPtr enc_ptr     = Marshal.AllocHGlobal(enc.Length);

            Marshal.Copy(enc, 0, enc_ptr, enc.Length);
            IntPtr dec_ptr = Marshal.AllocHGlobal(dec.Length);
            IntPtr key_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(kp));

            Marshal.StructureToPtr(kp, key_ptr, false);
            IntPtr param_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(param));

            Marshal.StructureToPtr(param, param_ptr, false);
            var result = ffi.ntru_decrypt(enc_ptr, key_ptr, param_ptr, dec_ptr, out dec_len_ptr);

            if (result != 0)
            {
                Console.WriteLine("Error: Failed to Decrypt Message");
            }
            byte[] final_dec = new byte[dec_len_ptr.ToInt32()];
            Marshal.Copy(dec_ptr, final_dec, 0, final_dec.Length);
            Marshal.FreeHGlobal(enc_ptr);
            Marshal.FreeHGlobal(dec_ptr);
            Marshal.FreeHGlobal(key_ptr);
            Marshal.FreeHGlobal(param_ptr);
            return(final_dec);
        }
예제 #2
0
        public static byte[] encrypt(byte[] msg, PublicKey pub, EncParams param, RandContext rand_ctx)
        {
            byte[] enc     = new byte[param.enc_len()];
            IntPtr enc_ptr = Marshal.AllocHGlobal(param.enc_len());
            IntPtr msg_ptr = Marshal.AllocHGlobal(msg.Length);

            Marshal.Copy(msg, 0, msg_ptr, msg.Length);
            IntPtr pub_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(pub));

            Marshal.StructureToPtr(pub, pub_ptr, false);
            IntPtr param_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(param));

            Marshal.StructureToPtr(param, param_ptr, false);
            IntPtr rand_ctx_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(rand_ctx.rand_ctx));

            Marshal.StructureToPtr(rand_ctx.rand_ctx, rand_ctx_ptr, false);
            IntPtr msg_len_ptr = new IntPtr(msg.Length);
            var    result      = ffi.ntru_encrypt(msg_ptr, msg_len_ptr, pub_ptr, param_ptr, rand_ctx_ptr, enc_ptr);

            if (result != 0)
            {
                Console.WriteLine("Error: Failed to Encrypt Message");
            }
            Console.WriteLine("Went through FFI Encrypt Function");
            Marshal.Copy(enc_ptr, enc, 0, enc.Length);
            Marshal.FreeHGlobal(msg_ptr);
            Marshal.FreeHGlobal(pub_ptr);
            Marshal.FreeHGlobal(param_ptr);
            Marshal.FreeHGlobal(rand_ctx_ptr);
            Marshal.FreeHGlobal(enc_ptr);
            return(enc);
        }
예제 #3
0
        public byte[] export(EncParams param)
        {
            byte[] arr     = new byte[param.public_len()];
            IntPtr arr_ptr = Marshal.AllocHGlobal(arr.Length);
            IntPtr key_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(this));

            Marshal.StructureToPtr(this, key_ptr, false);
            ffi.ntru_export_pub(key_ptr, arr_ptr);
            Marshal.Copy(arr_ptr, arr, 0, arr.Length);
            Marshal.FreeHGlobal(key_ptr);
            Marshal.FreeHGlobal(arr_ptr);
            return(arr);
        }
예제 #4
0
        public byte[] to_arr_sse_2048(EncParams param)
        {
            IntPtr this_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(this));

            Marshal.StructureToPtr(this, this_ptr, false);
            byte[] a      = new byte[param.enc_len()];
            IntPtr a_byte = Marshal.AllocHGlobal(param.enc_len());

            ffi.ntru_to_arr_sse_2048(this_ptr, a_byte);
            Marshal.Copy(a_byte, a, 0, param.enc_len());
            Marshal.FreeHGlobal(this_ptr);
            Marshal.FreeHGlobal(a_byte);
            return(a);
        }
예제 #5
0
        public EncParams get_params()
        {
            EncParams param   = EncParams.Default();
            IntPtr    key_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(this));

            Marshal.StructureToPtr(this, key_ptr, false);
            IntPtr param_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(param));

            Marshal.StructureToPtr(param, param_ptr, false);
            var result = ffi.ntru_params_from_priv_key(key_ptr, param_ptr);

            if (result != 0)
            {
                Console.WriteLine("Error: Failed to Get Encryption Params from private key");
            }
            param = (EncParams)Marshal.PtrToStructure(param_ptr, typeof(EncParams));
            Marshal.FreeHGlobal(param_ptr);
            Marshal.FreeHGlobal(key_ptr);
            return(param);
        }
예제 #6
0
        public static KeyPair generate_key_pair(EncParams param, RandContext rand_context)
        {
            KeyPair kp      = KeyPair.Default();
            IntPtr  key_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(kp));

            Marshal.StructureToPtr(kp, key_ptr, false);
            IntPtr param_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(param));

            Marshal.StructureToPtr(param, param_ptr, false);
            IntPtr rand_ctx_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(rand_context.rand_ctx));

            Marshal.StructureToPtr(rand_context.rand_ctx, rand_ctx_ptr, false);
            var result = ffi.ntru_gen_key_pair(param_ptr, key_ptr, rand_ctx_ptr);

            if (result.ToInt32() != 0)
            {
                Console.WriteLine("Error: Failed to Generate KeyPair");
            }
            kp = (KeyPair)Marshal.PtrToStructure(key_ptr, typeof(KeyPair));
            Marshal.FreeHGlobal(key_ptr);
            Marshal.FreeHGlobal(param_ptr);
            Marshal.FreeHGlobal(rand_ctx_ptr);
            return(kp);
        }