How about precedent? No miner software or pool uses uppercase except yours. It may seem trivial to you but every operation counts on the poolserver side and having to convert a long string to lowercase everytime is a waste of cycles. particularly when in 99.9% of cases the string is already completely lowercase. If you have a good reason for converting to uppercase then fine but if you don't please do what every other miner does so I can stop wasting cpu time for absolutely no reason.
There is reference implementation exists. Function
vector ParseHex(const char* psz) {
static char phexdigit[256] =
{ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
0,1,2,3,4,5,6,7,8,9,-1,-1,-1,-1,-1,-1,
-1,0xa,0xb,0xc,0xd,0xe,0xf,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,0xa,0xb,0xc,0xd,0xe,0xf,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
additional cost by simple translation table.
Without specs, all that works with reference implementation is right, all that don't work is wrong. Isn't it?