Once you have the collision normal (not the normal of the face because corner collisions won't work right that way), you can just split the velocity (which should really be a vector, not a quaternion) into two: normal velocity and tangent velocity.
normalVelocity = dot( collisionNormal, linearVelocity ) * collisionNormal;
tangentVelocity = linearVelocity - normalVelocity;
Now you can just invert the normal velocity to make the object bounce off the collision and recombine both into the new linear velocity vector.
normalVelocity *= -1;
linearVelocity = normalVelocity + tangentVelocity;
I won't cover quaternion-to-vector (and reverse) transformations in this answer because a quaternion isn't the most effective representation of the data. A simple 3D vector does the job as expected and has been already used practically everywhere.