Could you emphasize - why exactly introducing private header is such a disaster that we have to waste time and efforts trying to not let it happen?
- It's a useless file that's used at exactly 1 place and not even for code used in installed libs but just for the test. At that point you might just as well just pre-declare them in the test source file directly. - It prevents making those function static - It requires static linking for the test - For the A5/[3/4] you bypass the osmo_a5 wrapper and thus don't cover a breakage that would happen there.
The alternative solves all of the above and requires exactly 1 lines changes in the original _a5_4 function :
uint32_t fn_count = (fn_correct) ? osmo_a5_fn_count(fn) : fn;
becomes
uint32_t fn_count = (fn & (1<<31)) ? (fn & ~(1<<31)) : osmo_a5_fn_count(fn);
btw, in your test I also see
+ osmo_a5(4, key, osmo_a5_fn(count), dlout, NULL); + osmo_a5(4, key, osmo_a5_fn(count), NULL, ulout);
Why separate ? The case where both dlout and ulout are requested at the same time should work as well.
Cheers,
Sylvain