Nano Hash - криптовалюты, майнинг, программирование

Документация macOS для структур в Security.h

Я пытаюсь использовать структуру Security.h macOS через Java и JNA. Это означает, что мне нужно реконструировать определенные структуры как классы Java.

Проблема в том, что когда я просматриваю документы для структуры (этот), я вижу только краткое описание структуры без упоминания ее полей. Где я могу получить полное описание структуры в документации Apple?

13.05.2017

Ответы:


1

Для быстрого ознакомления вы можете найти заголовки на сайте Apple с открытым исходным кодом, но ориентироваться на нем сложно, особенно поскольку заголовки находятся в разных местах в зависимости от версии ОС, которую вы хотите проверить. Во всех случаях я обнаружил, что он определен в SecBase.h. Например, вот последний macOS.

И там вы получаете это:

typedef struct CF_BRIDGED_TYPE(id) SECTYPE(SecKeychainItem) *SecKeychainItemRef;

Поэтому вам, вероятно, понадобятся другие заголовки для отслеживания точных полей структуры. Лучший способ сделать это — установить XCode с фреймворками для нужной вам ОС, и вы получите заголовки в своей локальной системе. Например:

$ ls /Applications/Xcode.app/Contents/Developer/Platforms/*.platform/Developer/SDKs/*.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.2.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/SDKs/AppleTVSimulator.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/SDKs/AppleTVSimulator9.2.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS2.2.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/SDKs/WatchSimulator.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/SDKs/WatchSimulator2.2.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator9.3.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h

Однако у меня нет хорошего решения с онлайн-документами.

Другой способ, из памяти, который был более полезен для задачи воссоздания структуры в Java для JNA, заключался бы в создании минимальной программы C (но я не уверен, как это сделать в macOS, связав с инфраструктурой безопасности, возможно, вы do) и передайте его gdb для печати макета структуры, используя ptype:

(gdb) whatis v
type = struct complex
(gdb) ptype v
type = struct complex {
    double real;
    double imag;
}

Но, как отмечено в комментариях, если мы попробуем это здесь, мы получим это:

(gdb) ptype SecKeychainItemRef
type = struct OpaqueSecKeychainItemRef {
  <incomplete type>
}

Боюсь, этот символ добровольно сделан непрозрачным... Подтверждено Бренданом в комментариях:

каждый тип macOS, который я могу придумать, который заканчивается на Ref, является непрозрачным типом (на самом деле указателем), предназначенным только для передачи функциям

Вот сеанс отладки с Xcode: Снимок экрана Xcode

13.05.2017
  • Ух ты. Я не подумал о вопросе Где документы? был бы такой длинный ответ. Похоже, поля не являются частью общедоступного API и поэтому могут быть изменены. Это правильно? О, и вы можете ссылаться на фреймворк, например. gcc -framework Security. 13.05.2017
  • Я... увлекся :) Некоторое время назад я делал это для JNA, но никогда не на macOS, поэтому мне стало любопытно. Кстати, я пробовал ptype SecKeychainItemRef, но все, что я получил, было type = struct OpaqueSecKeychainItemRef { <incomplete type>} * :( Так что да, кажется, что поля являются частным API и даже скрыты или что-то в этом роде. 13.05.2017
  • Я не думаю, что это железно задокументированное правило, но каждый тип macOS, оканчивающийся на Ref, который я могу придумать, является непрозрачным типом (на самом деле указателем), предназначенным только для передачи функциям. 13.05.2017
  • Я предполагаю, что правильный способ обработки такого типа — просто использовать класс Pointer. Спасибо, это очень подробный ответ. 14.05.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..