Преобразуйте подпись ASN. 1 в подпись IEEE P1363

#ios #swift #signature #crypto #xcode11.5

Вопрос:

Я действительно сгенерировал подпись, используя приведенный ниже код, но мне нужна подпись в формате IEEE P1336 (длина 80)

            guard let signData = SecKeyCreateSignature(
               key,
               SecKeyAlgorithm.ecdsaSignatureMessageX962SHA256,
               signatureString.data(using: .utf8)! as CFData, amp;error) else {
               let e = error!.takeRetainedValue() as Error

               print("Signing Error (  e.localizedDescription)")
               return nil
           }
           let signedData = signData as Data
           let signedString = signedData.base64EncodedString(options: [])
 

Ответ №1:

Я не эксперт в iOS. Но я исправил эту проблему для подписи, сгенерированной iOS. Вы можете создать этот формат самостоятельно. например, для хэшированной подписи SHA-256. Пример JavaScript

 function parseASN1ToIEEEP1363(signature) {
    const buffer = new ArrayBuffer(signature.length);
    const int8View = new Int8Array(buffer);
    for (let i = 0, strLen = signature.length; i < strLen; i  ) {
      int8View[i] = signature.charCodeAt(i);
    }
    //Currently these bytes getting for SHA256. for other hashings need to make it dynamic
    const r = new Int8Array(buffer.slice(4, 36));
    const s = new Int8Array(buffer.slice(39));
    return appendBuffer(r, s);
}

function appendBuffer(buffer1, buffer2) {
  var tmp = new Uint8Array(buffer1.byteLength   buffer2.byteLength);
  tmp.set(new Uint8Array(buffer1), 0);
  tmp.set(new Uint8Array(buffer2), buffer1.byteLength);
  return tmp;
};