在 z/OS 上,如何确定 C 中哪个安全产品处于活动状态(RACF、ACF2 或 Top Secret)?

mik*_*ike 4 security zos racf

在 z/OS 上,操作系统不要求系统中使用特定的安全产品,而是允许人们选择自己的安全产品。一共有 3 个,它们具有不同的功能。

供参考:Java有一个相关的问答,但我需要在C中执行此操作:How can I certain security manager is active on z/OS using Java?

mik*_*ike 8

这些信息可以从 RCVT(在文档中似乎也称为 CVTRAC)中找到。开头的“id”表示安全提供者:

#ifdef _LP64
  #error "This code is 31-bit addressing mode specific"
#endif

typedef struct {
  char id[4];
} CVTRAC;

typedef struct {
  char unk[0x3E0];
  CVTRAC* cvtrac;
} CVT;

typedef struct {
  char unk[0x10];
  CVT* cvt;
} PSA;

typedef enum {
  SAFUnk=0,
  RACF=1,
  TopSecret=2,
  ACF2=3
} SAFProvider;

static SAFProvider saf_provider()
{

  PSA* psa = (void*) 0;
  char* id = psa->cvt->cvtrac->id;

  if (!memcmp(id, "RCVT", 4)) {
    return RACF;
  } else if (!memcmp(id, "RTSS", 4)) {
    return TopSecret;
  } else if (!memcmp(id, "ACF2", 4)) {
    return ACF2;
  } else {
    return SAFUnk;
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,上面的代码仅在针对 31 位寻址模式构建并且在不使用-qascii 选项的情况下进行编译时才有效(要比较的字符串位于 EBCDIC 中)。