Passing a static array to a function
report.keys = keys; // This is my main trouble


You can't assign the contents of one array to the contents of another array.  You can only copy the contents manually from one to the other.

The simplest way is with a loop:

for (int i = 0; i &lt; 6; i++) {
    report.keys[i] = keys[i];
}


There is a helper function - memcpy() - which can do it for you if you prefer:

memcpy(report.keys, keys, 6);


It effectively does exactly the same thing - copy 6 bytes starting from the address of keys into the addresses starting at report.keys.

As for the "hard coded" reports I suggest you create some const arrays in the global context - and even use PROGMEM to ensure they consume no RAM. That, of course, requires an entirely different way of passing and accessing the data.  It may be simpler to split the report into 6 individual variables and pass each byte separately:

void sendKey(byte k0, byte k1, byte k2, byte k3,
             byte k4, byte k5, byte modifiers)
{
  KeyReport report = {0};

  report.keys[0] = k0;
  report.keys[1] = k1;
  report.keys[2] = k2;
  report.keys[3] = k3;
  report.keys[4] = k4;
  report.keys[5] = k5;
  report.modifiers = modifiers;
  report.reserved = 1;
  Keyboard.sendReport(&amp;report);
}

sendKey(0x17, 0, 0, 0, 0, 0, 0x05);


Yes, it's a little more long winded in the function, but calling the function is somewhat more simplified over the other options.