|
54 | 54 | // OF THE POSSIBILITY OF SUCH DAMAGE. |
55 | 55 | import 'package:blockchain_utils/crypto/crypto/cdsa/crypto_ops/const/const.dart'; |
56 | 56 | import 'package:blockchain_utils/crypto/crypto/cdsa/crypto_ops/models/models.dart'; |
| 57 | +import 'package:blockchain_utils/crypto/crypto/cdsa/point/edwards.dart'; |
| 58 | +import 'package:blockchain_utils/crypto/crypto/cdsa/utils/ed25519.dart'; |
57 | 59 | import 'package:blockchain_utils/crypto/crypto/exception/exception.dart'; |
58 | 60 | import 'package:blockchain_utils/helper/extensions/extensions.dart'; |
59 | 61 | import 'package:blockchain_utils/utils/binary/utils.dart'; |
@@ -5048,6 +5050,268 @@ class CryptoOps { |
5048 | 5050 | geP1P1ToP2(r, t); |
5049 | 5051 | } |
5050 | 5052 | } |
| 5053 | + |
| 5054 | + /// these method is not related to cryptoOps |
| 5055 | + static List<EDPoint> geDsmPrecompVartimeFast(EDPoint point) { |
| 5056 | + final List<EDPoint> oddMultiples = []; |
| 5057 | + final twoP = point.doublePoint(); |
| 5058 | + var current = point; |
| 5059 | + |
| 5060 | + for (int i = 0; i < 8; i++) { |
| 5061 | + oddMultiples.add(current); |
| 5062 | + current = current + twoP; // Next odd multiple |
| 5063 | + } |
| 5064 | + |
| 5065 | + return oddMultiples; |
| 5066 | + } |
| 5067 | + |
| 5068 | + static EDPoint geDoubleScalarMultPrecompVartimeFast( |
| 5069 | + List<int> a, List<EDPoint> aI, List<int> b, List<EDPoint> bI) { |
| 5070 | + final aslide = List<int>.filled(256, 0); |
| 5071 | + final bslide = List<int>.filled(256, 0); |
| 5072 | + CryptoOps.slide(aslide, a); |
| 5073 | + CryptoOps.slide(bslide, b); |
| 5074 | + |
| 5075 | + EDPoint? r; |
| 5076 | + |
| 5077 | + for (int i = 255; i >= 0; i--) { |
| 5078 | + final aVal = aslide[i]; |
| 5079 | + final bVal = bslide[i]; |
| 5080 | + |
| 5081 | + if (r == null) { |
| 5082 | + if (aVal != 0) { |
| 5083 | + final idx = (aVal.abs() - 1) ~/ 2; |
| 5084 | + final ai = aI[idx]; |
| 5085 | + r = aVal > 0 ? ai : -ai; |
| 5086 | + } |
| 5087 | + |
| 5088 | + if (bVal != 0) { |
| 5089 | + final idx = (bVal.abs() - 1) ~/ 2; |
| 5090 | + final bi = bI[idx]; |
| 5091 | + r = (r == null) ? (bVal > 0 ? bi : -bi) : (r + (bVal > 0 ? bi : -bi)); |
| 5092 | + } |
| 5093 | + |
| 5094 | + if (r == null) continue; // still no op |
| 5095 | + } else { |
| 5096 | + r = r * BigInt.two; |
| 5097 | + |
| 5098 | + if (aVal != 0) { |
| 5099 | + final idx = (aVal.abs() - 1) ~/ 2; |
| 5100 | + final ai = aI[idx]; |
| 5101 | + r += aVal > 0 ? ai : -ai; |
| 5102 | + } |
| 5103 | + |
| 5104 | + if (bVal != 0) { |
| 5105 | + final idx = (bVal.abs() - 1) ~/ 2; |
| 5106 | + final bi = bI[idx]; |
| 5107 | + r += bVal > 0 ? bi : -bi; |
| 5108 | + } |
| 5109 | + } |
| 5110 | + } |
| 5111 | + |
| 5112 | + if (r == null) { |
| 5113 | + throw Exception( |
| 5114 | + "Both scalars are zero; result undefined without identity support."); |
| 5115 | + } |
| 5116 | + |
| 5117 | + return r; |
| 5118 | + } |
| 5119 | + |
| 5120 | + static EDPoint geTripleScalarMultBaseVartimeFast( |
| 5121 | + {required List<int> a, |
| 5122 | + required List<int> b, |
| 5123 | + required List<EDPoint> bI, |
| 5124 | + required List<int> c, |
| 5125 | + required List<EDPoint> cI}) { |
| 5126 | + final aslide = List<int>.filled(256, 0); |
| 5127 | + final bslide = List<int>.filled(256, 0); |
| 5128 | + final cslide = List<int>.filled(256, 0); |
| 5129 | + CryptoOps.slide(aslide, a); |
| 5130 | + CryptoOps.slide(bslide, b); |
| 5131 | + CryptoOps.slide(cslide, c); |
| 5132 | + |
| 5133 | + EDPoint? r; |
| 5134 | + // Logg.error("calll ?!"); |
| 5135 | + for (int i = 255; i >= 0; i--) { |
| 5136 | + final aVal = aslide[i]; |
| 5137 | + final bVal = bslide[i]; |
| 5138 | + final cVal = cslide[i]; |
| 5139 | + |
| 5140 | + if (r == null) { |
| 5141 | + if (aVal != 0) { |
| 5142 | + final idx = (aVal.abs() - 1) ~/ 2; |
| 5143 | + final ai = Ed25519Utils.asPoint( |
| 5144 | + BytesUtils.fromHexString(CryptoOpsConst.geBiPointBytes[idx])); |
| 5145 | + r = aVal > 0 ? ai : -ai; |
| 5146 | + } |
| 5147 | + |
| 5148 | + if (bVal != 0) { |
| 5149 | + final idx = (bVal.abs() - 1) ~/ 2; |
| 5150 | + final bi = bI[idx]; |
| 5151 | + r = (r == null) ? (bVal > 0 ? bi : -bi) : (r + (bVal > 0 ? bi : -bi)); |
| 5152 | + } |
| 5153 | + |
| 5154 | + if (cVal != 0) { |
| 5155 | + final idx = (cVal.abs() - 1) ~/ 2; |
| 5156 | + final ci = cI[idx]; |
| 5157 | + r = (r == null) ? (cVal > 0 ? ci : -ci) : (r + (cVal > 0 ? ci : -ci)); |
| 5158 | + } |
| 5159 | + |
| 5160 | + if (r == null) continue; |
| 5161 | + } else { |
| 5162 | + r = r * BigInt.two; |
| 5163 | + |
| 5164 | + if (aVal != 0) { |
| 5165 | + final idx = (aVal.abs() - 1) ~/ 2; |
| 5166 | + final ai = Ed25519Utils.asPoint( |
| 5167 | + BytesUtils.fromHexString(CryptoOpsConst.geBiPointBytes[idx])); |
| 5168 | + r += aVal > 0 ? ai : -ai; |
| 5169 | + } |
| 5170 | + |
| 5171 | + if (bVal != 0) { |
| 5172 | + final idx = (bVal.abs() - 1) ~/ 2; |
| 5173 | + final bi = bI[idx]; |
| 5174 | + r += bVal > 0 ? bi : -bi; |
| 5175 | + } |
| 5176 | + |
| 5177 | + if (cVal != 0) { |
| 5178 | + final idx = (cVal.abs() - 1) ~/ 2; |
| 5179 | + final ci = cI[idx]; |
| 5180 | + r += cVal > 0 ? ci : -ci; |
| 5181 | + } |
| 5182 | + } |
| 5183 | + } |
| 5184 | + |
| 5185 | + if (r == null) { |
| 5186 | + throw Exception( |
| 5187 | + "All scalars are zero; result undefined without identity support."); |
| 5188 | + } |
| 5189 | + |
| 5190 | + return r; |
| 5191 | + } |
| 5192 | + |
| 5193 | + static EDPoint geDoubleScalarMultBaseVartimeFast( |
| 5194 | + {required List<int> a, required EDPoint gA, required List<int> b}) { |
| 5195 | + final aslide = List<int>.filled(256, 0); |
| 5196 | + final bslide = List<int>.filled(256, 0); |
| 5197 | + CryptoOps.slide(aslide, a); |
| 5198 | + CryptoOps.slide(bslide, b); |
| 5199 | + final aI = geDsmPrecompVartimeFast(gA); |
| 5200 | + final Map<int, String> res = {}; |
| 5201 | + EDPoint? r; |
| 5202 | + // Logg.error("calll ?!"); |
| 5203 | + for (int i = 255; i >= 0; i--) { |
| 5204 | + final aVal = aslide[i]; |
| 5205 | + final bVal = bslide[i]; |
| 5206 | + |
| 5207 | + if (r == null) { |
| 5208 | + if (aVal != 0) { |
| 5209 | + final idx = (aVal.abs() - 1) ~/ 2; |
| 5210 | + final bi = aI[idx]; |
| 5211 | + r = aVal > 0 ? bi : -bi; |
| 5212 | + } |
| 5213 | + if (bVal != 0) { |
| 5214 | + final idx = (bVal.abs() - 1) ~/ 2; |
| 5215 | + final ai = Ed25519Utils.asPoint( |
| 5216 | + BytesUtils.fromHexString(CryptoOpsConst.geBiPointBytes[idx])); |
| 5217 | + r = (r == null) ? (bVal > 0 ? ai : -ai) : (r + (bVal > 0 ? ai : -ai)); |
| 5218 | + } |
| 5219 | + |
| 5220 | + // if (r == null) continue; |
| 5221 | + } else { |
| 5222 | + r = r * BigInt.two; |
| 5223 | + |
| 5224 | + if (aVal != 0) { |
| 5225 | + final idx = (aVal.abs() - 1) ~/ 2; |
| 5226 | + final bi = aI[idx]; |
| 5227 | + r += aVal > 0 ? bi : -bi; |
| 5228 | + } |
| 5229 | + if (bVal != 0) { |
| 5230 | + final idx = (bVal.abs() - 1) ~/ 2; |
| 5231 | + final ai = Ed25519Utils.asPoint( |
| 5232 | + BytesUtils.fromHexString(CryptoOpsConst.geBiPointBytes[idx])); |
| 5233 | + r += bVal > 0 ? ai : -ai; |
| 5234 | + } |
| 5235 | + res.addAll({i: r.toHex()}); |
| 5236 | + } |
| 5237 | + } |
| 5238 | + |
| 5239 | + if (r == null) { |
| 5240 | + throw Exception( |
| 5241 | + "All scalars are zero; result undefined without identity support."); |
| 5242 | + } |
| 5243 | + |
| 5244 | + return r; |
| 5245 | + } |
| 5246 | + |
| 5247 | + static EDPoint geTripleScalarMultPrecompVartimeFast( |
| 5248 | + List<int> a, |
| 5249 | + List<EDPoint> aI, |
| 5250 | + List<int> b, |
| 5251 | + List<EDPoint> bI, |
| 5252 | + List<int> c, |
| 5253 | + List<EDPoint> cI) { |
| 5254 | + final aslide = List<int>.filled(256, 0); |
| 5255 | + final bslide = List<int>.filled(256, 0); |
| 5256 | + final cslide = List<int>.filled(256, 0); |
| 5257 | + |
| 5258 | + CryptoOps.slide(aslide, a); |
| 5259 | + CryptoOps.slide(bslide, b); |
| 5260 | + CryptoOps.slide(cslide, c); |
| 5261 | + |
| 5262 | + EDPoint? r; |
| 5263 | + |
| 5264 | + for (int i = 255; i >= 0; i--) { |
| 5265 | + final aVal = aslide[i]; |
| 5266 | + final bVal = bslide[i]; |
| 5267 | + final cVal = cslide[i]; |
| 5268 | + |
| 5269 | + if (r == null) { |
| 5270 | + if (aVal != 0) { |
| 5271 | + final idx = (aVal.abs() - 1) ~/ 2; |
| 5272 | + final ai = aI[idx]; |
| 5273 | + r = aVal > 0 ? ai : -ai; |
| 5274 | + } |
| 5275 | + if (bVal != 0) { |
| 5276 | + final idx = (bVal.abs() - 1) ~/ 2; |
| 5277 | + final bi = bI[idx]; |
| 5278 | + r = (r == null) ? (bVal > 0 ? bi : -bi) : (r + (bVal > 0 ? bi : -bi)); |
| 5279 | + } |
| 5280 | + if (cVal != 0) { |
| 5281 | + final idx = (cVal.abs() - 1) ~/ 2; |
| 5282 | + final ci = cI[idx]; |
| 5283 | + r = (r == null) ? (cVal > 0 ? ci : -ci) : (r + (cVal > 0 ? ci : -ci)); |
| 5284 | + } |
| 5285 | + |
| 5286 | + if (r == null) continue; // still no op |
| 5287 | + } else { |
| 5288 | + r = r * BigInt.two; |
| 5289 | + |
| 5290 | + if (aVal != 0) { |
| 5291 | + final idx = (aVal.abs() - 1) ~/ 2; |
| 5292 | + final ai = aI[idx]; |
| 5293 | + r += aVal > 0 ? ai : -ai; |
| 5294 | + } |
| 5295 | + if (bVal != 0) { |
| 5296 | + final idx = (bVal.abs() - 1) ~/ 2; |
| 5297 | + final bi = bI[idx]; |
| 5298 | + r += bVal > 0 ? bi : -bi; |
| 5299 | + } |
| 5300 | + if (cVal != 0) { |
| 5301 | + final idx = (cVal.abs() - 1) ~/ 2; |
| 5302 | + final ci = cI[idx]; |
| 5303 | + r += cVal > 0 ? ci : -ci; |
| 5304 | + } |
| 5305 | + } |
| 5306 | + } |
| 5307 | + |
| 5308 | + if (r == null) { |
| 5309 | + throw CryptoException( |
| 5310 | + "All scalars are zero; result undefined without identity support."); |
| 5311 | + } |
| 5312 | + |
| 5313 | + return r; |
| 5314 | + } |
5051 | 5315 | } |
5052 | 5316 |
|
5053 | 5317 | extension _BytesHelper on List<int> { |
|
0 commit comments