Program: 52422
Project: 52422
Buggy source:
public ECPoint add(ECPoint b){
  if (this.isInfinity()) {
    return b;
  }
  if (b.isInfinity()) {
    return this;
  }
  ECCurve curve=this.getCurve();
  ECFieldElement X1=this.x;
  ECFieldElement X2=b.getRawXCoord();
  if (X1.isZero()) {
    if (X2.isZero()) {
      return curve.getInfinity();
    }
    return b.add(this);
  }
  ECFieldElement L1=this.y, Z1=this.zs[0];
  ECFieldElement L2=b.getRawYCoord(), Z2=b.getZCoord(0);
  boolean Z1IsOne=Z1.isOne();
  ECFieldElement U2=X2, S2=L2;
  if (!Z1IsOne) {
    U2=U2.multiply(Z1);
    S2=S2.multiply(Z1);
  }
  boolean Z2IsOne=Z2.isOne();
  ECFieldElement U1=X1, S1=L1;
  if (!Z2IsOne) {
    U1=U1.multiply(Z2);
    S1=S1.multiply(Z2);
  }
  ECFieldElement A=S1.add(S2);
  ECFieldElement B=U1.add(U2);
  if (B.isZero()) {
    if (A.isZero()) {
      return twice();
    }
    return curve.getInfinity();
  }
  ECFieldElement X3, L3, Z3;
  if (X2.isZero()) {
    ECPoint p=this.normalize();
    X1=p.getXCoord();
    ECFieldElement Y1=p.getYCoord();
    ECFieldElement Y2=L2;
    ECFieldElement L=Y1.add(Y2).divide(X1);
    X3=L.square().add(L).add(X1).addOne();
    if (X3.isZero()) {
      return new SecT571K1Point(curve,X3,curve.getB(),this.withCompression);
    }
    ECFieldElement Y3=L.multiply(X1.add(X3)).add(X3).add(Y1);
    L3=Y3.divide(X3).add(X3);
    Z3=curve.fromBigInteger(ECConstants.ONE);
  }
 else {
    B=B.square();
    ECFieldElement AU1=A.multiply(U1);
    ECFieldElement AU2=A.multiply(U2);
    X3=AU1.multiply(AU2);
    if (X3.isZero()) {
      return new SecT571K1Point(curve,X3,curve.getB(),this.withCompression);
    }
    ECFieldElement ABZ2=A.multiply(B);
    if (!Z2IsOne) {
      ABZ2=ABZ2.multiply(Z2);
    }
    L3=AU2.add(B).squarePlusProduct(ABZ2,L1.add(Z1));
    Z3=ABZ2;
    if (!Z1IsOne) {
      Z3=Z3.multiply(Z1);
    }
  }
  return new SecT571K1Point(curve,X3,L3,new ECFieldElement[]{Z3},this.withCompression);
}

Fixed version (ground truth):
public ECPoint add(ECPoint b){
  if (this.isInfinity()) {
    return b;
  }
  if (b.isInfinity()) {
    return this;
  }
  ECCurve curve=this.getCurve();
  ECFieldElement X1=this.x;
  ECFieldElement X2=b.getRawXCoord();
  if (X1.isZero()) {
    if (X2.isZero()) {
      return curve.getInfinity();
    }
    return b.add(this);
  }
  ECFieldElement L1=this.y, Z1=this.zs[0];
  ECFieldElement L2=b.getRawYCoord(), Z2=b.getZCoord(0);
  boolean Z1IsOne=Z1.isOne();
  ECFieldElement U2=X2, S2=L2;
  if (!Z1IsOne) {
    U2=U2.multiply(Z1);
    S2=S2.multiply(Z1);
  }
  boolean Z2IsOne=Z2.isOne();
  ECFieldElement U1=X1, S1=L1;
  if (!Z2IsOne) {
    U1=U1.multiply(Z2);
    S1=S1.multiply(Z2);
  }
  ECFieldElement A=S1.add(S2);
  ECFieldElement B=U1.add(U2);
  if (B.isZero()) {
    if (A.isZero()) {
      return twice();
    }
    return curve.getInfinity();
  }
  ECFieldElement X3, L3, Z3;
  if (X2.isZero()) {
    ECPoint p=this.normalize();
    X1=p.getXCoord();
    ECFieldElement Y1=p.getYCoord();
    ECFieldElement Y2=L2;
    ECFieldElement L=Y1.add(Y2).divide(X1);
    X3=L.square().add(L).add(X1);
    if (X3.isZero()) {
      return new SecT571K1Point(curve,X3,curve.getB(),this.withCompression);
    }
    ECFieldElement Y3=L.multiply(X1.add(X3)).add(X3).add(Y1);
    L3=Y3.divide(X3).add(X3);
    Z3=curve.fromBigInteger(ECConstants.ONE);
  }
 else {
    B=B.square();
    ECFieldElement AU1=A.multiply(U1);
    ECFieldElement AU2=A.multiply(U2);
    X3=AU1.multiply(AU2);
    if (X3.isZero()) {
      return new SecT571K1Point(curve,X3,curve.getB(),this.withCompression);
    }
    ECFieldElement ABZ2=A.multiply(B);
    if (!Z2IsOne) {
      ABZ2=ABZ2.multiply(Z2);
    }
    L3=AU2.add(B).squarePlusProduct(ABZ2,L1.add(Z1));
    Z3=ABZ2;
    if (!Z1IsOne) {
      Z3=Z3.multiply(Z1);
    }
  }
  return new SecT571K1Point(curve,X3,L3,new ECFieldElement[]{Z3},this.withCompression);
}