The problem isn't with your rotation logic - it's with the assumption that you're dealing with ARGB data.
If you're getting the buffer from the camera (which I suspect you are), it's actually in YUV format, not ARGB. That's why vImageRotate90_ARGB8888 crashes - you're telling it to rotate data in a format that doesn't match what's actually in memory.
There are two ways to fix this:
The real gotcha here is that camera buffers are almost always YUV, not ARGB. Once you handle the planes correctly, the rotation works fine.