source: trunk/PKCS1/Library/BleichenbacherSignature.cs @ 1650

Last change on this file since 1650 was 1650, checked in by schomburg, 11 years ago

initial commit of PKCS1 Plugin

File size: 10.2 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Org.BouncyCastle.Math;
6
7
8namespace PKCS1.Library
9{
10    class BleichenbacherSignature : Signature
11    {
12        protected int m_dataBlockStartPos = 2072;
13        public int DataBlockStartPos
14        {
15            set
16            {
17                //TODO zulässigen Wertebereich weiter einschraenken?
18                if ((int)value > 0 && (int)value < RSAKeyManager.getInstance().RsaKeySize)
19                {
20                    this.m_dataBlockStartPos = (int)value;
21                }
22                else
23                {
24                    this.m_dataBlockStartPos = 2072;
25                }
26            }
27            get
28            {
29                return this.m_dataBlockStartPos;
30            }
31        }
32
33        public override void GenerateSignature()
34        {
35            this.m_KeyLength = RSAKeyManager.getInstance().RsaKeySize;
36
37            int hashDigestLength = Hashfunction.getDigestSize() * 8; // weil Size in Byte zurückgegeben wird
38            int hashIdentLength = Datablock.getInstance().HashFunctionIdent.DERIdent.Length * 4; // weil ein zeichen im string = 4 bit           
39            int keyLength = this.m_KeyLength;
40            BigInteger derIdent = new BigInteger(Datablock.getInstance().HashFunctionIdent.DERIdent, 16);
41            BigInteger datablockLength = BigInteger.ValueOf(hashDigestLength + hashIdentLength + 8); // Länge Datenblock inkl 0-Byte (=8Bit)
42
43            bool isDivByThree = false;
44            BigInteger N = null;
45            BigInteger datablock = null;
46
47            while (false == isDivByThree)
48            {
49                BigInteger hashDigest = new BigInteger(1, Hashfunction.generateHashDigest(Datablock.getInstance().Message, Datablock.getInstance().HashFunctionIdent));
50                // T*2^160 + H
51                datablock = derIdent.Multiply(BigInteger.Two.Pow(hashDigestLength)).Add(hashDigest); // Datablock erstellen; T=HashFuncIdent; H=HashDigest
52                N = (BigInteger.Two.Pow(datablockLength.IntValue)).Subtract(datablock); // N muss vielfaches von 3 sein
53
54                if (0 == (N.Mod(BigInteger.Three)).IntValue)
55                {
56                    isDivByThree = true;
57                }
58                else
59                {
60                    Datablock.getInstance().Message = Datablock.getInstance().Message + " ";
61                }
62            }
63
64            BigInteger sigLengthWithoutZeros = BigInteger.ValueOf(this.m_KeyLength - 15); // 15 weil die ersten 15 bit 0 sind
65            BigInteger startPos = BigInteger.ValueOf(this.m_dataBlockStartPos);
66            BigInteger endPos = startPos.Add(datablockLength);
67            BigInteger sigLengthDivThree = sigLengthWithoutZeros.Divide(BigInteger.Three); // TODO muss Ganzzahl sein
68           
69            BigInteger testbeta = endPos.Subtract(BigInteger.Two.Multiply(sigLengthDivThree)).Subtract(datablockLength); // sollte 34 seinbei keylength 3072
70
71            //2^3057 - 2^ (2038 + 288 + 34) == 2^3057 - 2^2360
72            BigInteger fakeSig = (BigInteger.Two.Pow(sigLengthWithoutZeros.IntValue)).Subtract( BigInteger.Two.Pow( 2 * sigLengthDivThree.IntValue + datablockLength.IntValue + testbeta.IntValue ));
73
74            // 2^3057 - 2^2360 + 2^2072 * N
75            fakeSig = fakeSig.Add( (BigInteger.Two.Pow( startPos.IntValue )).Multiply(datablock) );
76            fakeSig = fakeSig.Add( BigInteger.Two.Pow(startPos.IntValue-8).Multiply(BigInteger.ValueOf(125)) ); // add garbage
77
78            BigInteger fakeSigResult = MathFunctions.cuberoot2(fakeSig);
79
80            byte[] returnByteArray = new byte[this.m_KeyLength / 8]; // KeyLength is in bit
81            Array.Copy(fakeSigResult.ToByteArray(), 0, returnByteArray, returnByteArray.Length - fakeSigResult.ToByteArray().Length, fakeSigResult.ToByteArray().Length);
82
83            this.m_Signature = returnByteArray;
84            this.m_bSigGenerated = true;
85            this.OnRaiseSigGenEvent(SignatureType.Bleichenbacher);
86        }
87
88        /*
89        public void GenerateSignature2()
90        {
91            // RSA Schlüssellänge setzen für Methode in Oberklasse
92            this.m_KeyLength = RSAKeyManager.getInstance().RsaKeySize;
93
94            // TODO prüfen ob Rsa Schlüssel generiert wurde
95            // TODO User mitteilen dass evtl Leerzeichen an message angehangen wurden und in HwControl Digest korrigieren
96            BigInteger T = new BigInteger(Datablock.getInstance().HashFunctionIdent.DERIdent, 16);
97            string test1 = T.ToString(16);
98            BigInteger a = null;
99            bool isDivByThree = false;
100
101            int hashDigestLength = Hashfunction.getDigestSize() * 8; // weil Size in Byte zurückgegeben wird
102            int hashIdentLength = Datablock.getInstance().HashFunctionIdent.DERIdent.Length * 4; // weil ein zeichen im string = 4 bit
103            int datablocklength = hashDigestLength + hashIdentLength + 8; // Länge Datenblock inkl 0-Byte (=8Bit)
104
105            while (false == isDivByThree)
106            {
107                //byte[] hashDigest = Hashfunction.generateHashDigest(Datablock.getInstance().Message, Datablock.getInstance().HashFunctionIdent);
108                //BigInteger testBigInt2 = new BigInteger(1, hashDigest);
109                //BigInteger testBigInt = new BigInteger( Hashfunction.generateHashDigest(Datablock.getInstance().Message, Datablock.getInstance().HashFunctionIdent) );
110                //string testHashDigest = testBigInt.ToString(16);
111                //string testHashDigest2 = testBigInt2.ToString(16);
112
113                BigInteger H = new BigInteger(1, Hashfunction.generateHashDigest(Datablock.getInstance().Message, Datablock.getInstance().HashFunctionIdent));
114                BigInteger helpSubst = T.Multiply(BigInteger.Two.Pow(hashDigestLength)).Add(H); // Datablock erstellen; T=HashFuncIdent; H=HashDigest
115                //string test = helpSubst.ToString(16);
116                a = (BigInteger.Two.Pow(datablocklength)).Subtract(helpSubst); // a = 2^288- (helpsubst); muss div by three sein
117
118                if (0 == (a.Mod(BigInteger.Three)).IntValue)
119                {
120                    isDivByThree = true;
121                }
122                else
123                {
124                    Datablock.getInstance().Message = Datablock.getInstance().Message + " ";
125                }
126            }
127            // s = 2^1019-a/3*2^34
128            // 1019 ist fix wenn Modulus 3072 lang ist
129            BigInteger fakedSignature = (BigInteger.Two.Pow(1019)).Subtract(a.Divide(BigInteger.Three).Multiply(BigInteger.Two.Pow(34)));
130            //string test2 = fakedSignature.ToString(16);
131
132            byte[] returnByteArray = new byte[this.m_KeyLength / 8]; // KeyLength is in bit
133            Array.Copy(fakedSignature.ToByteArray(), 0, returnByteArray, returnByteArray.Length - fakedSignature.ToByteArray().Length, fakedSignature.ToByteArray().Length);
134
135            this.m_Signature = returnByteArray;
136            this.m_bSigGenerated = true;
137            this.OnRaiseSigGenEvent(SignatureType.Bleichenbacher);
138
139            //this.generateSignature2();
140        }
141
142        public void GenerateSignature3()
143        {
144            this.m_KeyLength = RSAKeyManager.getInstance().RsaKeySize;
145
146            int hashDigestLength = Hashfunction.getDigestSize() * 8; // weil Size in Byte zurückgegeben wird
147            int hashIdentLength = Datablock.getInstance().HashFunctionIdent.DERIdent.Length * 4; // weil ein zeichen im string = 4 bit           
148            BigInteger derIdent = new BigInteger(Datablock.getInstance().HashFunctionIdent.DERIdent, 16);
149
150            BigInteger datablockLength = BigInteger.ValueOf(hashDigestLength + hashIdentLength + 8); // Länge Datenblock inkl 0-Byte (=8Bit)
151            bool isDivByThree = false;
152            BigInteger N = null;
153
154            while (false == isDivByThree)
155            {
156                BigInteger hashDigest = new BigInteger(1, Hashfunction.generateHashDigest(Datablock.getInstance().Message, Datablock.getInstance().HashFunctionIdent));
157                BigInteger D = derIdent.Multiply(BigInteger.Two.Pow(hashDigestLength)).Add(hashDigest); // Datablock erstellen; T=HashFuncIdent; H=HashDigest
158                N = (BigInteger.Two.Pow(datablockLength.IntValue)).Subtract(D); // N muss vielfaches von 3 sein
159
160                if (0 == (N.Mod(BigInteger.Three)).IntValue)
161                {
162                    isDivByThree = true;
163                }
164                else
165                {
166                    Datablock.getInstance().Message = Datablock.getInstance().Message + " ";
167                }
168            }
169            BigInteger x = BigInteger.ValueOf(this.m_KeyLength - 15); // 15 weil die ersten 15 bit 0 sind
170            BigInteger startPos = BigInteger.ValueOf(2072); // durch Eingabe ersetzen
171            BigInteger endPos = startPos.Add(datablockLength);
172
173            ///////// nicht zur Berechnung nötig
174            BigInteger lengthDivThree = x.Divide(BigInteger.Three);
175            BigInteger beta = endPos.Subtract(BigInteger.Two.Multiply(lengthDivThree)).Subtract(datablockLength); // sollte 34 sein
176            //////////
177
178            //BigInteger garbage = (N.Pow(2).Multiply(
179            //BigInteger fakeSig = BigInteger.Two.Pow(this.m_KeyLength).Subtract(N.Multiply(BigInteger.Two.Pow(startPos)));
180            BigInteger A = BigInteger.Two.Pow(lengthDivThree.IntValue);
181            BigInteger B = (N.Multiply(BigInteger.Two.Pow(beta.IntValue)).Divide(BigInteger.Three));
182
183            BigInteger fakeSig = A.Pow(3).Subtract((BigInteger.Three.Multiply((A.Pow(2))).Multiply(B))).Add((BigInteger.Three.Multiply(A.Multiply((B.Pow(2)))))).Subtract((B.Pow(3)));
184            string test = fakeSig.ToString(16);
185            BigInteger fakeSigResult = MathFunctions.cuberoot(fakeSig);
186
187
188            byte[] returnByteArray = new byte[this.m_KeyLength / 8]; // KeyLength is in bit
189            Array.Copy(fakeSigResult.ToByteArray(), 0, returnByteArray, returnByteArray.Length - fakeSigResult.ToByteArray().Length, fakeSigResult.ToByteArray().Length);
190
191            this.m_Signature = returnByteArray;
192            this.m_bSigGenerated = true;
193            this.OnRaiseSigGenEvent(SignatureType.Bleichenbacher);
194        }
195        */
196    }
197}
Note: See TracBrowser for help on using the repository browser.