¿Por qué SecKeyEncrypt devolvería paramErr (-50) para cadenas de input de más de 246 bytes?

Estoy usando SecKeyEncrypt con una cadena con formatting JSON como input. Si pasa SecKeyEncrypt un plainTextLength de less de 246, funciona. Si le paso una longitud de 246 o más, falla con el valor de retorno: paramErr (-50) .

Podría ser una cuestión de la cadena en sí. Un ejemplo de lo que podría enviar SecKeyEncrypt es:

 { "Manejar": "música-list", "sym_key": "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALeaEO7ZrjgOFGLBzBHZtQuzH2GNDYMLWP + fIFNu5Y + + 59C6HECY jt0yOXXom2mzp / WYYI / 9G + Ig8OD6YiKv2nMCAwEAAQ ==", "APP_ID": "xgfdt.LibraryTestApp", "api_key": "7e080f74de3625b90dd293fc8be560a5cdfafc08" }

El carácter 245 es '0'.

La ÚNICA input que está cambiando entre este funcionamiento y es el plainTextLength. SecKeyGetBlockSize() está devolviendo 256, por lo que cualquier input de hasta 256 caracteres debería funcionar.

Aquí está mi método de encryption:

 + (NSData *) cifrar: (NSString *) datos utilizandoPublicKeyWithTag: label (NSString *)
 {

     OSStatus status = noErr;

     size_t cipherBufferSize;
     uint8_t * cipherBuffer;

     // [cipherBufferSize]
     size_t dataSize = 246; // [data lengthOfBytesUsingEncoding: NSUTF8StringEncoding];
     const uint8_t * textData = [[data dataUsingEncoding: NSUTF8StringEncoding] bytes];

     SecKeyRef publicKey = [Encryption copyPublicKeyForTag: label];

     NSAssert (publicKey, @ "¡La key pública a la que hace reference la label debe haberse almacenado en el llavero antes de intentar encriptar los datos que la usen!");

     // Asignar un búfer

     cipherBufferSize = SecKeyGetBlockSize (publicKey);
     // este valor no se modificará, mientras que cipherBufferSize puede.
     const size_t fullCipherBufferSize = cipherBufferSize;
     cipherBuffer = malloc (cipherBufferSize);

     NSMutableData * accumulatedEncryptedData = [NSMutableData dataWithCapacity: 0];

     // Manejo de errores

     para (int ii = 0; ii * fullCipherBufferSize <dataSize; ii ++) {
         const uint8_t * dataToEncrypt = (textData + (ii * fullCipherBufferSize));
         const size_t subsize = (((ii + 1) * fullCipherBufferSize)> dataSize)?  fullCipherBufferSize - (((ii + 1) * fullCipherBufferSize) - dataSize): fullCipherBufferSize;

         // Cifrar usando la key pública.
         status = SecKeyEncrypt (publicKey,
                                kSecPaddingPKCS1,
                                dataToEncrypt,
                                subsise,
                                CipherBuffer,
                                & cipherBufferSize
                                );

         [acumulatedEncryptedData appendBytes: cipherBuffer length: cipherBufferSize];
     }

     if (publicKey) CFRelease (publicKey);

     libre (cipherBuffer);

     return accumulatedEncryptedData;
 }

De la documentation:

plainTextLen
Longitud en bytes de los datos en el buffer de PlainText. Esto debe ser menor o igual que el valor devuelto por la function SecKeyGetBlockSize. Cuando se realiza el relleno PKCS1, la longitud máxima de los datos que se pueden cifrar es 11 bytes less que el valor devuelto por la function SecKeyGetBlockSize (secKeyGetBlockSize () – 11).

(el énfasis es mío)

Estás usando el relleno PKCS1. Entonces, si el tamaño del bloque es 256, solo puede cifrar hasta 245 bytes a la vez.