A while ago I implemented both GJK and EPA. I've tested them with several numbers and as far as I could see they returned correct results. Except when they are rotated. GJK seems to return correct yes/no answers, but my guess is that the simplex itself could be incorrect while still giving correct results.
The return value is correct when the rotation does not influence the penetration/normal. For example, if the objects are on top of each other and one is rotated on the yaw axis, the correct results are returned. However, when it's rotated on the pitch, it either returns with the wrong values or gets into an infinite loop, depending on the input (I've seen both).
The full code on Github:
https://github.com/dorcsyful/Cinkes/blob/master/CinkesCollision/CGJKAlgorithm.cpp
The only thing I changed compared to the version that does not handle rotations is how the support points are calculated:
CVector3 next = CVector3(1, 0, 0); //or whatever the current direction is
CVector3 A = a_Object1->GetTransform().getRotation() *
a_Object1->GetCollisionShape()->Support(a_Object1->GetTransform().getRotation().Transpose() * next)
+ a_Object1->GetTransform().getOrigin();
CVector3 B = a_Object2->GetTransform().getRotation() *
a_Object2->GetCollisionShape()->Support(a_Object2->GetTransform().getRotation().Transpose() *
(next * (-1))) + a_Object2->GetTransform().getOrigin();
CVector3 support = A - B;