|
1 | 1 | package cz.crcs.ectester.common.ec;
|
2 | 2 |
|
3 | 3 | import cz.crcs.ectester.common.util.ByteUtil;
|
| 4 | +import cz.crcs.ectester.common.util.CardUtil; |
4 | 5 |
|
5 | 6 | import java.io.ByteArrayOutputStream;
|
6 | 7 | import java.util.ArrayList;
|
@@ -202,6 +203,68 @@ public byte[] flatten(short params) {
|
202 | 203 | return (out.size() == 0) ? null : out.toByteArray();
|
203 | 204 | }
|
204 | 205 |
|
| 206 | + public boolean inflate(byte[] flattened) { |
| 207 | + short paramMask = EC_Consts.PARAMETER_FP; |
| 208 | + int i = 0; |
| 209 | + int offset = 0; |
| 210 | + while (paramMask <= EC_Consts.PARAMETER_S) { |
| 211 | + short masked = (short) (this.params & paramMask); |
| 212 | + if (masked != 0) { |
| 213 | + short length = ByteUtil.getShort(flattened, offset); |
| 214 | + offset += 2; |
| 215 | + byte[] param = new byte[length]; |
| 216 | + System.arraycopy(flattened, offset, param, 0, length); |
| 217 | + offset += length; |
| 218 | + //System.out.println(CardUtil.getParams(masked) + " Length: " + length + " Param: " + ByteUtil.bytesToHex(param, false)); |
| 219 | + //System.out.println(); |
| 220 | + if (masked == EC_Consts.PARAMETER_F2M) { |
| 221 | + data[i] = new byte[2]; |
| 222 | + data[i + 1] = new byte[2]; |
| 223 | + data[i + 2] = new byte[2]; |
| 224 | + data[i + 3] = new byte[2]; |
| 225 | + if (length == 4) { |
| 226 | + // only m and e_1, other e are zero |
| 227 | + System.arraycopy(param, 0, data[i], 0, 2); |
| 228 | + System.arraycopy(param, 2, data[i + 1], 0, 2); |
| 229 | + } else if (length == 8) { |
| 230 | + // all m, e_1, e_2, e_3 are specified |
| 231 | + System.arraycopy(param, 0, data[i], 0, 2); |
| 232 | + System.arraycopy(param, 2, data[i + 1], 0, 2); |
| 233 | + System.arraycopy(param, 4, data[i + 2], 0, 2); |
| 234 | + System.arraycopy(param, 6, data[i + 3], 0, 2); |
| 235 | + } |
| 236 | + } else if (masked == EC_Consts.PARAMETER_G || masked == EC_Consts.PARAMETER_W) { |
| 237 | + if ((length - 1) % 2 != 0) { |
| 238 | + return false; |
| 239 | + } |
| 240 | + int half = (length - 1) / 2; |
| 241 | + data[i] = new byte[half]; |
| 242 | + data[i + 1] = new byte[half]; |
| 243 | + System.arraycopy(param, 1, data[i], 0, half); |
| 244 | + System.arraycopy(param, 1 + half, data[i + 1], 0, half); |
| 245 | + } else { |
| 246 | + data[i] = param; |
| 247 | + } |
| 248 | + } |
| 249 | + |
| 250 | + if (masked == EC_Consts.PARAMETER_F2M) { |
| 251 | + i += 4; |
| 252 | + } else if (masked == EC_Consts.PARAMETER_G || masked == EC_Consts.PARAMETER_W) { |
| 253 | + i += 2; |
| 254 | + } else if (masked != 0) { |
| 255 | + i++; |
| 256 | + } |
| 257 | + paramMask = (short) (paramMask << 1); |
| 258 | + } |
| 259 | + return true; |
| 260 | + } |
| 261 | + |
| 262 | + public static EC_Params inflate(short params, byte[] flattened) { |
| 263 | + EC_Params p = new EC_Params(params); |
| 264 | + p.inflate(flattened); |
| 265 | + return p; |
| 266 | + } |
| 267 | + |
205 | 268 | @Override
|
206 | 269 | public String[] expand() {
|
207 | 270 | List<String> out = new ArrayList<>();
|
|
0 commit comments