Signing and Signature Verification (ArkTS)
This topic provides signing and signature verification development cases with the following algorithms:
For details about the scenarios and supported algorithm specifications, see Signature and Signature Verification Overview and Algorithm Specifications.
How to Develop
Signing
-
Obtain keyUri as resourceId and the key alias by calling the certificate selection API provided by the certificate management system, open the resource, and complete the PIN authentication.
-
Specify the plaintext to be signed.
-
Obtain the property parameter HuksOptions, which contains the properties and inData fields. inData indicates the plaintext data, and properties indicates the algorithm parameter configuration.
-
Call initSession to initialize a key session and obtain the session handle.
-
Use finishSession to finish the key session and obtain a signature.
Signature verification
-
Obtain keyUri as resourceId and the key alias by calling the certificate selection API provided by the certificate management system, and open the resource.
-
Obtain the signature to be verified.
-
Obtain the property parameter HuksOptions, which contains the properties and inData fields. inData indicates the signature, and properties indicates the algorithm parameter configuration.
-
Call initSession to initialize a key session and obtain the session handle.
-
Call updateSession to update the key session.
-
Call finishSession to finish the key session and verify the signature.
Development Cases
RSA/SHA256/PSS
/*
* The key algorithm RSA, digest algorithm SHA-256, and padding mode PSS are used.
*/
import { huks } from '@kit.UniversalKeystoreKit';
import { BusinessError } from '@kit.BasicServicesKit';
let handle: number;
let plaintext = '123456';
let signature: Uint8Array;
function StringToUint8Array(str: string) {
let arr: number[] = [];
for (let i = 0, j = str.length; i < j; ++i) {
arr.push(str.charCodeAt(i));
}
return new Uint8Array(arr);
}
function Uint8ArrayToString(fileData: Uint8Array) {
let dataString = '';
for (let i = 0; i < fileData.length; i++) {
dataString += String.fromCharCode(fileData[i]);
}
return dataString;
}
function GetRsaSignProperties() {
let properties: Array<huks.HuksParam> = [{
tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
value: huks.HuksKeyAlg.HUKS_ALG_RSA
}, {
tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
value: huks.HuksKeySize.HUKS_RSA_KEY_SIZE_2048
}, {
tag: huks.HuksTag.HUKS_TAG_PADDING,
value: huks.HuksKeyPadding.HUKS_PADDING_PSS
}, {
tag: huks.HuksTag.HUKS_TAG_DIGEST,
value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256
}, {
tag: huks.HuksTag.HUKS_TAG_PURPOSE,
value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_SIGN
}, {
tag: huks.HuksTag.HUKS_TAG_KEY_CLASS,
value: huks.HuksKeyClassType.HUKS_KEY_CLASS_EXTENSION
}];
return properties;
}
function GetRsaVerifyProperties() {
let properties: Array<huks.HuksParam> = [{
tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
value: huks.HuksKeyAlg.HUKS_ALG_RSA
}, {
tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
value: huks.HuksKeySize.HUKS_RSA_KEY_SIZE_2048
}, {
tag: huks.HuksTag.HUKS_TAG_PADDING,
value: huks.HuksKeyPadding.HUKS_PADDING_PSS
}, {
tag: huks.HuksTag.HUKS_TAG_DIGEST,
value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256
}, {
tag: huks.HuksTag.HUKS_TAG_PURPOSE,
value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_VERIFY
}, {
tag: huks.HuksTag.HUKS_TAG_KEY_CLASS,
value: huks.HuksKeyClassType.HUKS_KEY_CLASS_EXTENSION
}];
return properties;
}
async function initSession(keyAlias: string, huksOptions: huks.HuksOptions) {
console.info(`promise: enter initSession`);
try {
await huks.initSession(keyAlias, huksOptions)
.then((data) => {
handle = data.handle;
console.info(`promise: initSession success`);
}).catch((error: BusinessError) => {
console.error(`promise: initSession failed, errCode : ${error.code}, errMsg : ${error.message}`);
})
} catch (error) {
console.error(`promise: initSession input arg invalid`);
}
}
async function updateSession(handle: number, huksOptions: huks.HuksOptions) {
console.info(`promise: enter updateSession`);
try {
await huks.updateSession(handle, huksOptions)
.then((data) => {
let outData = data.outData as Uint8Array;
console.info(`promise: updateSession success, data = ${Uint8ArrayToString(outData)}`);
}).catch((error: BusinessError) => {
console.error(`promise: updateSession failed, errCode : ${error.code}, errMsg : ${error.message}`);
})
} catch (error) {
console.error(`promise: updateSession input arg invalid`);
}
}
async function finishSession(handle: number, huksOptions: huks.HuksOptions) {
console.info(`promise: enter finishSession`);
try {
await huks.finishSession(handle, huksOptions)
.then((data) => {
signature = data.outData as Uint8Array;
console.info(`promise: finishSession success, data = ${Uint8ArrayToString(signature)}`);
}).catch((error: BusinessError) => {
console.error(`promise: finishSession failed, errCode : ${error.code}, errMsg : ${error.message}`);
})
} catch (error) {
console.error(`promise: finishSession input arg invalid`);
}
}
async function Sign(keyAlias: string, plaintext: string) {
console.info(`enter Sign`);
let signProperties = GetRsaSignProperties();
let options: huks.HuksOptions = {
properties: signProperties,
}
await initSession(keyAlias, options);
if (handle !== undefined) {
options.inData = StringToUint8Array(plaintext);
await finishSession(handle, options);
}
}
async function Verify(keyAlias: string, plaintext: string, signature: Uint8Array) {
console.info(`enter Verify`);
let verifyProperties = GetRsaVerifyProperties();
let options: huks.HuksOptions = {
properties: verifyProperties,
}
await initSession(keyAlias, options);
if (handle !== undefined) {
options.inData = StringToUint8Array(plaintext);
await updateSession(handle, options);
options.inData = signature;
await finishSession(handle, options);
}
}
async function testSignVerify() {
// Assume that **keyAlias** is the value of **resourceId** obtained.
let keyAlias = JSON.stringify({
providerName: "testProviderName",
bundleName: "com.example.cryptoapplication",
abilityName: "CryptoExtension",
index: {
key: "testKey"
} as ESObject
});
await Sign(keyAlias, plaintext);
await Verify(keyAlias, plaintext, signature);
}
你可能感兴趣的鸿蒙文章
openharmony 鸿蒙 huks-key-import-overview
openharmony 鸿蒙 huks-signing-signature-verification-arkts
openharmony 鸿蒙 huks-hmac-arkts
openharmony 鸿蒙 huks-key-agreement-overview
openharmony 鸿蒙 huks-as-user-sys
openharmony 鸿蒙 huks-delete-key-ndk