# ARMv9 Vector·AI와 메모리·제어 흐름 보안

v6.18.37 / arch/arm64/include/asm/pointer_auth.h

벡터 연산 확장과 메모리·제어 흐름 보호는 목적이 다릅니다. SVE/SME가 계산 폭을 넓히는 동안 MTE·PAC·BTI·GCS는 서로 다른 오류와 흐름을 검사합니다. 대표 소스로 v6.18.37의 사용자 PAC 키 초기화를 읽습니다. 한 함수로 이 모든 기능이 지원된다고 결론 내리지는 않습니다.

## ptrauth_keys_init_user

```c

static inline void ptrauth_keys_init_user(struct ptrauth_keys_user *keys)
{
	if (system_supports_address_auth()) {
		get_random_bytes(&keys->apia, sizeof(keys->apia));
		get_random_bytes(&keys->apib, sizeof(keys->apib));
		get_random_bytes(&keys->apda, sizeof(keys->apda));
		get_random_bytes(&keys->apdb, sizeof(keys->apdb));
	}

	if (system_supports_generic_auth())
		get_random_bytes(&keys->apga, sizeof(keys->apga));

	ptrauth_keys_install_user(keys);
}

```

### 86행

```c

static inline void ptrauth_keys_init_user(struct ptrauth_keys_user *keys)

```

사용자 실행용 포인터 인증 키 구조를 초기화하고 설치하는 함수입니다.

### 88행

```c

	if (system_supports_address_auth()) {

```

주소 인증을 시스템에서 사용할 수 있는지 확인합니다. 키 필드가 존재한다고 모든 CPU에서 명령을 사용할 수 있는 것은 아닙니다.

### 89행

```c

		get_random_bytes(&keys->apia, sizeof(keys->apia));

```

명령 주소용 A 키 APIA를 난수로 초기화합니다. sizeof로 정확한 키 필드 크기를 지정합니다.

### 90행

```c

		get_random_bytes(&keys->apib, sizeof(keys->apib));

```

명령 주소용 B 키 APIB를 별도로 초기화합니다. A와 B를 같은 키로 복사하는 것이 아닙니다.

### 91행

```c

		get_random_bytes(&keys->apda, sizeof(keys->apda));

```

데이터 주소용 A 키 APDA를 생성합니다.

### 92행

```c

		get_random_bytes(&keys->apdb, sizeof(keys->apdb));

```

데이터 주소용 B 키 APDB를 생성합니다. 네 필드는 서로 다른 인증 용도와 키 선택을 구분합니다.

### 95행

```c

	if (system_supports_generic_auth())

```

일반 인증 기능도 지원되는지 별도로 확인합니다. 주소 인증 조건과 분리되어 있습니다.

### 96행

```c

		get_random_bytes(&keys->apga, sizeof(keys->apga));

```

지원된다면 일반 인증용 APGA 키도 난수로 초기화합니다.

### 98행

```c

	ptrauth_keys_install_user(keys);

```

준비한 키를 사용자 실행용 CPU 상태로 설치하는 helper를 호출합니다. 키 생성과 설치가 다른 작업임을 드러내는 지점입니다.

