I could feed all the edges in B(p) as a constraint, such that all the edges would be contained in the triangulation. However, this does not necessarily entail that this will be the boundary of the triangulation.
You're right that the constrained Delaunay triangulation may fill in the concavities of the boundary. Every triangle, however, is either completely inside or completely outside of the boundary, so it's easy enough to delete the ones outside by traversing the dual of the planar straight-line graph starting from the infinite face, treating the boundary edges as impassable. Jonathan Shewchuk's library Triangle, for example, does this. The license may not be to your liking, but if you already have another library to compute constrained Delaunay triangulations, we're not talking about a lot of additional code.