aboutsummaryrefslogtreecommitdiffstats
path: root/ffi/cs/bls256.cs
blob: ccc10e4876f0ef788dd5b3cd76851ef28b72ba38 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
þ½Ž¿using System;
using System.Text;
using System.Runtime.InteropServices;

namespace mcl {
    class BLS256 {
//      public static int IoBin = 2;
//      public static int IoDec = 10;
//      public static int IoHex = 16;
//      public static int IoEcComp = 512; // fixed byte representation
        [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 blsSecretKeyPut(ref SecretKey sec);
        [DllImport("bls256.dll")]
        public static extern void blsSecretKeyCopy(ref SecretKey dst, ref SecretKey src);
        [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, [In][MarshalAs(UnmanagedType.LPStr)] string buf, ulong bufSize, int ioMode);
        [DllImport("bls256.dll")]
        public static extern ulong blsPublicKeyGetStr(ref PublicKey pub, [Out]StringBuilder buf, ulong 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 void blsSignPut(ref Sign sign);
        [DllImport("bls256.dll")]
        public static extern void blsSignCopy(ref Sign dst, ref Sign src);
        [DllImport("bls256.dll")]
        public static extern int blsSignSetStr(ref Sign sign, [In][MarshalAs(UnmanagedType.LPStr)] string buf, ulong bufSize, int ioMode);
        [DllImport("bls256.dll")]
        public static extern ulong blsSignGetStr(ref Sign sign, [Out]StringBuilder buf, ulong 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);

        public static void Init()
        {
            const int CurveFp254BNb = 0;
            const int maxUnitSize = 4;
            if (!System.Environment.Is64BitProcess) {
                throw new PlatformNotSupportedException("not 64-bit system");
            }
            int err = blsInit(CurveFp254BNb, maxUnitSize);
            if (err != 0) {
                throw new InvalidOperationException("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 InvalidOperationException("blsIdSetStr:" + s);
                }
            }
            public string GetStr(int ioMode)
            {
                StringBuilder sb = new StringBuilder(1024);
                ulong size = blsIdGetStr(ref this, sb, (ulong)sb.Capacity + 1, ioMode);
                if (size == 0) {
                    throw new InvalidOperationException("blsIdGetStr");
                }
                return sb.ToString(0, (int)size);
            }
        }
        public struct SecretKey {
            private ulong v0, v1, v2, v3;
        }
        public struct Sign {
            private ulong v00, v01, v02, v03, v04, v05, v06, v07, v08, v09, v10, v11;
        }
        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;
        }
    }
}