absl::StatusOr ExtractGcmParameters()

in kmsp11/operation/aes_gcm.cc [233:266]


absl::StatusOr<CK_GCM_PARAMS> ExtractGcmParameters(void* parameters,
                                                   CK_ULONG parameters_size) {
  if (parameters_size != sizeof(CK_GCM_PARAMS)) {
    return InvalidMechanismParamError(
        "mechanism parameters must be of type CK_GCM_PARAMS", SOURCE_LOCATION);
  }

  CK_GCM_PARAMS params = *reinterpret_cast<CK_GCM_PARAMS*>(parameters);

  if (!params.pIv) {
    return InvalidMechanismParamError(
        "missing pIv param, which should point to a zero-initialized 12-byte "
        "buffer",
        SOURCE_LOCATION);
  }
  if (params.ulIvLen != kIvBytes || params.ulIvBits != kIvBits) {
    return InvalidMechanismParamError(
        absl::StrFormat("the only supported IV length is the default %u bytes",
                        kIvBytes),
        SOURCE_LOCATION);
  }
  if (params.ulAADLen != 0 && !params.pAAD) {
    return InvalidMechanismParamError(
        "AAD length specified but the AAD pointer is invalid", SOURCE_LOCATION);
  }
  if (params.ulTagBits != kTagBits) {
    return InvalidMechanismParamError(
        absl::StrFormat("the only supported tag length is the default %u bits",
                        kTagBits),
        SOURCE_LOCATION);
  }

  return params;
}