Приведение NSString к неподписанному символу * - PullRequest
1 голос
/ 19 февраля 2009

Я пытаюсь использовать функцию со следующей подписью для подписи HTTP-запроса:

extern void hmac_sha1(const unsigned char *inText, int inTextLength, unsigned char* inKey, const unsigned int inKeyLength, unsigned char *outDigest);

И вот метод, который я написал, чтобы использовать его:

- (NSString *)sign: (NSString *)stringToSign {
    NSString *secretKey = @"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    const unsigned char *inText = (unsigned char *)[stringToSign UTF8String];
    int inTextLength = [stringToSign length];
    unsigned char *inKey = (unsigned char *)[secretKey UTF8String];
    const unsigned int inKeyLength = (unsigned int)[secretKey length];
    unsigned char *outDigest;

    hmac_sha1(inText, inTextLength, inKey, inKeyLength, outDigest);
    NSString *output = [NSString stringWithUTF8String:(const char *)outDigest];

    return output;
}

Проблема в том, что я уверен, что это не тот способ, которым я должен выполнять это приведение, поскольку внутри этой функции hmac_sha1 я получаю исключение EXC_BAD_ACCESS.

Поскольку я новичок в Objective-C и почти не имею опыта в C (удивительно!), Я не знаю, что искать. Любые советы о том, как я могу начать решать эту проблему?

Заранее спасибо!

Кстати, я получил ссылку на эту функцию здесь в stackoverflow .

Ответы [ 3 ]

3 голосов
/ 19 февраля 2009

Похоже, проблема не в кастинге, а в outDigest. Пятый аргумент hmac_sha1 должен указывать на уже выделенный буфер размером 20 байт (я думаю).

Если вы измените строку с надписью

unsigned char *outDigest;

сказать

#define HMACSHA1_DIGEST_SIZE 20
void *outDigest = malloc(HMACSHA1_DIGEST_SIZE);

Это должно помочь вам преодолеть крушение внутри hmac_sha1.

Тогда у вас возникла проблема с преобразованием данных на outDigest в NSString. Похоже, что hmac_sha1 поместит 20 байтов случайных данных в outDigest, а не строку UTF-8 с нулевым символом в конце, поэтому stringWithUTF8String: не будет работать. Возможно, вы захотите использовать что-то вроде этого, если вам нужно вернуть NSString:

NSString *output = [[NSString alloc] initWithBytesNoCopy:outDigest
                                     length:HMACSHA1_DIGEST_SIZE
                                     encoding:NSASCIIStringEncoding
                                     freeWhenDone:YES];

Я не думаю, что NSString действительно правильный тип для дайджеста, поэтому, возможно, стоит изменить ваш метод, чтобы он возвращал NSData, если можете.

2 голосов
/ 19 февраля 2009

Это не было частью вашего вопроса, но, тем не менее, это ошибка, вы не должны использовать -length для получения количества байтов строки UTF8. Этот метод возвращает количество символов Unicode в строке, а не количество байтов. То, что вы хотите, это -lengthOfBytesUsingEncoding:.

NSUInteger byteCount = [stringToSign lengthOfBytesUsingEncoding:NSUTF8StringEncoding];

Также помните, что результат не учитывает завершающий символ NULL.

1 голос
/ 19 февраля 2009

Вы уверены, что вам не нужно выделять память для outDigest перед вызовом hmac_sha1? Поскольку вы передаете указатель, а не указатель на указатель, память никак не может быть выделена внутри подпрограммы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...