# Password Utilities

The **Password Manager SDK** provides utility methods to help generate strong passwords and calculate the strength of a password.

## Generating Passwords

Help users adopt strong passwords by using the `generatePassword` method. Passwords are generated from a criteria of five different input options; `length`, `allowUpperCase`, `allowLowercase`, `allowNumbers`, and `allowSymbols`. By default, the generator will generate passwords of 20 characters, but will not allow a user to generate a password that is less than six characters. If all options are marked false, the password generator will apply *all* options, the same as if all options had been marked true, resulting in at least one character from each option.

{% tabs %}
{% tab title="TypeScript" %}

```typescript
// Generate a password
const password = client.generatePassword({
    length: 20, // defaults to 20
    allowUppercase: true,
    allowLowercase: true,
    allowNumbers: true,
    allowSymbols: true,
})
```

{% endtab %}

{% tab title="Swift" %}

```swift
// Generate a password
let password = generatePassword(
                length: 20, // defaults to 20
                allowUppercase: true, 
                allowLowercase: true, 
                allowNumbers: true, 
                allowSymbols: true
                )
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
// Generate a password
val password = generatePassword(
    length = 20, // length defaults to 20
    allowUppercase = true,
    allowLowercase = true,
    allowNumbers = true, 
    allowSymbols = true
)
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
General criteria applied for generating passwords:

* Password length (>5)
* Uppercase (A-Z)
* Lowercase (a-z)
* Numbers (0-9)
* Symbols (! ? @ \* . \_ -)
  {% endhint %}

## Calculating a Password's Strength

Use the `calculateStrengthOfPassword` method to measure the strength of the user's password. A strength level from an enum containing five strength levels (`VeryWeak`, `Weak`, `Moderate`, `Strong`, `VeryStrong`) will be returned after measuring the password. The criteria is based on how easy the password is to guess. A `VeryWeak` result means the password is risky and too guessable while a `VeryStrong` result it is extremely difficult to guess and has strong protection from offline slow-hash attacks. Use this method to rate current passwords and encourage user's to adopt stronger passwords.

{% tabs %}
{% tab title="TypeScript" %}

```typescript
// Calculate strength of password
const strength = client.calculateStrengthOfPassword(password) // returns a `PasswordStrength`.

// PasswordStrength enum
enum PasswordStrength {
    case VeryWeak
    case Weak
    case Moderate
    case Strong
    case VeryStrong
}
```

{% endtab %}

{% tab title="Swift" %}

```swift
// Calculate strength of password
let strength = calculateStrength(of: password) // returns a `PasswordStrength`

// PasswordStrength enum
public enum PasswordStrength {
    case veryWeak
    case weak
    case moderate
    case strong
    case veryStrong
}
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
// Calculate strength of password
val strength = calculateStrengthOfPassword(password) // returns a `PasswordStrength`
when (strength) {
    PasswordStrength.VeryWeak,
    PasswordStrength.Weak -> println("Please choose a stronger password")
    else -> {}
}

// PasswordStrength enum
enum class PasswordStrength {
    VeryWeak,
    Weak,
    Moderate,
    Strong,
    VeryStrong,
}
```

{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.sudoplatform.com/guides/password-manager/password-utilities.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
