登录 OS X,验证 iOS 和 OSStatus -9809

2024-01-29

我正在使用苹果的安全框架 https://developer.apple.com/library/mac/documentation/Security/Reference/SecurityFrameworkReference/。我能够在 OS X 上签名并成功验证所有内容,但是当我尝试使用SecKeyRawVerify在 iOS 上,它失败并出现 -9809 错误。

我尝试过各种 PKCS 填充选项和许多其他属性,但我无法正确验证它。

请注意,下面的代码可能到处都有泄漏,只是尝试首先使其正常运行。

OS X 签名代码:

NSData* signData(NSData* plainData, SecKeyRef privateKey) {
    CFErrorRef error;

    /* Create the transform objects */
    SecTransformRef signer = SecSignTransformCreate(privateKey, &error);
    if (error) { CFShow(error); exit(-1); }                                    

    /* Explicitly set padding type (necessary?) */
    SecTransformSetAttribute(signer,
                             kSecPaddingKey,
                             kSecPaddingPKCS1Key,
                             &error);
    if (error) { CFShow(error); exit(-1); }

    /* Specify digest type */
    SecTransformSetAttribute(signer,
                             kSecDigestTypeAttribute,
                             kSecDigestSHA1,
                             &error);
    if (error) { CFShow(error); exit(-1); }

    /* OS X calculates SHA1 hash/signature for us */
    SecTransformSetAttribute(signer,
                             kSecTransformInputAttributeName,
                             plainData,
                             &error);
    if (error) { CFShow(error); exit(-1); }

    CFTypeRef signature = SecTransformExecute(signer, &error);
    if (error || !signature) { CFShow(error); exit(-1); }

    CFRelease(signer);

    return signature;
}

和iOS验证码:

+ (NSData *)verifyData:(NSData *)data
              usingKey:(SecKeyRef)publicKey {
    size_t signatureByteLength = SecKeyGetBlockSize(publicKey);

    if (signatureByteLength > data.length)
    {
        NSLog(@"Signature length is greater that data length.");
        return nil;
    }

    NSData *signature = [data subdataWithRange:NSMakeRange(0, signatureByteLength)];
    NSData *plainData = [data subdataWithRange:NSMakeRange(signatureByteLength, data.length - signatureByteLength)];

    NSLog(@"signatureLength='%lu', signatureBytes='%@', plainDataLength=%lu", (unsigned long)signature.length, signature, (unsigned long)plainData.length);

    size_t hashByteLength = CC_SHA1_DIGEST_LENGTH;
    uint8_t* hashBytes = (uint8_t *)malloc(hashByteLength);

    if (CC_SHA1([plainData bytes], (CC_LONG)[plainData length], hashBytes))
    {
       NSData *b = [NSData dataWithBytes:hashBytes length:hashByteLength];
       NSLog(@"hashBytesLength='%lu', hashBytes=%@", (unsigned long)b.length, b);

        OSStatus status = SecKeyRawVerify(publicKey,
                                  kSecPaddingPKCS1SHA1, // I have also tried kSecPaddingPKCS1, doesn't work
                                  hashBytes,
                                  hashByteLength,
                                  (uint8_t *)[signature bytes],
                                  signatureByteLength);

        switch (status)
        {
            case errSecSuccess:
                NSLog(@"SecKeyRawVerify success.");
                return plainData;

            case errSSLCrypto:
               NSLog(@"SecKeyRawVerify failed: underlying cryptographic error");
               break;

            case errSecParam:
               NSLog(@"SecKeyRawVerify failed: one or more parameters passed to a function where not valid.");
               break;

            default:
               NSLog(@"SecKeyRawVerify failed: error code '%d'", (int)status);
               break;
       }
    }
   return nil;
}

我使用以下 OpenSSL 命令通过命令行创建了私钥和公钥:

1.    // Generate private and public key pair
openssl genrsa -out rsaPrivate.pem 1024

1a. // Generate public key
openssl rsa -in rsaPrivate.pem -pubout -outform PEM -out rsaPublic.pem

2. //Create a certificate signing request with the private key
openssl req -new -key rsaPrivate.pem -out rsaCertReq.csr

3. //Create a self-signed certificate with the private key and signing request
openssl x509 -req -days 3650 -in rsaCertReq.csr -signkey rsaPrivate.pem -out rsaCert.crt

4. //Convert the certificate to DER format: the certificate contains the public key
openssl x509 -outform der -in rsaCert.crt -out rsaCert.der

任何帮助是极大的赞赏。


我想通了这个问题。我发布的代码是正确的,但填充需要设置为kSecPaddingPKCS1SHA1根据SecKey.h头文件:

If you are verifying a proper PKCS1-style signature, with DER encoding
of the digest type - and the signedData is a SHA1 digest - use
kSecPaddingPKCS1SHA1.

另外,您可能想确保您的公钥位于.der格式是正确的:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

登录 OS X,验证 iOS 和 OSStatus -9809 的相关文章

  • 从 HTTPS 重定向到 HTTP 的安全问题?

    我在一些博客上读过 抱歉没有提及参考资料 但我找不到了 如果您将用户从 https 页面重定向到 http 页面 您将失去保护网站安全的所有工作 那么 有人可以向我解释一下在以下情况下我是对还是错 在登录页面上使用 https 然后使用 h
  • 无法将 admob 与 firebase iOS/Android 项目链接

    我有两个帐户 A 和 B A 是在 Firebase 上托管 iOS Android unity 手机游戏的主帐户 B 用于将 admob 集成到 iOS Android 手机游戏中 我在尝试将 admob 分析链接到 Firebase 项
  • 如何在 Swift 3 中解析 JSON 数组 [重复]

    这个问题在这里已经有答案了 我从 Socket 获取了一些我想访问的数据 但收到错误消息 指出每次都无法将 NSArray 转换为 NSDictionary struct SocketEventHandler let event Strin
  • 这个错误是无效上下文0x0吗?

    我在ViewDidLoad中编写了以下代码 Implement viewDidLoad to do additional setup after loading the view typically from a nib void view
  • 自动布局、UIDynamics 和动画

    我对自动布局还很陌生 并且对如何为视图设置动画感到困惑 我读了很多 我知道你必须遵守限制 编辑它 然后包装layoutIfNeeded in an UIView动画块 但当真正要做的时候 我却有点失落 我很乐意有人能向我解释如何做这个动画
  • 暂停视频录制[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试创建一个应用程序 用户可以在其中从相机录制视频 该应用程序的功能之一必须是文件录制中的暂停 例如 用户通过按 开始 按钮开始
  • 如何检测Retina高清显示屏?

    UIScreen有一个新的 nativeScaleiOS 8 中的属性 但文档没有提及它 property nonatomic readonly CGFloat nativeScale 还有一个scale属性 但文档说它是 2 用于视网膜显
  • UICollectionView 未出现

    我正在尝试设置UICollectionView 以编程方式在我的视图控制器中扩展UIViewController 由于某种原因 我的收藏视图根本没有显示 以下是我所拥有的 为什么没有出现 我将它连接到委托和数据源并将其添加为子视图self
  • 当所选选项是下拉列表中已选择的选项时如何接收事件?

    动机 我想动态加载一个select使用来自 AJAX 调用的值 并允许用户select加载后列表中的第一项after它获得焦点 现在 第一项是selected项目 当您单击下拉列表并单击第一项时 什么也没有发生 我无法添加任何无效选择的占位
  • 为什么我的 tableView 函数运行了 3 次?

    我有一个 UITableView 并且有执行它所需的方法之一 func tableView tableView UITableView numberOfRowsInSection section Int gt Int println sec
  • 如何使用 Swift 获取 YouTube 频道的所有播放列表?

    我的问题不是关于从一般频道检索视频 我只想获取该频道创建的所有 播放列表 并检索每个播放列表的缩略图 标题和视频数量 这是一个 YouTube 频道示例 正如您所看到的 有很多已创建的播放列表 截至目前 我只能获取某个频道最新上传的视频 在
  • 线程 1:信号 SIGABRT - AppDelegate.h

    main m Journey Created by Julian Buscema on 2014 07 13 Copyright c 2014 Julian Buscema All rights reserved import
  • FireMonkey iOS RAD Studio XE2 - 在从 URL 加载的表单上显示图像

    是否可以将 TImage 放置在 iOS 的 FMX 表单上 并将图像 jpg 从 URL 加载到此 TImage 中以在 iOS 应用程序中显示 我尝试过但没有成功 任何正确方向的提示或指出都会受到赞赏 将 TButton TImageC
  • PrepareForSegue之谜

    我在两个不同的 VC 中有一个prepareForSegue 方法 一个使用一个if声明 而另一个旨在使用switch 除了名称之外 代码几乎相同 这个效果很好 void prepareForSegue UIStoryboardSegue
  • 应用程序传输安全已禁用,但仍然出现 SSL 握手错误

    我在通过 HTTPS SSL 连接到 API 时遇到问题 我已经使用下面的字典完全禁用了应用程序传输安全性 ATS 尽管 SSL 证书通过了 NSCURL 的所有测试
  • 如何将音乐从我的应用程序切换到 iPod

    我在用MusicPlayerController我的应用程序中的对象来播放音乐 我知道当 iPhone ipod 应用程序终止时 可以继续播放我的应用程序音乐 我该怎么做 这涉及到一些事情 您必须在两种音乐播放器之间进行选择 应用程序音乐播
  • 在 Instruments 中查找内存泄漏行

    我是 iOS 中的仪器新手 我正在尝试使用 Xcode 4 5 2 并按照本教程查找仪器中的内存泄漏 http soulwithmobiletechnology blogspot sg 2011 04 how to check memory
  • 对使用phonegap和钛的质疑[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 最近我听说了 PhoneGap 和 Titanium 移动网络应用程序的开发 我分析了这两个 Web 应用程序 并了解了如何使用它们以
  • XCode 4.2.1 在 Lion 10.7.2 上启动时崩溃

    这周我买了大约 10 年来的第一台 Mac 是的 这是一台二手 Mac Pro 2x2GHz 双核 Xeon 2GB RAM 它全新安装了 Mac OS X Lion 10 7 2 我只安装了 OmniOutlner Pro Textmat
  • KeyboardAvoidingView - 隐藏键盘时重置高度

    我正在使用 React NativeKeyboardAvoidingView设置我的高度View当显示键盘时 但是当我关闭应用程序中的键盘时 视图的高度不会变回原来的值

随机推荐

  • 使用嵌套数组合并两个字典

    我有 2 本词典 a I 1 2 II 1 2 III 1 2 b I 3 4 II 3 4 IV 3 4 我怎样才能合并它们以获得以下结果 c merge dicts a b 其中 c 是 I 1 2 3 4 II 1 2 3 4 III
  • 抽象和概括有什么区别?

    我理解抽象就是把更具体的东西变得更抽象 该东西可能是数据结构或过程 例如 数据抽象 矩形是正方形的抽象 它集中于正方形有两对相对边的事实 而忽略了正方形的相邻边相等的事实 程序抽象 高阶函数map是一个过程的抽象 该过程对值列表执行某些操作
  • 在 Glass GDK 沉浸式应用程序中打开活动时如何使屏幕变亮?

    我有一个 GDK 沉浸式应用程序 其中启动器Activity获得一个SCREEN DIM WAKE LOCK WakeLock 该应用程序还有一个服务 它将接收聊天消息并启动Intent for an Activity显示每一个 每当消息A
  • HTML5 输入类型=日期:我可以使用 JavaScript 打开/关闭日期选择器吗?

    我正在尝试自定义 HTML5 输入 type date 元素 我想添加一个单独的按钮 单击该按钮将切换日期选择器下拉列表的可见性 我找不到任何这方面的信息 非常感谢任何帮助 这是我使用 CSS 制作的解决方案 webkit box sizi
  • 如何检查某个字是否被 PHP 保留?

    有没有一些函数可以检查一个单词是否是reserved http www php net manual en reserved keywords php在 PHP 中还是我可以自己使用它 我可以手动检查它 只需使用它并查看错误或警告 但我需要
  • 从 XSD 生成 Go 结构

    最近打算用Go做一个项目 我的问题是 给定一个 XSD 文件 如何在 Go 中自动生成结构来表示 XML 元素 它类似于使用 xjc 从 XSD 生成 java 类 那么Go中有没有任何工具或包可以做到这一点呢 提前致谢 看起来它可能需要一
  • 从外部连接到 docker 容器中的 Postgresql

    我在 Docker 容器的服务器上有 Postgresql 如何从外部 即我的本地计算机 连接到它 我应该应用什么设置来允许这样做 您可以通过这种方式运行 Postgres 映射端口 docker run name some postgre
  • 将 java 系统属性传递给 ant 测试

    我让 ant 使用以下代码执行 jar
  • 轮播引导程序中的拉伸图像

    我正在使用 Bootstrap 4 那里有一个带有图片的轮播 图像一直显示拉伸 不知道出了什么问题 carousel margin bottom 4rem position relative carousel caption bottom
  • 在非常大的树上执行 DFS 的最佳方法是什么?

    情况是这样的 应用世界由数十万个状态组成 给定一个状态 我可以计算出一组 3 或 4 个其他可到达的状态 一个简单的递归可以构建一个状态树 它会变得非常大且非常快 我需要从根状态到该树中的特定深度执行 DFS 以搜索包含 最小 状态的子树
  • Dalvik 和 Android 工具链可以带来哪些优化?

    我正在开发一个高性能 Android 应用程序 一款游戏 虽然我首先尝试编写代码以提高可读性 但我喜欢在脑海中保留一幅幕后发生的事情的图片 通过 C 我对编译器能为我做什么和不能做什么有了相当好的直觉 我正在尝试为 Java Android
  • 使用 std::vector 调用 std::lock ()

    我想将以下代码替换为std lock for mutex m mutexes m gt lock 无论如何我可以调用std lock 在那些给定的互斥体上std vector
  • 如何在 ActiveSupport::TestCase 中存根方法

    In RSpec我可以像这样存根方法 allow company to receive foo 300 我怎样才能存根一个方法ActiveSupport TestCase 我有一个这样的测试 class CompanyTest lt Act
  • 对文件中所有奇数行求和的 Pythonic 方法

    我正在学习 Python 以便参加研究生院的编程分班测试 这实际上是我为了感受它而编写的第一个小脚本 我的背景主要是C 和PHP 但是我在测试中不能使用任何一种语言 我的测试脚本读取以下文本文件 test file1 txt 偶数行包含样本
  • 应该如何创建一个可能抛出异常的 akka actor?

    我正在将一个项目从 scala Actor 迁移到 Akka Actor 我曾经有过类似的情况 如果某个系统资源不可用 MyActor 的构造函数可能会抛出异常 var myActor MyActor null try myActor ne
  • 如何制作基本的 FullCalendar 自定义视图

    下面的代码来自 FullCalendar 的自定义视图 https fullcalendar io docs views Custom Views 文档 这似乎是一个很好的开始 但是对于像我这样的新手来说 拥有一些呈现最简单的自定义视图 带
  • 仅将最后一个 shell 命令的标准输出放入 Python 变量中[重复]

    这个问题在这里已经有答案了 prova sh 包含 bin bash echo Output that I don t want echo Output that I don t want echo Output that I don t
  • java.text.ParseException:使用 Clock.systemUTC() 时出现无法解析的日期错误[重复]

    这个问题在这里已经有答案了 我在解析日期时遇到解析错误 java text ParseException 无法解析的日期 2021 06 17T05 49 41 174Z 无法解析的日期 2021 06 17T05 49 41 174Z 我
  • 使用 dgtsv_ 或 sgtsv_ 求解 A*X = B 类型的方程

    我正在尝试求解 SWIFT 中的 A X B 类型的线性方程组 我已经能够使用基于 LU 分解的算法来做到这一点 该算法消耗 O N 2 内存 由于我的数组通常很大 10000 个样本或更多 因此我正在研究 LAPACK 它具有一些特定于三
  • 登录 OS X,验证 iOS 和 OSStatus -9809

    我正在使用苹果的安全框架 https developer apple com library mac documentation Security Reference SecurityFrameworkReference 我能够在 OS X