Безопасность преобразовывает основы

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

Несмотря на то, что Ваше определенное использование API может не включить кодирование Base64, основные шаги для любого преобразования безопасности подобны; только преобразование специфичные параметры (ключи шифрования, например) отличаются.

Для предотвращения беспорядка этот документ использует Базовые типы данных Основы повсюду. Однако, потому что Основа и Базовые типы Основы, используемые этим API, бесплатные соединенный мостом, можно занять место NSData объекты для CFDataRef, NSString для CFString, и т.д.

Преобразования Base64 продемонстрированы в двух различных формах в разделах, следующих:

Выполнение основные преобразования

Основные шаги для выполнения преобразования являются относительно прямыми:

bullet
Выполнять основное преобразование
  1. Создайте объекты данных или потоки для использования для исходных данных.

    Поскольку большинство преобразовывает, они должны быть NSData или CFDataRef объекты.

    Если Вы считываете данные из файла с помощью чтения, преобразовывают, необходимо обеспечить NSInputStream или CFReadStreamRef объект.

    Этот тривиальный пример создает объект CFData из струны до как показано ниже:

    sourceData = CFDataCreate(
                        kCFAllocatorDefault,
                        (const unsigned char *)sourceCString,
                        (strlen(sourceCString) + 1));
  2. Создайте объект преобразования путем вызова одного из *Create* функции, включая:

    Этот пример создает объекты кодера и декодера Base64 следующим образом:

    encoder = SecEncodeTransformCreate(kSecBase64Encoding, &error);
    if (error) { CFShow(error); exit(-1); }
    decoder = SecDecodeTransformCreate(kSecBase64Encoding, &error);
    if (error) { CFShow(error); exit(-1); }
  3. Установите параметры для преобразования путем вызова SecTransformSetAttribute.

    В целом все преобразовывает за исключением SecTransformCreateReadTransformWithReadStream потребуйте значения для kSecTransformInputAttributeName. Можно найти список других требуемых и дополнительных атрибутов для каждого типа преобразования в документации для того преобразования.

    Например, это преобразование устанавливает входной атрибут в кодер следующим образом:

    SecTransformSetAttribute(encoder, kSecTransformInputAttributeName,
                             sourceData, &error);
    if (error) { CFShow(error); exit(-1); }
  4. Выполните преобразование путем вызова SecTransformExecute или SecTransformExecuteAsync.

    Например:

    encodedData = SecTransformExecute(encoder, &error);
    if (error) { CFShow(error); exit(-1); }

Перечисление 1-1 демонстрирует очень простое использование преобразований, чтобы закодировать и впоследствии декодировать блок данных с помощью кодирования Base64.

Перечисление 1-1  Основная безопасность преобразовывает

#include <CoreFoundation/CoreFoundation.h>
#include <Security/Security.h>
 
void ShowAsString(CFDataRef data);
 
char *sourceCString = "All these worlds are yours except Europa.";
 
/* Encrypts and decrypts a blob of data. */
 
main(int argc, char *argv[])
{
    SecTransformRef encoder, decoder;
    CFDataRef sourceData = NULL, encodedData = NULL, decodedData = NULL;
    CFErrorRef error = NULL;
 
    /* Create a CFData object for the source C string. */
    sourceData = CFDataCreate(
                        kCFAllocatorDefault,
                        (const unsigned char *)sourceCString,
                        (strlen(sourceCString) + 1));
 
    ShowAsString(sourceData);
 
    /* Create the transform objects */
    encoder = SecEncodeTransformCreate(kSecBase64Encoding, &error);
    if (error) { CFShow(error); exit(-1); }
    decoder = SecDecodeTransformCreate(kSecBase64Encoding, &error);
    if (error) { CFShow(error); exit(-1); }
 
    /* Tell the encode transform to get its input from the
       sourceData object. */
    SecTransformSetAttribute(encoder, kSecTransformInputAttributeName,
                             sourceData, &error);
    if (error) { CFShow(error); exit(-1); }
 
    /* Execute the encode transform. */
    encodedData = SecTransformExecute(encoder, &error);
    if (error) { CFShow(error); exit(-1); }
 
    ShowAsString(encodedData);
 
    CFRelease(encoder);
    CFRelease(sourceData);
 
    /* Tell the decode transform to get its input from the
       encodedData object. */
    SecTransformSetAttribute(decoder, kSecTransformInputAttributeName,
                             encodedData, &error);
    if (error) { CFShow(error); exit(-1); }
 
    /* Execute the decode transform. */
    decodedData = SecTransformExecute(decoder, &error);
    if (error) { CFShow(error); exit(-1); }
 
    ShowAsString(decodedData);
 
    CFRelease(decoder);
    CFRelease(encodedData);
    CFRelease(decodedData);
 
}
 
 
/* Creates a CFString from a CFData object, does a CFShow
   on that string, then releases the CFString.
 */
void ShowAsString(CFDataRef data)
{
    CFStringRef str = CFStringCreateFromExternalRepresentation(
                                kCFAllocatorDefault,
                                data,
                                kCFStringEncodingUTF8);
 
    CFShow(str);
    CFRelease(str);
}

Цепочечное выполнение преобразовывает

В дополнение к частному лицу преобразовывает, безопасность преобразовывает API, также обеспечивает способ объединить многократные преобразования в цепочку в последовательности, с каждым преобразовывают работу на результатах предыдущего преобразования.

bullet
Объединять многократные преобразования в цепочку
  1. Создайте преобразования и установите их атрибуты соответственно, как описано в Выполнении Основных Преобразований.

  2. Создайте группу, преобразовывают путем вызова SecTransformCreateGroupTransform.

  3. Соедините преобразования проводом вместе путем вызова SecTransformConnectTransforms.

    В этом вызове Вы говорите группе, какое свойство источника преобразовывают его, должен соединить проводом к который свойство целевого преобразования. Как правило, Вы соединяетесь kSecTransformOutputAttributeName свойство первого преобразования возражает в Вашем конвейере против kSecTransformInputAttributeName свойство второго объекта преобразования. Например:

    SecTransformConnectTransforms(encoder, kSecTransformOutputAttributeName,
                decoder, kSecTransformInputAttributeName, group, &error);
  4. Запустите преобразование путем вызова SecTransformExecute или SecTransformExecuteAsync на группе.

Перечисление 1-2 является заменой для содержания main функция в Перечислении 1-1. Эта версия выполняет Base64, кодируют и декодируют операции в конвейере вместо как две отдельных задачи. (Это не ряд операций, который обычно выполняется вместе, но это - хороший способ продемонстрировать основной процесс объединения в цепочку, не имея необходимость сначала объяснять многократные типы преобразования.)

Перечисление 1-2  Цепочечная безопасность преобразовывает

    SecTransformRef encoder, decoder;
    CFDataRef sourceData = NULL, decodedData = NULL;
    CFErrorRef error = NULL;
    SecGroupTransformRef group;
 
    sourceData = CFDataCreate(
                              kCFAllocatorDefault,
                              (unsigned char *)sourceCString,
                              (strlen(sourceCString) + 1));
 
    /* Create the transform objects */
    encoder = SecEncodeTransformCreate(kSecBase64Encoding, &error);
    if (error) { CFShow(error); exit(-1); }
    decoder = SecDecodeTransformCreate(kSecBase64Encoding, &error);
    if (error) { CFShow(error); exit(-1); }
 
 
    /* Tell the encode transform to get its input from the
       sourceData object. */
    SecTransformSetAttribute(encoder, kSecTransformInputAttributeName, sourceData, &error);
    if (error) { CFShow(error); exit(-1); }
 
    /* Tell the decode transform to get its input from the
       encode transform's output. */
    group = SecTransformCreateGroupTransform();
    SecTransformConnectTransforms(encoder, kSecTransformOutputAttributeName,
    decoder, kSecTransformInputAttributeName, group, &error);
 
    /* Execute both transforms. */
    decodedData = SecTransformExecute(group, &error);
    if (error) { CFShow(error); exit(-1); }
 
    ShowAsString(sourceData);
    ShowAsString(decodedData);
 
    CFRelease(sourceData);
    CFRelease(group);