mirror of
https://github.com/IT4Change/gradido.git
synced 2025-12-13 07:45:54 +00:00
integrity test example
This commit is contained in:
parent
be295d3fe1
commit
ce16c54897
86
database/integrity/0013-test.ts.keep
Normal file
86
database/integrity/0013-test.ts.keep
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
/* MIGRATION TO CLEAN PRODUCTION DATA
|
||||||
|
*
|
||||||
|
* the way the passphrases are stored in login_user_backups is inconsistent.
|
||||||
|
* we need to try to detect which word list was used and transform it accordingly
|
||||||
|
*/
|
||||||
|
|
||||||
|
import fs from 'fs'
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||||
|
const sodium = require('sodium-native')
|
||||||
|
|
||||||
|
const PHRASE_WORD_COUNT = 24
|
||||||
|
const WORDS = fs
|
||||||
|
.readFileSync('src/config/mnemonic.uncompressed_buffer13116.txt')
|
||||||
|
.toString()
|
||||||
|
.split(',')
|
||||||
|
|
||||||
|
const KeyPairEd25519Create = (passphrase: string[]): Buffer[] => {
|
||||||
|
if (!passphrase.length || passphrase.length < PHRASE_WORD_COUNT) {
|
||||||
|
throw new Error('passphrase empty or to short')
|
||||||
|
}
|
||||||
|
|
||||||
|
const state = Buffer.alloc(sodium.crypto_hash_sha512_STATEBYTES)
|
||||||
|
sodium.crypto_hash_sha512_init(state)
|
||||||
|
|
||||||
|
for (let i = 0; i < PHRASE_WORD_COUNT; i++) {
|
||||||
|
const value = Buffer.alloc(8)
|
||||||
|
const wordIndex = WORDS.indexOf(passphrase[i])
|
||||||
|
value.writeBigInt64LE(BigInt(wordIndex))
|
||||||
|
sodium.crypto_hash_sha512_update(state, value)
|
||||||
|
}
|
||||||
|
// trailing space is part of the login_server implementation
|
||||||
|
const clearPassphrase = passphrase.slice(0, PHRASE_WORD_COUNT).join(' ') + ' '
|
||||||
|
sodium.crypto_hash_sha512_update(state, Buffer.from(clearPassphrase))
|
||||||
|
const outputHashBuffer = Buffer.alloc(sodium.crypto_hash_sha512_BYTES)
|
||||||
|
sodium.crypto_hash_sha512_final(state, outputHashBuffer)
|
||||||
|
|
||||||
|
const pubKey = Buffer.alloc(sodium.crypto_sign_PUBLICKEYBYTES)
|
||||||
|
const privKey = Buffer.alloc(sodium.crypto_sign_SECRETKEYBYTES)
|
||||||
|
|
||||||
|
sodium.crypto_sign_seed_keypair(
|
||||||
|
pubKey,
|
||||||
|
privKey,
|
||||||
|
outputHashBuffer.slice(0, sodium.crypto_sign_SEEDBYTES),
|
||||||
|
)
|
||||||
|
|
||||||
|
return [pubKey, privKey]
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function upgrade(queryFn: (query: string, values?: any[]) => Promise<Array<any>>) {
|
||||||
|
// Delete data with no reference in login_users table
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
// 663 affected rows
|
||||||
|
const userBackups = await queryFn(
|
||||||
|
`SELECT passphrase, LOWER(HEX(pubkey)) as pubkey, user_id
|
||||||
|
FROM login_user_backups
|
||||||
|
LEFT JOIN login_users ON login_user_backups.user_id = login_users.id
|
||||||
|
WHERE user_id=1503`,
|
||||||
|
// WHERE pubkey is not null`, // todo fix this condition and regenerate
|
||||||
|
)
|
||||||
|
let i = 0
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
userBackups.forEach(async (userBackup) => {
|
||||||
|
const passphrase = userBackup.passphrase.split(' ')
|
||||||
|
const keyPair = KeyPairEd25519Create(passphrase)
|
||||||
|
if (keyPair[0].toString('hex') !== userBackup.pubkey) {
|
||||||
|
i++
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.log(
|
||||||
|
'Missmatch Pubkey',
|
||||||
|
i,
|
||||||
|
userBackup.user_id,
|
||||||
|
`"${userBackup.passphrase}"`,
|
||||||
|
`"${keyPair[0].toString('hex')}`,
|
||||||
|
`"${userBackup.pubkey}"`,
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
// console.log('SUCCESS: ', `"${keyPair[0].toString('hex')}`, `"${userBackup.pubkey}"`)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function downgrade(queryFn: (query: string, values?: any[]) => Promise<Array<any>>) {
|
||||||
|
return [] // cannot transform things back
|
||||||
|
}
|
||||||
5
database/integrity/README.md
Normal file
5
database/integrity/README.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
This is a test to find if all passphrases evaluate to the saved public key.
|
||||||
|
|
||||||
|
You need `yarn add sodium-native` in order to make it work.
|
||||||
|
|
||||||
|
This could be the start of database integrity tests in oder to evaluate the correctness of the database
|
||||||
Loading…
x
Reference in New Issue
Block a user