|
| 1 | +// |
| 2 | +// GMSm2Bio.h |
| 3 | +// GMObjC_Example |
| 4 | +// |
| 5 | +// Created by lifei on 2021/4/24. |
| 6 | +// Copyright © 2021 lifei. All rights reserved. |
| 7 | +/** |
| 8 | + * SM2 密钥类文件 IO 操作,PEM/DER/CER/PKCS#12 等格式公私钥读取或创建 |
| 9 | + */ |
| 10 | + |
| 11 | +#import <Foundation/Foundation.h> |
| 12 | + |
| 13 | +NS_ASSUME_NONNULL_BEGIN |
| 14 | + |
| 15 | +// 读取的证书信息 |
| 16 | +@interface GMSm2X509Info : NSObject |
| 17 | + |
| 18 | +@property (nullable, nonatomic, copy) NSString *version; // 证书的版本号 |
| 19 | +@property (nullable, nonatomic, copy) NSString *publicKey; // 公钥(HEX 格式) |
| 20 | +@property (nullable, nonatomic, copy) NSString *privateKey; // 私钥(HEX 格式,PKCS#12格式可能包含) |
| 21 | +@property (nullable, nonatomic, copy) NSString *effectiveDate; // 生效日期,日期格式(UTC时间) yyyyMMddHHmmss |
| 22 | +@property (nullable, nonatomic, copy) NSString *expirationDate; // 失效日期,日期格式(UTC时间) yyyyMMddHHmmss |
| 23 | +@property (nullable, nonatomic, copy) NSString *serialNumber; // 证书的序列号 |
| 24 | +@property (nullable, nonatomic, copy) NSString *signature; // 签名算法的值 |
| 25 | +@property (nullable, nonatomic, copy) NSString *signatureAlgorithm; // 签名算法类型 |
| 26 | +@property (nullable, nonatomic, copy) NSString *sha1Fingerprint; // 指纹(SHA-1) |
| 27 | +@property (nullable, nonatomic, copy) NSString *sha256Fingerprint; // 指纹(SHA-256) |
| 28 | + |
| 29 | +@property (nullable, nonatomic, copy) NSString *country; // 证书的国家代码 |
| 30 | +@property (nullable, nonatomic, copy) NSString *commonName; // 证书的通用名称 |
| 31 | +@property (nullable, nonatomic, copy) NSString *organization; // 证书的组织名称 |
| 32 | +@property (nullable, nonatomic, copy) NSString *organizationalUnit; // 证书的组织单位名称 |
| 33 | + |
| 34 | +@property (nullable, nonatomic, copy) NSString *issuerCountry; // 颁发机构的国家代码 |
| 35 | +@property (nullable, nonatomic, copy) NSString *issuerCommonName; // 颁发机构的通用名称 |
| 36 | +@property (nullable, nonatomic, copy) NSString *issuerOrganization; // 颁发机构的组织名称 |
| 37 | +@property (nullable, nonatomic, copy) NSString *issuerOrganizationalUnit; // 颁发机构的组织单位名称 |
| 38 | + |
| 39 | +@end |
| 40 | + |
| 41 | +// 生成的PEM/DER格式公私钥文件路径 |
| 42 | +@interface GMSm2KeyFiles : NSObject |
| 43 | + |
| 44 | +@property (nullable, nonatomic, copy) NSString *publicKeyPath; |
| 45 | +@property (nullable, nonatomic, copy) NSString *privateKeyPath; |
| 46 | + |
| 47 | +@end |
| 48 | + |
| 49 | +@interface GMSm2Bio : NSObject |
| 50 | + |
| 51 | +// MARK: - 读取PEM格式秘钥 |
| 52 | +/// 从 PEM 文件中读取 SM2 公钥,返回 HEX 格式公钥 |
| 53 | +/// @param pemData PEM 格式公钥数据 |
| 54 | +/// @param pwdData PEM 格式证书密码,无密码时传入 nil |
| 55 | ++ (nullable NSString *)readPublicKeyFromPemData:(NSData *)pemData password:(nullable NSData *)pwdData; |
| 56 | + |
| 57 | +/// 从 PEM 文件中读取 SM2 私钥,返回 HEX 格式私钥 |
| 58 | +/// @param pemData PEM 格式私钥数据 |
| 59 | +/// @param pwdData PEM 格式证书密码,无密码时传入 nil |
| 60 | ++ (nullable NSString *)readPrivateKeyFromPemData:(NSData *)pemData password:(nullable NSData *)pwdData; |
| 61 | + |
| 62 | +// MARK: - 读取DER格式秘钥 |
| 63 | +/// 从 DER 文件中读取 SM2 公钥,返回 HEX 格式公钥 |
| 64 | +/// @param derData DER 格式公钥数据 |
| 65 | ++ (nullable NSString *)readPublicKeyFromDerData:(NSData *)derData; |
| 66 | + |
| 67 | +/// 从 DER 文件中读取 SM2 私钥,返回 HEX 格式私钥 |
| 68 | +/// @param derData DER 格式私钥数据 |
| 69 | ++ (nullable NSString *)readPrivateKeyFromDerData:(NSData *)derData; |
| 70 | + |
| 71 | +// MARK: - 写入PEM/DER格式文件 |
| 72 | +/// 将公钥/私钥写入PEM文件,返回YES成功,NO失败 |
| 73 | +/// @param publicHex 04 开头的公钥,privateHex 私钥( 皆为HEX 编码格式) |
| 74 | +/// @param filePath PEM文件存储路径 |
| 75 | ++ (BOOL)savePublicKey:(NSString *)publicHex toPemFileAtPath:(NSString *)filePath; |
| 76 | ++ (BOOL)savePrivateKey:(NSString *)privateHex toPemFileAtPath:(NSString *)filePath; |
| 77 | + |
| 78 | +/// 将公钥/私钥写入DER文件,返回YES成功,NO失败 |
| 79 | +/// @param publicHex 04 开头的公钥,privateHex 私钥( 皆为HEX 编码格式) |
| 80 | +/// @param filePath DER文件存储路径 |
| 81 | ++ (BOOL)savePublicKey:(NSString *)publicHex toDerFileAtPath:(NSString *)filePath; |
| 82 | ++ (BOOL)savePrivateKey:(NSString *)privateHex toDerFileAtPath:(NSString *)filePath; |
| 83 | + |
| 84 | +// MARK: - PEM & DER 字符互转 |
| 85 | +/// 将 PEM 格式公私钥转换为 DER 格式 |
| 86 | +/// @param pemData PEM格式密钥数据 |
| 87 | +/// @param isPublicKey 标记 derData 是公钥/私钥,YES为公钥,NO为私钥 |
| 88 | ++ (nullable NSData *)convertPemToDer:(NSData *)pemData isPublicKey:(BOOL)isPublicKey; |
| 89 | + |
| 90 | +/// 将 DER 格式公私钥转换为 PEM 格式 |
| 91 | +/// @param derData DER格式密钥数据 |
| 92 | +/// @param isPublicKey 标记 derData 是公钥/私钥,YES为公钥,NO为私钥 |
| 93 | ++ (nullable NSData *)convertDerToPem:(NSData *)derData isPublicKey:(BOOL)isPublicKey; |
| 94 | + |
| 95 | +// MARK: - 读取证书 |
| 96 | +/// 从证书文件中读取证书信息,读取的公私钥可能非 SM2 密钥信息(可能是 RSA) |
| 97 | +/// @param cerData 证书文件数据 |
| 98 | +/// @param pwdData 证书密码,默认为空 |
| 99 | ++ (nullable GMSm2X509Info *)readX509InfoFromData:(NSData *)cerData password:(nullable NSData *)pwdData; |
| 100 | + |
| 101 | +// MARK: - 创建PEM/DER格式公私钥 |
| 102 | +/// 创建 PEM 格式 SM2 公私钥,默认保存tmp文件夹下。 |
| 103 | +/// 返回值:数组元素 1 为公钥sm2-pub.pem/.der路径,2 为私钥sm2-pri.pem/.der路径 |
| 104 | ++ (GMSm2KeyFiles *)generatePemKeyFiles; |
| 105 | ++ (GMSm2KeyFiles *)generateDerKeyFiles; |
| 106 | + |
| 107 | +@end |
| 108 | + |
| 109 | +NS_ASSUME_NONNULL_END |
0 commit comments