Я решил проблему, хотя я не уверен, почему.
Что я сделал, так это отключил библиотеку CryptoExportImportManager и вручную создаю ключевые данные, например:
unsigned char _encodedECOID[] = {
0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86,
0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a,
0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03,
0x42, 0x00
};
NSMutableData *data = [NSMutableData new];
[data appendBytes:_encodedECOID length:sizeof(_encodedECOID)];
[data appendData:keyBits]; // keyBits is od NSData type
Теперь сервер Java правильно создает открытый ключ из моей строки (base64, закодированный из data
).
Однако, посмотрев на исходный код CryptoExportImportManager, способ, которым он создает закодированную строку из моих битов ключа, выглядит так (в Swift):
let curveOIDHeader: [UInt8] = [0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86,
0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A,
0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07, 0x03,
0x42, 0x00]
let curveOIDHeaderLen: Int = 26
var data = Data(bytes: curveOIDHeader, count: curveOIDHeaderLen)
data.append(rawPublicKeyBytes)
Это в основном то же самое. Так в чем же разница?
Теперь единственное, что приходит на ум, - это разница в том, как хранится заголовок - в моем случае это массив unsigned char
, в случае библиотеки это массив UInt8
.
Согласно этот ответ , C
типы unsigned char
и uint8_t
не эквивалентны, они гарантированно имеют только одинаковую длину, но могут различаться, т. Е. В порядке байтов.
Хотя этот вопрос не имел ничего общего с UInt8
Swift (но был помечен C
, из которых Objective-C является надмножеством), документация типа UInt8 Swift ничего не говорит о его отношении к unsigned char
type, это единственное разумное объяснение, которое я вижу.