feat: add verify message support for LDK Node backend
This commit is contained in:
@@ -591,6 +591,7 @@ export default class CLNRest {
|
||||
supportsPeers = () => true;
|
||||
supportsMessageSigning = () => true;
|
||||
supportsMessageVerification = () => true;
|
||||
requiresVerifyPubkey = () => false;
|
||||
supportsAddressMessageSigning = () => false;
|
||||
supportsLnurlAuth = () => true;
|
||||
supportsOnchainBalance = () => true;
|
||||
|
||||
@@ -421,6 +421,7 @@ export default class EmbeddedLND extends LND {
|
||||
supportsPeers = () => true;
|
||||
supportsMessageSigning = () => true;
|
||||
supportsMessageVerification = () => true;
|
||||
requiresVerifyPubkey = () => false;
|
||||
supportsAddressMessageSigning = () => true;
|
||||
supportsLnurlAuth = () => true;
|
||||
supportsOnchainBalance = () => true;
|
||||
|
||||
@@ -1702,10 +1702,12 @@ export default class EmbeddedLdkNode {
|
||||
return { signature };
|
||||
};
|
||||
|
||||
verifyMessage = async (data: { msg: string; signature: string }) => {
|
||||
const { msg, signature } = data;
|
||||
// Get the node's public key to verify against
|
||||
const pubkey = await LdkNode.node.nodeId();
|
||||
verifyMessage = async (data: {
|
||||
msg: string;
|
||||
signature: string;
|
||||
pubkey: string;
|
||||
}) => {
|
||||
const { msg, signature, pubkey } = data;
|
||||
const valid = await LdkNode.signing.verifySignature({
|
||||
message: msg,
|
||||
signature,
|
||||
@@ -1948,7 +1950,8 @@ export default class EmbeddedLdkNode {
|
||||
// ========================================================================
|
||||
|
||||
supportsMessageSigning = () => true;
|
||||
supportsMessageVerification = () => false;
|
||||
supportsMessageVerification = () => true;
|
||||
requiresVerifyPubkey = () => true;
|
||||
supportsLnurlAuth = () => true;
|
||||
supportsOnchainBalance = () => true;
|
||||
supportsOnchainSends = () => true;
|
||||
|
||||
@@ -872,6 +872,7 @@ export default class LND {
|
||||
supportsPeers = () => true;
|
||||
supportsMessageSigning = () => true;
|
||||
supportsMessageVerification = () => true;
|
||||
requiresVerifyPubkey = () => false;
|
||||
supportsLnurlAuth = () => true;
|
||||
supportsOnchainBalance = () => true;
|
||||
supportsOnchainSends = () => true;
|
||||
|
||||
@@ -709,6 +709,7 @@ export default class LightningNodeConnect {
|
||||
supportsPeers = () => true;
|
||||
supportsMessageSigning = () => this.permSignMessage;
|
||||
supportsMessageVerification = () => true;
|
||||
requiresVerifyPubkey = () => false;
|
||||
supportsAddressMessageSigning = () => true;
|
||||
supportsLnurlAuth = () => true;
|
||||
supportsOnchainBalance = () => true;
|
||||
|
||||
@@ -1026,6 +1026,8 @@
|
||||
"views.Settings.SignMessage.noAddressForVerification": "No address provided for on-chain verification",
|
||||
"views.Settings.SignMessage.noDataReceived": "No data received from sign operation",
|
||||
"views.Settings.SignMessage.signOperationFailed": "Sign operation not supported",
|
||||
"views.Settings.SignMessage.pubkeyToVerify": "Pubkey of signer",
|
||||
"views.Settings.SignMessage.pleaseEnterPubkey": "Please enter the pubkey of the signer",
|
||||
"views.Settings.SignMessage.verificationOperationFailed": "Verification operation not supported",
|
||||
"views.Settings.Language.title": "Language",
|
||||
"views.Settings.Currency.title": "Currency",
|
||||
|
||||
@@ -7,6 +7,7 @@ interface VerificationRequest {
|
||||
msg: string;
|
||||
signature: string;
|
||||
addr?: string;
|
||||
pubkey?: string;
|
||||
}
|
||||
|
||||
export default class MessageSignStore {
|
||||
@@ -233,7 +234,8 @@ export default class MessageSignStore {
|
||||
this.signingMode === 'lightning'
|
||||
? BackendUtils.verifyMessage({
|
||||
msg: data.msg,
|
||||
signature: data.signature
|
||||
signature: data.signature,
|
||||
pubkey: data.pubkey
|
||||
})
|
||||
: BackendUtils.verifyMessageWithAddr(
|
||||
data.msg,
|
||||
|
||||
@@ -191,6 +191,7 @@ class BackendUtils {
|
||||
supportsMessageSigning = () => this.call('supportsMessageSigning');
|
||||
supportsMessageVerification = () =>
|
||||
this.call('supportsMessageVerification');
|
||||
requiresVerifyPubkey = () => this.call('requiresVerifyPubkey');
|
||||
supportsLnurlAuth = () => this.call('supportsLnurlAuth');
|
||||
supportsOnchainBalance = () => this.call('supportsOnchainBalance');
|
||||
supportsOnchainSends = () => this.call('supportsOnchainSends');
|
||||
|
||||
@@ -40,12 +40,14 @@ interface SignVerifyMessageState {
|
||||
messageToSign: string;
|
||||
messageToVerify: string;
|
||||
signatureToVerify: string;
|
||||
pubkeyToVerify: string;
|
||||
selectedIndex: number;
|
||||
signingMethodIndex: number;
|
||||
selectedAddress: string;
|
||||
signingMode: string;
|
||||
supportsAddressMessageSigning: boolean;
|
||||
supportsMessageVerification: boolean;
|
||||
requiresVerifyPubkey: boolean;
|
||||
loading: boolean;
|
||||
}
|
||||
|
||||
@@ -61,12 +63,14 @@ export default class SignVerifyMessage extends React.Component<
|
||||
messageToSign: '',
|
||||
messageToVerify: '',
|
||||
signatureToVerify: '',
|
||||
pubkeyToVerify: '',
|
||||
selectedIndex: 0,
|
||||
signingMethodIndex: 0,
|
||||
selectedAddress: '',
|
||||
signingMode: 'lightning',
|
||||
supportsAddressMessageSigning: false,
|
||||
supportsMessageVerification: true,
|
||||
requiresVerifyPubkey: false,
|
||||
loading: false
|
||||
};
|
||||
|
||||
@@ -93,6 +97,10 @@ export default class SignVerifyMessage extends React.Component<
|
||||
this.setState({ supportsMessageVerification: false });
|
||||
}
|
||||
|
||||
if (BackendUtils.requiresVerifyPubkey()) {
|
||||
this.setState({ requiresVerifyPubkey: true });
|
||||
}
|
||||
|
||||
this.handleRouteParams(route?.params || {});
|
||||
};
|
||||
|
||||
@@ -225,6 +233,7 @@ export default class SignVerifyMessage extends React.Component<
|
||||
messageToSign: '',
|
||||
messageToVerify: '',
|
||||
signatureToVerify: '',
|
||||
pubkeyToVerify: '',
|
||||
selectedAddress: ''
|
||||
});
|
||||
|
||||
@@ -609,7 +618,7 @@ export default class SignVerifyMessage extends React.Component<
|
||||
'views.Settings.SignMessage.success'
|
||||
)}
|
||||
/>
|
||||
{pubkey && (
|
||||
{pubkey && !this.state.requiresVerifyPubkey && (
|
||||
<View style={styles.copyBoxContainer}>
|
||||
<CopyBox
|
||||
heading={localeString(
|
||||
@@ -674,10 +683,12 @@ export default class SignVerifyMessage extends React.Component<
|
||||
const {
|
||||
messageToVerify,
|
||||
signatureToVerify,
|
||||
pubkeyToVerify,
|
||||
selectedAddress,
|
||||
signingMode
|
||||
signingMode,
|
||||
requiresVerifyPubkey,
|
||||
supportsAddressMessageSigning
|
||||
} = this.state;
|
||||
const { supportsAddressMessageSigning } = this.state;
|
||||
|
||||
if (!messageToVerify || messageToVerify.trim() === '') {
|
||||
Alert.alert(
|
||||
@@ -695,6 +706,16 @@ export default class SignVerifyMessage extends React.Component<
|
||||
return false;
|
||||
}
|
||||
|
||||
if (
|
||||
requiresVerifyPubkey &&
|
||||
(!pubkeyToVerify || pubkeyToVerify.trim() === '')
|
||||
) {
|
||||
Alert.alert(
|
||||
localeString('views.Settings.SignMessage.pleaseEnterPubkey')
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (
|
||||
supportsAddressMessageSigning &&
|
||||
signingMode === 'onchain' &&
|
||||
@@ -863,6 +884,8 @@ export default class SignVerifyMessage extends React.Component<
|
||||
text
|
||||
);
|
||||
}}
|
||||
autoCorrect={false}
|
||||
autoCapitalize="none"
|
||||
multiline
|
||||
style={{
|
||||
height: 100
|
||||
@@ -881,7 +904,7 @@ export default class SignVerifyMessage extends React.Component<
|
||||
}}
|
||||
onPress={() => {
|
||||
if (this.validateSigningInput()) {
|
||||
signMessage(messageToSign);
|
||||
signMessage(messageToSign.trim());
|
||||
}
|
||||
}}
|
||||
/>
|
||||
@@ -938,6 +961,8 @@ export default class SignVerifyMessage extends React.Component<
|
||||
);
|
||||
}}
|
||||
locked={loading}
|
||||
autoCorrect={false}
|
||||
autoCapitalize="none"
|
||||
multiline
|
||||
style={{
|
||||
height: 100
|
||||
@@ -964,6 +989,8 @@ export default class SignVerifyMessage extends React.Component<
|
||||
text
|
||||
);
|
||||
}}
|
||||
autoCorrect={false}
|
||||
autoCapitalize="none"
|
||||
multiline
|
||||
style={{
|
||||
height: 100
|
||||
@@ -972,6 +999,33 @@ export default class SignVerifyMessage extends React.Component<
|
||||
/>
|
||||
</View>
|
||||
|
||||
{this.state.requiresVerifyPubkey && (
|
||||
<View style={styles.form}>
|
||||
<Text
|
||||
style={{
|
||||
...styles.text,
|
||||
color: themeColor('secondaryText')
|
||||
}}
|
||||
>
|
||||
{localeString(
|
||||
'views.Settings.SignMessage.pubkeyToVerify'
|
||||
)}
|
||||
</Text>
|
||||
<TextInput
|
||||
value={this.state.pubkeyToVerify}
|
||||
onChangeText={(text: string) => {
|
||||
this.handleTextInputChange(
|
||||
'pubkeyToVerify',
|
||||
text
|
||||
);
|
||||
}}
|
||||
autoCorrect={false}
|
||||
autoCapitalize="none"
|
||||
locked={loading}
|
||||
/>
|
||||
</View>
|
||||
)}
|
||||
|
||||
{this.renderVerificationResult()}
|
||||
|
||||
<View style={styles.button}>
|
||||
@@ -1010,6 +1064,7 @@ export default class SignVerifyMessage extends React.Component<
|
||||
const {
|
||||
messageToVerify,
|
||||
signatureToVerify,
|
||||
pubkeyToVerify,
|
||||
selectedAddress,
|
||||
signingMode
|
||||
} = this.state;
|
||||
@@ -1021,8 +1076,9 @@ export default class SignVerifyMessage extends React.Component<
|
||||
const { supportsAddressMessageSigning } = this.state;
|
||||
|
||||
const verifyRequest = {
|
||||
msg: messageToVerify,
|
||||
signature: signatureToVerify,
|
||||
msg: messageToVerify.trim(),
|
||||
signature: signatureToVerify.trim(),
|
||||
pubkey: pubkeyToVerify.trim() || undefined,
|
||||
addr:
|
||||
supportsAddressMessageSigning && signingMode === 'onchain'
|
||||
? selectedAddress
|
||||
|
||||
Reference in New Issue
Block a user