aboutsummaryrefslogblamecommitdiffstats
path: root/ffi/cs/bls256.cs
blob: f39b6f3f8e40ba2a4d7546c118db087ff28365e7 (plain) (tree)
1
2
3
4
5
6
7
8





                                     

                                                                      













                                                                                                                                            











                                                                                                                                                           
                                                                                                                                                        




                                                                                                                             
                                                                                               






                                                                                                  
                                                                                                                      
                                         
                                                                                                                           






                                                                                                                             
                                                                                   
                                         
                                                                                                             
                                         
                                                                                                                  
                                         
                                                                                  
                                         
                                                                                                                
                                         
                                                                                                                                                    
                                         
                                                                                            
 























                                                                                              

                                                    




                                                                                             
                                                                       











                                                                                             
                                                                                        

                                 




                                                 


                                                                           
                                                                                                   
                                                
                                                                                   


                                                                 







                                                         
                                                                                                


                                                             


                                                     






                                                                                                    
                                                                                               




                                                                           
                                                                                                          
                                                
                                                                                          










                                                                 
                                                                                                
















                                                                            
                                                  
                         
                                                       


                                                                                         






                                                                                                   
                         
                                   
                 






                                                                                                             



                                                                                                 























                                                                                                           






                                                                                  








































                                                                                                             
                 
                                                              





                                                                                                           


                 
þ½Ž¿using System;
using System.Text;
using System.Runtime.InteropServices;

namespace mcl {
    class BLS256 {
        const int IoEcComp = 512; // fixed byte representation
        public const int maxUnitSize = 4;
        [DllImport("bls256.dll")]
        public static extern int blsInit(int curve, int maxUnitSize);
        [DllImport("bls256.dll")]
        public static extern int blsIdIsSame(ref Id lhs, ref Id rhs);

        [DllImport("bls256.dll")]
        public static extern int blsIdSetStr(ref Id id, [In][MarshalAs(UnmanagedType.LPStr)] string buf, ulong bufSize, int ioMode);
        [DllImport("bls256.dll")]
        public static extern ulong blsIdGetStr(ref Id id, [Out]StringBuilder buf, ulong maxBufSize, int ioMode);
        [DllImport("bls256.dll")]
        public static extern void blsIdSet(ref Id id, ref ulong p);
        [DllImport("bls256.dll")]
        public static extern int blsSecretKeyIsSame(ref SecretKey lhs, ref SecretKey rhs);
        [DllImport("bls256.dll")]
        public static extern void blsSecretKeySetArray(ref SecretKey sec, ref ulong p);
        [DllImport("bls256.dll")]
        public static extern int blsSecretKeySetStr(ref SecretKey sec, [In][MarshalAs(UnmanagedType.LPStr)] string buf, ulong bufSize, int ioMode);
        [DllImport("bls256.dll")]
        public static extern ulong blsSecretKeyGetStr(ref SecretKey sec, [Out]StringBuilder buf, ulong maxBufSize, int ioMode);
        [DllImport("bls256.dll")]
        public static extern void blsSecretKeyAdd(ref SecretKey sec, ref SecretKey rhs);
        [DllImport("bls256.dll")]
        public static extern void blsSecretKeyInit(ref SecretKey sec);
        [DllImport("bls256.dll")]
        public static extern void blsSecretKeyGetPublicKey(ref SecretKey sec, ref PublicKey pub);
        [DllImport("bls256.dll")]
        public static extern void blsSecretKeySign(ref SecretKey sec, ref Sign sign, [In][MarshalAs(UnmanagedType.LPStr)] string m, ulong size);
        [DllImport("bls256.dll")]
        public static extern int blsSecretKeySet(ref SecretKey sec, ref SecretKey msk, ulong k, ref Id id);
        [DllImport("bls256.dll")]
        public static extern int blsSecretKeyRecover(ref SecretKey sec, ref SecretKey secVec, ref Id idVec, ulong n);
        [DllImport("bls256.dll")]
        public static extern void blsSecretKeyGetPop(ref SecretKey sec, ref Sign sign);
        [DllImport("bls256.dll")]
        public static extern int blsPublicKeyIsSame(ref PublicKey lhs, ref PublicKey rhs);
        [DllImport("bls256.dll")]
        public static extern void blsPublicKeyPut(ref PublicKey pub);
        [DllImport("bls256.dll")]
        public static extern void blsPublicKeyCopy(ref PublicKey dst, ref PublicKey src);
        [DllImport("bls256.dll")]
        public static extern int blsPublicKeySetStr(ref PublicKey pub, ref byte buf, int bufSize, int ioMode);
        [DllImport("bls256.dll")]
        public static extern ulong blsPublicKeyGetStr(ref PublicKey pub, ref byte buf, int maxBufSize, int ioMode);
        [DllImport("bls256.dll")]
        public static extern void blsPublicKeyAdd(ref PublicKey pub, ref PublicKey rhs);
        [DllImport("bls256.dll")]
        public static extern int blsPublicKeySet(ref PublicKey pub, ref PublicKey mpk, ulong k, ref Id id);
        [DllImport("bls256.dll")]
        public static extern int blsPublicKeyRecover(ref PublicKey pub, ref PublicKey pubVec, ref Id idVec, ulong n);
        [DllImport("bls256.dll")]
        public static extern int blsSignIsSame(ref Sign lhs, ref Sign rhs);
        [DllImport("bls256.dll")]
        public static extern int blsSignSetStr(ref Sign sign, ref byte buf, int bufSize, int ioMode);
        [DllImport("bls256.dll")]
        public static extern ulong blsSignGetStr(ref Sign sign, ref byte buf, int maxBufSize, int ioMode);
        [DllImport("bls256.dll")]
        public static extern void blsSignAdd(ref Sign sign, ref Sign rhs);
        [DllImport("bls256.dll")]
        public static extern int blsSignRecover(ref Sign sign, ref Sign signVec, ref Id idVec, ulong n);
        [DllImport("bls256.dll")]
        public static extern int blsSignVerify(ref Sign sign, ref PublicKey pub, [In][MarshalAs(UnmanagedType.LPStr)] string m, ulong size);
        [DllImport("bls256.dll")]
        public static extern int blsSignVerifyPop(ref Sign sign, ref PublicKey pub);

        static string ConvertByteToHexStr(byte[] b, int size)
        {
            String s = "";
            for (int i = 0; i < size; i++) {
                s += Buffer.GetByte(b, i).ToString("x2");
            }
            return s;
        }
        static byte[] ConvertHexStrToByte(string s)
        {
            if ((s.Length & 1) == 1) {
                throw new ArgumentException("ConvertHexStrToByte odd length");
            }
            int n = s.Length / 2;
            byte[] b = new byte[n];
            for (int i = 0; i < n; i++) {
                int x = Convert.ToInt32(s.Substring(i * 2, 2), 16);
                b[i] = (byte)x;
            }
            return b;
        }


    public static void Init()
        {
            const int CurveFp254BNb = 0;
            if (!System.Environment.Is64BitProcess) {
                throw new PlatformNotSupportedException("not 64-bit system");
            }
            int err = blsInit(CurveFp254BNb, maxUnitSize);
            if (err != 0) {
                throw new ArgumentException("blsInit");
            }
        }

        public struct Id {
            private ulong v0, v1, v2, v3;
            public bool IsSame(Id rhs)
            {
                return blsIdIsSame(ref this, ref rhs) != 0;
            }
            public void SetStr(String s, int ioMode)
            {
                if (blsIdSetStr(ref this, s, (ulong)s.Length, ioMode) != 0) {
                    throw new ArgumentException("blsIdSetStr:" + s);
                }
            }
            public void SetInt(int x)
            {
                v0 = (uint)x;
                v1 = v2 = v3 = 0;
            }
            public string GetStr(int ioMode)
            {
                StringBuilder sb = new StringBuilder(1024);
                ulong size = blsIdGetStr(ref this, sb, (ulong)sb.Capacity, ioMode);
                if (size == 0) {
                    throw new ArgumentException("blsIdGetStr");
                }
                return sb.ToString(0, (int)size);
            }
            public override string ToString()
            {
                return GetStr(16);
            }
            public void SetArray(ulong[] p)
            {
                int n = p.Length;
                if (n != maxUnitSize) {
                    throw new ArgumentException("SetArray:" + n.ToString());
                }
                blsIdSet(ref this, ref p[0]);
            }
        }
        public struct SecretKey {
            private ulong v0, v1, v2, v3;
            public bool IsSame(SecretKey rhs)
            {
                return blsSecretKeyIsSame(ref this, ref rhs) != 0;
            }
            public void SetStr(String s, int ioMode)
            {
                if (blsSecretKeySetStr(ref this, s, (ulong)s.Length, ioMode) != 0) {
                    throw new ArgumentException("blsSecretKeySetStr:" + s);
                }
            }
            public string GetStr(int ioMode)
            {
                StringBuilder sb = new StringBuilder(1024);
                ulong size = blsSecretKeyGetStr(ref this, sb, (ulong)sb.Capacity, ioMode);
                if (size == 0) {
                    throw new ArgumentException("blsSecretKeyGetStr");
                }
                return sb.ToString(0, (int)size);
            }
            public override string ToString()
            {
                return GetStr(16);
            }
            public void SetArray(ulong[] p)
            {
                int n = p.Length;
                if (n != maxUnitSize) {
                    throw new ArgumentException("SetArray:" + n.ToString());
                }
                blsSecretKeySetArray(ref this, ref p[0]);
            }
            public void Add(SecretKey rhs)
            {
                blsSecretKeyAdd(ref this, ref rhs);
            }
            public void Init()
            {
                blsSecretKeyInit(ref this);
            }
            public PublicKey GetPublicKey()
            {
                PublicKey pub = new PublicKey();
                blsSecretKeyGetPublicKey(ref this, ref pub);
                return pub;
            }
            public Sign Sign(String m)
            {
                Sign sign = new Sign();
                blsSecretKeySign(ref this, ref sign, m, (ulong)m.Length);
                return sign;
            }
        }
        // secretKey = sum_{i=0}^{msk.Length - 1} msk[i] * id^i
        public static SecretKey ShareSecretKey(SecretKey[] msk, Id id)
        {
            SecretKey sec = new SecretKey();
            if (blsSecretKeySet(ref sec, ref msk[0], (ulong)msk.Length, ref id) != 0) {
                throw new ArgumentException("GetSecretKeyForId:" + id.ToString());
            }
            return sec;
        }
        public static SecretKey RecoverSecretKey(SecretKey[] secs, Id[] ids)
        {
            SecretKey sec = new SecretKey();
            if (blsSecretKeyRecover(ref sec, ref secs[0], ref ids[0], (ulong)secs.Length) != 0) {
                throw new ArgumentException("Recover");
            }
            return sec;
        }
        public struct PublicKey {
            private ulong v00, v01, v02, v03, v04, v05, v06, v07, v08, v09, v10, v11;
            private ulong v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23;
            public bool IsSame(PublicKey rhs)
            {
                return blsPublicKeyIsSame(ref this, ref rhs) != 0;
            }
            public void SetStr(String s)
            {
                byte[] b = ConvertHexStrToByte(s);
                if (blsPublicKeySetStr(ref this, ref b[0], b.Length, IoEcComp) != 0) {
                    throw new ArgumentException("blsPublicKeySetStr:" + s);
                }
            }
            public override string ToString()
            {
                byte[] b = new byte[1024];
                int size = (int)blsPublicKeyGetStr(ref this, ref b[0], b.Length, IoEcComp);
                if (size == 0) {
                    throw new ArgumentException("blsPublicKeyGetStr");
                }
                return ConvertByteToHexStr(b, size);
            }
            public void Add(PublicKey rhs)
            {
                blsPublicKeyAdd(ref this, ref rhs);
            }
            public bool Verify(Sign sign, string m)
            {
                return blsSignVerify(ref sign, ref this, m, (ulong)m.Length) == 1;
            }
        }
        // publicKey = sum_{i=0}^{mpk.Length - 1} mpk[i] * id^i
        public static PublicKey SharePublicKey(PublicKey[] mpk, Id id)
        {
            PublicKey pub = new PublicKey();
            if (blsPublicKeySet(ref pub, ref mpk[0], (ulong)mpk.Length, ref id) != 0) {
                throw new ArgumentException("GetPublicKeyForId:" + id.ToString());
            }
            return pub;
        }
        public static PublicKey RecoverPublicKey(PublicKey[] pubs, Id[] ids)
        {
            PublicKey pub = new PublicKey();
            if (blsPublicKeyRecover(ref pub, ref pubs[0], ref ids[0], (ulong)pubs.Length) != 0) {
                throw new ArgumentException("Recover");
            }
            return pub;
        }
        public struct Sign {
            private ulong v00, v01, v02, v03, v04, v05, v06, v07, v08, v09, v10, v11;
            public bool IsSame(Sign rhs)
            {
                return blsSignIsSame(ref this, ref rhs) != 0;
            }
            public void SetStr(String s)
            {
                byte[] b = ConvertHexStrToByte(s);
                if (blsSignSetStr(ref this, ref b[0], b.Length, IoEcComp) != 0) {
                    throw new ArgumentException("blsSignSetStr:" + s);
                }
            }
            public override string ToString()
            {
                byte[] b = new byte[1024];
                int size = (int)blsSignGetStr(ref this, ref b[0], b.Length, IoEcComp);
                if (size == 0) {
                    throw new ArgumentException("blsSignGetStr");
                }
                return ConvertByteToHexStr(b, size);
            }
            public void Add(Sign rhs)
            {
                blsSignAdd(ref this, ref rhs);
            }
        }
        public static Sign RecoverSign(Sign[] signs, Id[] ids)
        {
            Sign sign = new Sign();
            if (blsSignRecover(ref sign, ref signs[0], ref ids[0], (ulong)signs.Length) != 0) {
                throw new ArgumentException("Recover");
            }
            return sign;
        }
    }
}